RSA簽名的PSS模式

2021-09-11 10:57:02 字數 3059 閱讀 3672

本文由雲+社群發表

pss (probabilistic signature scheme)私鑰簽名流程的一種填充模式。目前主流的rsa簽名包括rsa-pss和rsa-pkcs#1 v1.5。相對應pkcs(public key cryptography standards)是一種能夠自我從簽名,而pss無法從簽名中恢恢復原來的簽名。openssl-1.1.x以後預設使用更安全的pss的rsa簽名模式。

rsa演算法比較慢,一般用於非對稱加密的private key簽名和public key驗證。因rsa演算法沒有加入亂數,當出現重複性的原始資料,攻擊者會通過相同加密密文而猜測出原文,因此匯入padding的機制來加強安全性。

tls流程中的金鑰材料若不進行填充而直接加密,那麼顯然相同的key,會得到相同的密文。這種在語義上來說,是不安全的。以下例子說明了無填充模式的安全漏洞。

加密方加密m:c = m^e mod n,傳輸c

解密方解密c:m = c^d mod n,還原m

由於c在網路上傳輸,如果網路上有人對其進行c' = c*k^e mod n,這樣的替換

那麼解密方將得到的結果是

(c*k^e)^d mod n

= (c^d mod n)* (k^ed mod n)

= m*k

即中間人有辦法控制m。

使用pss模式的rsa簽名流程如下:

圖1、rsa-pss的填充模式

相比較pkcs#1 v1.5的padding簡單許多:

圖2、rsa-pkcs#v1.5的填充模式

pss的一些概念:

這節例子中所涉及到的檔案說明:

/tmp/wildcard_domain.sports.qq.com.v2.key:私鑰

/tmp/pub: 公鑰

/tmp/data: 明文

/tmp/endata: 密文

/tmp/sign: 簽名

/tmp/de_sign: 解簽名

openssl rsa -in /usr/local/services/ssl_agent/ca/wildcard_domain.sports.qq.com.v2.key -pubout -out /tmp/pub

複製**

echo -n "1234567890" > /tmp/data

openssl rsautl -pubin -inkey /tmp/data -in /tmp/data -encrypt -out /tmp/endata

複製**

openssl rsautl -inkey /tmp/wildcard_domain.sports.qq.com.v2.key -in /tmp/en_data -decrypt

複製**

簽名過程包括hash和加密。hash函式一般使用sha1。這樣輸入明文,直接生成sign簽名。

如果是私鑰簽名所做的事就是先hash再加密,選擇一種hash演算法把原始訊息計算後成asn1格式,再把這個資料用private key加密後送出,資料本身不加密,這種方式主要是用來驗證資料**是否可信任的,送出時把原始資料和簽名一起送出。

openssl sha1 -sign /tmp/wildcard_domain.sports.qq.com.v2.key  /tmp/data > /tmp/data/sign/tmp/data/sign

複製**

openssl rsautl -pubin -inkey /tmp/pub -in sign -verify -out /tmp/de_sign 

複製**

用public key解開簽名,並且保留padding

openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -encrypt -raw -hexdump

複製**

使用解開asn1解開簽名,或者簽名後用asn1工具解析

openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -verify -asn1parse

複製**

或者:

openssl asn1parse -inform der -in /tmp/de_sign

複製**

和本地sha1對比

openssl sha1 /tmp/data

複製**

如果兩者hash結果是一樣,那麼確定簽名送過來是正確的。

openssl rsautl --help,可以看到支援的padding模式有,在rsautl加上以下選項可以重複做2.2~2.3的實驗。

-ssl                     use ssl v2 padding

-raw use no padding

-pkcs use pkcs#1 v1.5 padding (default)

-oaep use pkcs#1 oaep

複製**

pss是rsa的填充模式中的一種。

完整的rsa的填充模式包括:

rsa_sslv23_padding(sslv23填充)

rsa_no_padding(不填充)

rsa_pkcs1_oaep_padding (rsaes-oaep填充,強制使用sha1,加密使用)

rsa_x931_padding(x9.31填充,簽名使用)

rsa_pkcs1_pss_padding(rsassa-pss填充,簽名使用)

rsa_pkcs1_padding(rsaes-pkcs1-v1_5/rsassa-pkcs1-v1_5填充,簽名可使用)

複製**

其中主流的填充模式是pkcs1和pss模式。

pss的優缺點如下:

RSA簽名的PSS模式

本文由雲 社群發表 pss probabilistic signature scheme 私鑰簽名流程的一種填充模式。目前主流的rsa簽名包括rsa pss和rsa pkcs 1 v1.5。相對應pkcs public key cryptography standards 是一種能夠自我從簽名,而p...

RSA簽名的PSS模式

本文由雲 社群發表pss probabilistic signature scheme 私鑰簽名流程的一種填充模式。目前主流的rsa簽名包括rsa pss和rsa pkcs 1 v1.5。相對應pkcs public key cryptography standards 是一種能夠自我從簽名,而ps...

RSA簽名的PSS模式

本文由雲 社群發表pss probabilistic signature scheme 私鑰簽名流程的一種填充模式。目前主流的rsa簽名包括rsa pss和rsa pkcs 1 v1.5。相對應pkcs public key cryptography standards 是一種能夠自我從簽名,而ps...