RSASSA-PSS 在 openssl 中的实现

1、EMSA-PSS 编解码
      在 openssl 中对应于函数 RSA_padding_add_PKCS1_PSSRSA_verify_PKCS1_PSS
      RSA_padding_add_PKCS1_PSS 其实并不严格等于 EMSA-PSS 编码,区别是,前者不是传入的 m,而是 m 的 hash 值 mHash。即少了后者的1、2步(见《PKCS_#1_v2.1_RSA_算法标准.pdf》p34)。
      RSA_padding_add_PKCS1_PSS  的输入是 rsa、mHash、hash 方法、salt 长度,输出是 EM。
      RSA_padding_add_PKCS1_PSS  的结果 EM 的长度为 rsa_bytes,但其有真正值的长度只有 rsa_bits - 1。如 rsa_bits = 7 时,EM 的值形如 00XX XXXX;rsa_bits = 9 时,EM 的值形如 0000 0000 XXXX XXXX

2、RSASP1、RSAVP1
      在 openssl 中对应于函数 RSA_signRSA_verify
      RSA_sign 是先把待签名的 str 转换成 DER 编码,再对此进行 RSA_private_encrypt。此函数在 encrypt 前不会进行 hash 操作。

3、I2OSP、OS2IP
      在 openssl 中对应于函数 BN_bn2binBN_bin2bn
      这组函数不能指定八位组的长度,所以需要再包一下。

---------------------------------------------------------------------------------------------------------------

4、 RSASP1、RSAVP1、    I2OSP、OS2IP
      上面的2、3点分析错误,与 openssl 中的相应函数并不对应。
      RSA_sign 对输入的长度有限制:转换为 DER 编码后的长度不能大于 rsa_byts - 11。RSA_verify 只是证明,与 RSAVP1 的语义不符。
      BN_bn2bin、BN_bin2bn,其在 octect string 与 big integer 之间转换时,big integer 一直采用的是 little endian。

5、 RSA_private_encrypt、RSA_verify_PKCS1_PSS 
      RSA_private_encrypt,在 padding 为 RSA_NO_PADDING 时,要求 octect string to be encrypted 长度必须为 rsa_bytes;加密后的长度为 rsa_bytes。实现过程是:先调 BN_bin2bn 转换为 bn,再进行 encrypt,再调 BN_bn2bin 将加密后的结果 bn2 转换为 octect string。
      RSA_public_decrypt 与上面的过程相反。

6、 目前的实现方式
      用组合: RSA_padding_add_PKCS1_PSS、RSA_verify_PKCS1_PSS RSA_private_encrypt、RSA_public_decrypt
      编码过程:先调 hash;再将 hash 值传入 RSA_padding_add_PKCS1_PSS 进行编码;之后再调 RSA_private_encrypt 对编码的值进行加密。
      验证过程:先调 RSA_public_decrypt 解码;再 hash 解码值;将 hash 值传入 RSA_verify_PKCS1_PSS 验证。

你可能感兴趣的:(加密,算法,String,OS,Integer)