
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,則驗證成功,否則驗證失敗。
