使用DECRYPT_MODE的RSA / ECB / PKCS1Padding

时间:2013-09-25 08:05:24

标签: encryption hash rsa sha1 pkcs#1

我正在尝试使用公钥解密字符串以与哈希进行比较。代码是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

2 个答案:

答案 0 :(得分:5)

这就是PKCS1 Padding。 该算法将pkcs填充附加到您的明文数据(即您的哈希),以防止基于重复加密的纯文本数据的某些攻击。这是一种随机化输入数据的方法。如果使用相同的密钥重新加密相同的哈希,您将获得不同的pkcs头数据(当然还有不同的密码块)。显然,pkcs填充具有固定长度,因此您可以将其剥离以获取原始纯文本。

答案 1 :(得分:4)

您不应使用Cipher来创建或验证签名。相反,您应该使用Signature.getInstance("SHA1withRSA")

签名方案和加密方案不同,它们不一定相互兼容。对于初学者,他们使用不同的填充方法,这些填充方法是算法安全性的一部分。

即使您可以使用Cipher进行签名验证,您也可能无法完全验证签名,而且您的自制签名验证方案可能(并且可能会)失败正在使用Cipher的不同实现。

上面的代码看起来像用于加密的PKCS#1 v1.5填充,所以它可能不正确。