У меня возникли проблемы с шифрованием открытым ключом RSA. Вот пример кода JUnit, который воспроизводит проблему:Java RSA Encryption не повторяется?
public class CryptoTests {
private static KeyPair keys;
@BeforeClass
public static void init() throws NoSuchAlgorithmException{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = CryptoUtils.getSecureRandom();
keyGen.initialize(2176, random);
keys = keyGen.generateKeyPair();
}
@Test
public void testRepeatabilityPlainRSAPublic() throws EdrmCryptoException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException{
byte[] plaintext = new byte [10];
Random r = new Random();
r.nextBytes(plaintext);
Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, keys.getPublic());
byte[] encrypted1 = rsa.doFinal(plaintext);
rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, keys.getPublic());
byte[] encrypted2 = rsa.doFinal(plaintext);
rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, keys.getPublic());
byte[] encrypted3 = rsa.doFinal(plaintext);
assertArrayEquals(encrypted1, encrypted2);
assertArrayEquals(encrypted1, encrypted3);
}
}
В результате? Утверждение терпит неудачу.
Почему такое поведение наблюдается здесь? Насколько я помню из своих криптографических классов, любой ключ может использоваться для шифрования. Но это не то, что здесь происходит. Я тестировал то же самое с закрытым ключом, и получаю повторяемый вывод.
Если по какой-либо причине шифрование RSA с открытым ключом запрещено, то почему я не получаю исключение?
Что я должен сделать, чтобы получить повторяющиеся результаты?
P.S. Мой JDK - 1.6.0_22, работающий на Ubuntu 10.10.
P.S. Я использовал провайдера BouncyCastle, и мои тесты сейчас успешны. – malaverdiere
Этот тест является действительно плохим знаком, поскольку шифрование RSA * должно быть рандомизировано. Очень важно использовать дополнение OEAP с шифрованием RSA. Ни одно учебное приложение RSA и PKCS # 1 v1.5 не защищено. – CodesInChaos