Encryption RSA/ECB/PKCS1P加解密_模式

Encryption RSA/ECB/PKCS1P加解密_模式,encryption,hash,rsa,sha1,pkcs#1,Encryption,Hash,Rsa,Sha1,Pkcs#1,我试图用公钥解密一个字符串,以与散列进行比较。代码如下 byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); return dectyptedText; 上面的代码生成如下字符串(base64encode) mcewcq

我试图用公钥解密一个字符串,以与散列进行比较。代码如下

byte[] dectyptedText = null;
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
dectyptedText = cipher.doFinal(text);
return dectyptedText;
上面的代码生成如下字符串(base64encode)

mcewcqyfkw4dahofaaqkzygfrvo2sv1f9bha3pds044=

哈希由以下代码生成

 byte[] key = stringToHash.getBytes();
 MessageDigest md = MessageDigest.getInstance("SHA-1");
 hash = md.digest(key);
上面的代码生成如下所示的示例哈希

y3qkZYgfRVo2Sv1F9bHa3pDs044=

如果您注意到两者都有正确的哈希值,即y3qkZYgfRVo2Sv1F9bHa3pDs044= 但是解密代码会生成并预先添加一个额外的mcewcqyfkw4dahofaaq

我不明白这个额外的东西是怎么添加的,为什么

有人能解释一下吗

谢谢

prem

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

您不应使用
密码
创建或验证签名。相反,您应该使用
Signature.getInstance(“SHA1withRSA”)

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

即使您可以使用密码进行签名验证,也有可能您尚未完全验证签名,如果使用不同的
密码
实现,您自制的签名验证方案可能(也可能会)失败


问题中的代码似乎使用PKCS#1 v1.5填充进行加密,而不是生成签名,因此可能不正确。

明白了。谢谢你。这是一个非标准签名部分。我将尝试使用Signature类对其进行标准化。谢谢。这是digestinfo填充(alog info)20字节左右。我试过了,但似乎我需要15+的声誉才能做到:(…一旦我得到了它,我就会这么做