Java RSA两次获得相同的代码

Java RSA两次获得相同的代码,java,rsa,Java,Rsa,我有这个问题 我尝试使用以下代码对字符串加密两次: KeySpec keySpec = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray()); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key decodedPublicKey = keyFactory.generatePublic(keySpec); Cipher cipher = Cipher.

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

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());
两者都使用相同的
公钥
,并使用相同的输入
z
,但两个代码块中的每一个都创建了不同的字节数组(
a1!=a2
) 我希望它是平等的,但我不知道如何做到这一点(试图查找它,但无法找到答案)

如果有人能帮助我,我将不胜感激

谢谢

编辑:

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

我有一个客户端和一个服务器,当有人连接到客户端时,我想确认他的密码(他的加密密码在安卓SD卡上的一个文件中),因此我想将真实密码与用户在登录页面中输入的密码进行比较

我在客户端没有私钥,因此无法解密设备上已经存在的加密密码,因此我尝试比较加密密码(我认为与现在知道的密码相同)

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


谢谢

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

PKCS#1填充用于确保相同的纯文本不会加密为相同的密码文本。PKCS#1是一种优化的非对称加密填充形式。对同一个纯文本使用不同的密码文本是一件好事

如果你想毁掉一个好的密码,你可以指定“NoPadding”而不是“PCKS1Padding”。这样做的缺点是,填充还负责指定消息的长度。使用“NoPadding”,您将发现,当您解密密码文本时,您的消息的前缀将包含大量的零字节


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

为什么希望它们相等?在处理加密时,这听起来不是一件好事。您的最后一行代码不应该使用
cipher2
而不是
cipher