【问题标题】:RSA/ECB/PKCS1Padding with DECRYPT_MODE带有 DECRYPT_MODE 的 RSA/ECB/PKCS1Padding
【发布时间】:2013-09-30 17:21:40
【问题描述】:

我正在尝试使用公钥解密字符串以与哈希进行比较。代码如下

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

不明白这个额外的东西是如何添加的以及为什么添加。

请有人对此有所了解吗?

谢谢

前置

【问题讨论】:

    标签: encryption hash rsa sha1 pkcs#1


    【解决方案1】:

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

    【讨论】:

    • 感谢 g_g。它是 20 字节左右的摘要信息填充(模拟信息)。
    • 我试过了,但似乎我需要 15 岁以上的声誉才能做到这一点 :( ...一旦我得到它,我就会这样做
    【解决方案2】:

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

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

    即使您可以使用 Cipher 进行签名验证,也有可能您还没有完全验证签名,如果采用不同的实现,您自制的签名验证方案可能(并且可能会)失败的Cipher 正在使用中。

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

    【讨论】:

    • 知道了。谢谢 owlstead。这是一个非标准的签名部分。我将尝试使用 Signature 类对其进行标准化。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多