上次博主发现使用上一版本代码,加密数据不确定性,这个问题博主找到了,可以看到博主待加密值是一串Hash值,这个hash值是从SHA256运算得到的结果,所以Hash值的长度是32字节。
因此使用加密函数的API,一定会需要输入待加密的数据长度,该长度为32字节。按照rsa算法的特性,明文长度有以下几种分类。
明文长度 = 实际明文长度+填充值
只要用到填充就会产生以下几种方式:NoPPadding、OAEPPadding、PKCS1Padding
只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。
RSA加密常用的填充方式有下面3种:
- 1.RSA_PKCS1_PADDING 填充模式,最常用的模式
- 输入:必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11
- 2.RSA_PKCS1_OAEP_PADDING,新应用推荐使用,最安全
- 输入:RSA_size(rsa) – 41
- 3.RSA_NO_PADDING 不填充,不安全。
- 输入:可以和RSA钥模长一样长,如果输入的明文过长,必须切割, 然后填充
因此实际可加密的明文长度为0<实际明文长度<秘钥长度。
博主上一个代码中,使用填充RSA_PKCS1_PADDING,将原本32字节长度的明文扩充到秘钥长度256字节,所以每次得到的加密值不同,针对这个博主将待加密明文扩成256字节,这次加密的密文就固定了。