NOTE
- RSA算法是块运算,分块大小为模数N的字节数
- RSA算法输出的密文和签名长度与模数N一致
- 加密时可接受的明文长度受限于模数N长度以及所选填充方式
- 如果待加密明文长度大于可接受长度时,需要进行分块处理
- 以下功能依赖openssl实现
加密解密
- 加密过程
- 进行一些参数判断,如明文不为空,密钥不为空等
- 计算模数N字节数RSA_size,RSA1024是128字节,RSA2048是256字节,RSA4096是512字节
- 根据模数字节数以及选择的Padding方式判断明文长度是否合适。以RSA2048为例,pkcs1Padding时,明文长度最大为256-11=245个字节;oaepPadding时,明文长度最大为256-41=215个字节。
- 公钥加密 RSA_public_encrypt
- 解密过程
- 必要参数判断,密钥不为空等
- 计算模数字节数RSA_size
- 判断输入的密文是否和模数字节数相等
- 私钥解密RSA_private_decrypt
签名验签
- 签名过程
- 必要入参判断
- 计算hash值。EVP_DigestInit、EVP_DigestUpdate、EVP_DigestFinal
- 签名RSA_sign
- 验签过程
- 必要参数判断
- 计算hash值
- 验签RSA_verify
Padding
- noPadding 高位填充0x00
- pkcs1Padding 格式 0x00 || 签名加密标识 || 填充,至少8字节 || 0x00 || 明文或者原文
- 签名 0x00 || 0x01 || 重复0xFF || 0x00 || 原文
- 加密 0x00 || 0x02 || 非零随机数 || 0x00 || 明文
- oaepPadding最优非对称加密填充-----待补充