7

openssl 形式の秘密鍵を正常に読み取る関数があります。

static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName)
{
    AsymmetricCipherKeyPair keyPair;

    using (var reader = File.OpenText(privateKeyFileName))
        keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();

    return keyPair.Private;
}

暗号化されたテキストを復号化するために使用される AsymmetricKeyParameter を返します。

以下は復号化コードです。

public static byte[] Decrypt3(byte[] data, string pemFilename)
{
    string result = "";
    try {
        AsymmetricKeyParameter key = readPrivateKey(pemFilename);

        RsaEngine e = new RsaEngine();

        e.Init(false, key);
        //byte[] cipheredBytes = GetBytes(encryptedMsg);

        //Debug.Log (encryptedMsg);

        byte[] cipheredBytes = e.ProcessBlock(data, 0, data.Length);
        //result = Encoding.UTF8.GetString(cipheredBytes);
        //return result;
        return cipheredBytes;

    } catch (Exception e) {
        Debug.Log ("Exception in Decrypt3: " + e.Message);
        return GetBytes(e.Message);
    }
}

これらは弾む城のライブラリを使用して C# で動作し、正しい復号化されたテキストを取得します。ただし、これを Java に追加すると、PEMParser.readObject() は AsymmetricCipherKeyPair ではなくタイプ PEMKeyPair のオブジェクトを返し、Java はそれをキャストしようとして例外をスローします。C# にチェックインしたところ、実際には AsymmetricCipherKeyPair が返されています。

Java の動作が異なる理由はわかりませんが、このオブジェクトをキャストする方法や秘密鍵ファイルを読み取って正常に復号化する方法を誰かが助けてくれることを願っています。C# と Java コードの両方で同じ公開鍵ファイルと秘密鍵ファイルを使用したので、エラーはそれらからのものではないと思います。

私が秘密鍵を読んでいる方法のJavaバージョンを参照してください:

public static String readPrivateKey3(String pemFilename) throws FileNotFoundException, IOException
{
    AsymmetricCipherKeyPair keyParam = null;
    AsymmetricKeyParameter keyPair = null;
    PEMKeyPair kp = null;
    //PrivateKeyInfo pi = null;

    try {
        //var fileStream = System.IO.File.OpenText(pemFilename);
        String absolutePath = "";
        absolutePath = Encryption.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        absolutePath = absolutePath.substring(0, (absolutePath.lastIndexOf("/")+1));
        String filePath = "";
        filePath = absolutePath + pemFilename;

        File f = new File(filePath);
        //return filePath;

        FileReader fileReader  = new FileReader(f);
        PEMParser r = new PEMParser(fileReader);

        keyParam = (AsymmetricCipherKeyPair) r.readObject();

        return keyParam.toString();

    }
    catch (Exception e) {
        return "hello: " + e.getMessage() + e.getLocalizedMessage() + e.toString();
        //return e.toString();
        //return pi;
    }
}
4

1 に答える 1

5

Java コードは新しい API に更新されましたが、これはまだ C# に移植されていません。同等の (ただし現在は推奨されていない) Java PEMReader クラスを試すことができます。ただし、JCE KeyPair を返します (変更の理由の一部は、元のバージョンが BC 軽量クラスではなく JCE タイプでのみ機能したためです)。

PEMParser を使用して PEMKeyPair を取得する場合は、org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair を使用して JCE キーペアを取得できます。BCPEMKeyConverter があれば理想的ですが、まだ作成されていないようです。いずれにせよ、AsymmetricCipherKeyPair を作成するのは簡単なはずです。

PEMKeyPair kp = ...;
AsymmetricKeyParameter privKey = PrivateKeyFactory.createKey(kp.getPrivateKeyInfo());
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(kp.getPublicKeyInfo());
new AsymmetricCipherKeyPair(pubKey, privKey);

これらのファクトリ クラスは org.bouncycastle.crypto.util パッケージにあります。

于 2013-04-05T09:19:21.373 に答える