6

次のJavaコードを同等のC#に移植しようとしています。

public static String encrypt(String value, String key) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    byte[] bytes = value.getBytes(Charset.forName("UTF-8"));
    X509EncodedKeySpec x509 = new X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(key));
    KeyFactory factory = KeyFactory.getInstance("RSA");
    PublicKey publicKey = factory.generatePublic(x509);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    bytes = cipher.doFinal(bytes);
    return DatatypeConverter.printBase64Binary(bytes);
}

これまでのところ、.NET用のBouncyCastleライブラリを使用して、C#で次のように記述できました。

public static string Encrypt(string value, string key)
    {
        var bytes = Encoding.UTF8.GetBytes(value);
        var publicKeyBytes = Convert.FromBase64String(key);
        var asymmetricKeyParameter = PublicKeyFactory.CreateKey(publicKeyBytes);
        var rsaKeyParameters = (RsaKeyParameters) asymmetricKeyParameter;
        var cipher = CipherUtilities.GetCipher("RSA");
        cipher.Init(true, rsaKeyParameters);
        var processBlock = cipher.DoFinal(bytes);
        return Convert.ToBase64String(processBlock);
    }

ただし、2つのメソッドは、同じパラメーターで呼び出された場合でも、異なる結果を生成します。テストの目的で、次の公開RSAキーを使用しています。

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLCZahTj/oz8mL6xsIfnX399Gt6bh8rDHx2ItTMjUhQrE/9kGznP5PVP19vFkQjHhcBBJ0Xi1C1wPWMKMfBsnCPwKTF/g4yga6yw26awEy4rvfjTCuFUsrShSPOz9OxwJ4t0ZIjuKxTRCDVUO7d/GZh2r7lx4zJCxACuHci0DvTQIDAQAB

Javaコードを正常に移植するのを手伝っていただけますか、またはC#で同じ結果を得る別の方法を提案してください。

EDIT1:Javaでの出力は、プログラムを実行するたびに異なります。パディングが指定されていないと思うので、何が出力をランダムにするのかわかりません。

EDIT2:JavaはデフォルトでPKCS1を使用するため、同じ暗号化タイプを取得するには、C#暗号初期化でPKCS1を指定するだけで十分でした(ただし、同じ結果ではなく、この時点では関係ありませんでした)。

4

1 に答える 1