encryption - 使用 DECRYPT_MODE 的 RSA/ECB/PKCS1Padding

标签 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)

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/

相关文章:

c - mbedtls 中的解密是如何工作的?

c++ - GUID 和哈希表 - 如何使用它们?

java - Java 中的 HMAC_Whirlpool

c - RSA_public_crypt 返回 -1 并且无法解密,带填充的 RSA 2048 位用于加密和解密文件

encryption - .pem、.cer 和 .der 之间有什么区别?

带有 ECB 的 iOS 3DES 返回一半正确的数据

encryption - 在 JDK 1.4 API 中,如何加密用户在文本框中输入的用户密码?

c++ - 如何使用 Crypto++ 加密字节数组

c# - 生成唯一的 Base62 哈希值的最快代码

cryptography - 如何使用 RSA 加密为 Java Card 上的数字供电