【发布时间】:2011-01-21 11:34:27
【问题描述】:
我在使用 RSA 公钥加密时遇到了问题。以下是重现该问题的示例 JUnit 代码:
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 加密,那么为什么我没有收到异常?
我必须做什么才能获得可重复的结果?
附:我的 JDK 是 1.6.0_22,在 Ubuntu 10.10 机器上运行。
【问题讨论】:
-
P.S.我使用了 BouncyCastle 提供程序,现在我的测试成功了。
-
测试成功是一个非常糟糕的信号,因为 RSA 加密应该是随机的。必须将 OEAP 填充与 RSA 加密一起使用。教科书 RSA 和 PKCS#1 v1.5 填充都不安全。
标签: java cryptography rsa