1.RSA加密格式
RSA公钥与私钥都能加、解密。
假设用公钥pk(RSAPublicKey类型)或私钥vk(RSAPrivatekey类型)加密计算明文数据D(字符串类型)。具体计算步骤如下:
①构造加密块(encryption block):EB=00‖BT‖PS‖00‖D。EB长度为k。
其中,BT为块类型,OCTET STRING类型,长度=1,值可以为00、01或02。私钥加/解密时,BT=00或01,公钥加/解密时,BT=02。
PS为填充字符串,为OCTET STRING类型,长度=k-3-‖D‖。当BT=00时,PS值全为00。当BT=01时,PS值全为FF。当BT=02时,PS值不能为0,随机产生。
②格式转换:把OCTET STRING类型EB转换成Integer类型x。
③RSA加密:用RSA公钥或私钥加密Integer类型x后获得Integer类型密文y。
④格式转换:把Integer类型密文y转换成OCTET STRING类型密文ED,长度为k。
假设用公钥pk(RSAPublicKey类型)或私钥vk(RSAPrivateKey类型)解密计算密文数据ED(OCTET STRING类型)。具体计算步骤如下:
①将OCTET STRING类型ED转换成Integer类型密文y。
②RSA解密:用RSA公钥或私钥解密Integer类型密文y后获得Integer类型明文x。
③格式转换:把Integer类型明文x转换成OCTET STRING类型明文EB,长度为k。
④加密块分拆(encryption block):把明文EB分拆成BT、PS和D,即可获得明文数据D。
2.RSA签名格式
RSA签名时摘要格式用ASN.1描述时,DigestAlgorithm为摘要算法,Digest为摘要值。
假设用私钥vk(RSAPrivateKey类型)签名计算待签名数据M(字符串类型)。具体计算步骤如下:
①计算摘要值:MD=HASH(M)。
②数据编码:把摘要算法ID和摘要值MD按DigestInfo类型编码,获得摘要数据D。
③RSA加密:用私钥vk加密摘要数据D后获得密文ED(OCTET STRING类型),其中BT=0x01。
④格式转换:把密文ED转换成比特字符串S(BIT STRING类型),其中S采用MSB(most significant bit)方式。S即为签名结果。
假设用公钥pk(RSAPublickey类型)签名验证待签名数据M(字符串类型)和待签名结果S(BIT STRING类型)。具体计算步骤如下:
①格式转换:将签名结果S(BIT STRING类型)转换成密文ED(OCTET STRING类型)。
②RSA解密:用公钥pk对密文ED进行解密获得摘要数据D(OCTET STRING类型)。
③数据解码:摘要数据D是DigestInfo类型,解码后获得摘要值MD和摘要算法ID。
④计算摘要并比较:根据摘要算法ID,计算M的摘要值MD'=HASH(M)。如果MD'等于MD,则验证成功,否则验证失败。