我正在尝试使用公钥解密字符串以与哈希进行比较。代码是followig
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
不明白如何添加这些额外的东西以及为什么。
有人可以对此有所了解吗?
由于
PREM
答案 0 :(得分:5)
这就是PKCS1 Padding。 该算法将pkcs填充附加到您的明文数据(即您的哈希),以防止基于重复加密的纯文本数据的某些攻击。这是一种随机化输入数据的方法。如果使用相同的密钥重新加密相同的哈希,您将获得不同的pkcs头数据(当然还有不同的密码块)。显然,pkcs填充具有固定长度,因此您可以将其剥离以获取原始纯文本。
答案 1 :(得分:4)
您不应使用Cipher
来创建或验证签名。相反,您应该使用Signature.getInstance("SHA1withRSA")
。
签名方案和加密方案不同,它们不一定相互兼容。对于初学者,他们使用不同的填充方法,这些填充方法是算法安全性的一部分。
即使您可以使用Cipher进行签名验证,您也可能无法完全验证签名,而且您的自制签名验证方案可能(并且可能会)失败正在使用Cipher
的不同实现。
上面的代码看起来像用于加密的PKCS#1 v1.5填充,所以它可能不正确。