2

我有这个问题我正在尝试使用此代码对字符串进行两次加密:

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 上的文件中)所以我想将真实密码与用户输入的密码进行比较登录页面

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

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

谢谢

4

2 回答 2

2

PKCS#1 填充用于确保相同的纯文本不会加密为相同的密文。PKCS#1 是一种最佳非对称加密填充形式,在 wikipedia 上有描述。对于相同的纯文本具有不同的密文是一件好事。

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

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

于 2012-11-14T00:07:39.113 回答
1

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

于 2012-11-13T23:40:49.237 回答