RSA / ECB / NoPadding解密返回空字符

时间:2018-09-21 11:26:38

标签: java rsa

我正在使用RSA算法对字符串进行加密,并且加密和解密逻辑是

create

结果很好。但是,如果我再次加密相同的字符串,我将获得不同的加密值。

为此,我使用“ RSA / ECB / NoPadding”密码而不是“ RSA”,那么如果我多次加密一个字符串,我将获得相同的加密值。 但是当我解密时,reuslt字符串包含一些空字符

示例
输入:abcd 输出:abcd \ u0000 \ u0000 \ u0000 \ u0000 ....

我如何解决此问题?如果我们多次加密,获得相同加密值的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

  

结果很好。但是,如果我再次加密相同的字符串,我将获得不同的加密值。

那是正确的,它甚至是RSA加密的必需属性。默认情况下,使用PKCS1.5填充(RSA / ECB / PKCS1Padding),其中包含一些随机字节。更安全的选项是RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING模式,它更加随机。

  

为此,我使用“ RSA / ECB / NoPadding”密码而不是“ RSA”,那么如果我多次加密一个字符串,我将获得相同的加密值。但是当我解密时,reuslt字符串包含一些空字符

使用没有填充(NoPadding)的RSA是非常不安全的(被称为textbook RSA)。

填充将原始加密值扩展到整个空间长度(例如2048位),然后将执行RSA magic(取幂)。使用NoPadding参数,您将告诉加密库自己进行填充。在这种情况下,您应该在解密后删除填充(对于您的情况是零填充)

我希望您这样做是出于学习/学术目的,而不是出于某些实际的安全项目。您可以看看我的blog about encryption以获得一些示例。

btw:您不应该使用RSA来加密纯文本本身。而是使用对称加密来加密纯文本,然后使用RSA来加密对称加密密钥。