Перенос кода Java с шифрованием RSA на C#

Я пытаюсь перенести следующий код 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);
}

На данный момент мне удалось написать на C# следующее, используя библиотеку BouncyCastle для .NET:

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);
    }

Однако эти два метода производят разные результаты, даже если вызываются с теми же параметрами. В целях тестирования я использую следующий открытый ключ RSA:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLCZahTj/oz8mL6xsIfnX399Gt6bh8rDHx2ItTMjUhQrE/9kGznP5PVP19vFkQjHhcBBJ0Xi1C1wPWMKMfBsnCPwKTF/g4yga6yw26awEy4rvfjTCuFUsrShSPOz9OxwJ4t0ZIjuKxTRCDVUO7d/GZh2r7lx4zJCxACuHci0DvTQIDAQAB

Не могли бы вы помочь мне успешно перенести код Java или предложить альтернативу для получения того же результата на C#?

EDIT1: вывод в Java отличается каждый раз, когда я запускаю программу. Я не думаю, что было указано какое-либо дополнение, поэтому я не понимаю, что делает вывод случайным.

EDIT2: Java использует PKCS1 по умолчанию, поэтому было достаточно указать его в инициализации шифра C#, чтобы получить тот же тип шифрования (хотя и не тот же результат, что не имело значения в этот момент).

6
задан user1098567 15 June 2012 в 09:12
поделиться