Я пытаюсь порт следующий Java-код к C# эквивалент:Порт RSA шифрование кода 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, чтобы получить тот же тип шифрования (хотя и не тот же самый результат, который не имеет никакого значения в этой точке).
Больше просто интересно, но, несмотря на то, что они выплюнули разные ответы, дают ли они те же самые входы, когда вы их расшифровываете? –
Да, строки с расширением UTF8 являются одинаковыми и, по-видимому, являются модулем и показателем двух ключевых структур (PublicKey в Java, RsaKeyParameters в C#) идентичны. Я не пытаюсь расшифровать результаты, поскольку мне это не нужно, и программа не требует закрытого ключа. – user1098567
Duplicate? http://stackoverflow.com/questions/4758321/java-rsa-encryption-non-repeatable –