之前所記錄的RSA演算法的運作都只是在做數學運算,在用於資料的加解密時可以把資料切割,內容看成是一個大的整數,資料要切多細則是看key是多少bits
以之前的key為例,這是1024 bits的key,所指的是n有1024 bits。當我們要加密資料時可以切成多個小於1024 bits的區塊去計算。而在實際的應用上,因為RSA
演算法的速度比較慢,不設合用來傳資料,我目前看到的實際應用是用在certificate上,用private key簽名,public key驗證,時寄傳送的資料不長。
資料長度不夠的話會容易被破解,再加上這個演算法沒有加入亂數,當出現重重複性的資料時也會降低安全性,因此導入padding的機制來加強安全性
RSA有多種padding的方式,這邊只記錄最常用的PKCS#1 v1.5
同樣以這一篇key為例來說明
1.用public key加密
public key: (e,n)
key length: k
message: M
message length: mLen
因為padding的一些要求,mLen有條件 mLen <= k-11 再來就是產生不為0的亂數,共 (k - mLen - 3)個
把這串padding string叫做PS,然後組成EM
EM = 0x00 || 0x02 || PS || 0x00 || M
補了 0x00 0x02 PS 0x00 在前面,PS最短規定要8 bytes
所以才有 mLen <= k-11 這個限制
最後再依照RSA演算法,把EM加密後送出
解密則是倒過來,先用private key透過RSA演算法求出EM
再檢查是否符合padding的規則,若不符合則丟棄這個訊息
以下用openssl來實作
先匯出 public key
#產生一筆資料
用public key加密,openssl 預設用PKCS#1 v1.5 padding
用private key解密,得到原本的值
用private key解密,得到原本的值
另外,也可以只算出EM,不去掉padding,可以使用之前的程式
或用以下指令計算
可以看出它是如何做padding的
2.用private key加密
和用public key加密類似,相同的長度限制
不同的是padding的方式
EM = 0x00 || 0x01 || PS || 0x00 || M
這邊PS的值全部都是0xFF
同樣,解密也是倒過來做,先拿public key計算,再驗證padding
用private key加密
用public key解密
用public key解密,保留padding
3.用private key簽名
這種應用似乎比較常見,用private key簽名所做的事就是先hash再加密
先選一種hash演算法把原始資料計算後包成ASN1格式,再把這一包資料用private key加密後送出
資料本身不加密,這種方式主要是用來驗證資料來源是否可信任的,送出時把原始資料和簽名一起送出
用sha1作hash再用private key簽名
用public key解開簽名
用public key解開簽名,保留padding
從這個結果可以看出hash後再加上ASN1編碼佔了35 bytes,所以這個key要夠長才能塞的下
這是簽名時選擇key的長度或是hash演算法的一個限制
接下來把解出來的ASN1資料解開來看
可以解密時順便看
也可以用asn1parse解析
最後再比對hash對不對
hash結果相同,則知道這筆資料確實是簽名者送過來的
至於如何驗證明者的正確性,可以利用數位簽章層層把關,這又是另一個有趣的東西了
但用到的方法都是相似的
沒有留言:
張貼留言