我正在尝试使用公钥解密字符串以与哈希值进行比较。代码如下
byte[] dectyptedText = null;
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
return dectyptedText;
上面的代码生成了这样的字符串(base64encode)
MCEwCQYFKw4DAhoFAAQUy3qkZYgfRVo2Sv1F9bHa3pDs044=
哈希由以下代码生成
byte[] key = stringToHash.getBytes();
MessageDigest md = MessageDigest.getInstance("SHA-1");
hash = md.digest(key);
上面的代码生成如下所示的示例哈希
y3qkZYgfRVo2Sv1F9bHa3pDs044=
如果您注意到两者都有正确的哈希值,即 y3qkZYgfRVo2Sv1F9bHa3pDs044=
但是解密代码会生成并预先添加一个额外的MCEwCQYFKw4DAhoFAAQU
不明白这个额外的东西是如何添加的以及为什么。
有人可以解释一下吗?
谢谢
最佳答案
那是 PKCS1 填充。 该算法将 pkcs 填充附加到您的明文数据(即您的哈希),以防止某些基于重复加密纯文本数据的攻击。这是一种随机化输入数据的方法。如果您使用相同的 key 重新加密完全相同的散列,您将获得不同的 pkcs header 数据(当然还有不同的密码 block )。显然 pkcs 填充具有固定长度,因此您可以将其剥离以获取原始纯文本。
关于encryption - 使用 DECRYPT_MODE 的 RSA/ECB/PKCS1Padding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18999469/