Java RSA两次获得相同的代码

时间:2012-11-13 22:38:40

标签: java rsa

我有这个问题 我正在尝试使用以下代码加密字符串两次:

KeySpec keySpec = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key decodedPublicKey = keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, decodedPublicKey);     
byte a1[] = cipher.doFinal(z.getBytes());

KeySpec keySpec2 = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray());
KeyFactory keyFactory2 = KeyFactory.getInstance("RSA");
Key decodedPublicKey2 = keyFactory2.generatePublic(keySpec2);
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher2.init(Cipher.ENCRYPT_MODE, decodedPublicKey2);
byte a2[] = cipher.doFinal(z.getBytes());

两者都使用相同的publicKey和相同的输入z,但两个代码块中的每一个都创建了一个不同的字节数组(a1!=a2) 我希望它是平等的,但我不知道该怎么做(试着查一下,但还是找不到答案)。

如果有人能帮助我,我会非常感激。

由于

编辑:

好吧,我没有使用AES加密,因为我加密的数据非常小(只是一个密码)

我有一个客户端和一个服务器,当有人连接到客户端时,我想确认他的密码(他的加密密码是在android sdcard上的文件中)所以我想比较真实密码和用户密码已进入登录页面

我没有客户端上的私钥,所以我无法解密已经在设备上的加密密码,所以我试图比较加密密码(我认为这与我现在知道的密码相同是不是)

也许你知道我能做什么?如何比较密码和加密密码,我只有公钥

由于

2 个答案:

答案 0 :(得分:2)

PKCS#1填充用于确保相同的纯文本不会加密到相同的密文。 PKCS#1是最佳非对称加密填充的一种形式,described on wikipedia。为同一个纯文本提供不同的密文是一件好事。

如果你想破坏一个好的密码,你可以指定“NoPadding”而不是“PCKS1Padding”。这样做的缺点是填充还负责指定消息的长度。使用“NoPadding”,您会发现当您解密密文时,您的邮件已经成为大量零字节的前缀。

我还要评论这不是您使用RSA加密邮件的方式。 RSA仅适用于短数据。例如,1024位RSA密码只能加密117个字节。使用RSA加密消息的正确方法是生成一次性AES密码密钥,使用RSA加密AES密码密钥,使用AES加密消息。这允许您安全地发送任何长度的消息。

答案 1 :(得分:1)

您可能需要查看this question的最佳答案。简短版本是每次使用公钥加密时,生成的加密数据都会不同。如果使用私钥加密,则每次都会得到相同的结果。