1. 程式人生 > >【IoT】加密與安全:非對稱加密演算法 RSA 1024 公鑰、祕鑰、明文和密文長度

【IoT】加密與安全:非對稱加密演算法 RSA 1024 公鑰、祕鑰、明文和密文長度

RSA 1024 是指公鑰及私鑰分別是 1024bit,也就是 1024/8 = 128Bytes。

RSA 演算法金鑰長度的選擇是安全性和程式效能平衡的結果,金鑰長度越長,安全性越好,加密解密所需時間越長。

1、非對稱加密演算法中 1024bit 金鑰的強度相當於對稱加密演算法 80bit 金鑰的強度;


 
2、金鑰長度增長一倍,公鑰操作所需時間增加約 4 倍,私鑰操作所需時間增加約 8 倍,公私鑰生成時間約增長 16 倍;
 
3、明文長度

一次能加密的明文長度與金鑰長度成正比:

len_in_byte(raw_data) = len_in_bit(key)/8 -11,如 1024bit 的金鑰,一次能加密的內容長度為 1024/8 -11 = 117 byte。

所以非對稱加密一般都用於加密對稱加密演算法的金鑰,而不是直接加密內容。

注:

明文長度小於等於金鑰長度 128Bytes - 11 這個說法本身不太準確,會讓人產生 RSA 1024 只能加密 117 位元組長度明文的誤解。

實際上,RSA 演算法本身要求加密內容也就是明文長度 m 必須滿足 0<m<n,也就是說內容這個大整數不能超過 n,否則就出錯。

那麼如果 m=0 是什麼結果?

普遍 RSA 加密器會直接返回全 0 結果,如果 m>n,運算就會出錯。

因此,RSA 實際可加密的明文長度最大也是 1024bits,但問題就來了:

如果小於這個長度怎麼辦?

就需要進行 padding,因為如果沒有 padding 使用者無法確分解密後內容的真實長度,字串之類的內容問題還不大,以 0 作為結束符,便於區分。

但對二進位制資料就很難理解,因為不確定後面的 0 是內容還是內容結束符。

只要用到 padding,那麼就會佔用實際的明文長度,我們一般使用的 padding 標準有 NoPPadding、OAEPPadding、PKCS1Padding 等。

其中 PKCS#1 建議的 padding 就佔用了 11 個位元組,於是才有 117 位元組的說法。

如果大於這個長度怎麼辦?

很多演算法的 padding 往往是在後邊的,但 PKCS 的 padding 則是在前面的,此為有意設計,有意的把第一個位元組置 0 以確保 m 的值小於 n。

這樣,128位元組(1024bits)- 11 位元組正好是117位元組,但對於 RSA 加密來講,padding 也是參與加密的。

所以,依然按照 RSA 1024 實際的明文只有 117 位元組。

關於 PKCS#1 padding 規範可參考:RFC2313 chapter 8.1。

我們在把明文送給 RSA 加密器前,要確認這個值是不是大於 n,也就是如果接近 n 位長,那麼需要先 padding 再分段加密。

除非我們是“定長定量自己可控可理解”的加密則不需要 padding。

4、祕文長度

加密後密文的長度為金鑰的長度,如金鑰長度為 1024b(128Byte),最後生成的密文固定為 1024b(128Byte)

密文長度就是給定符合條件的明文加密出來的結果位長,這個可以確定,加密後的密文位長跟金鑰的位長度是相同的,因為加密公式:

C=(P^e)%n

所以,C 最大值就是 n-1,所以不可能超過 n 的位數。

儘管可能小於 n 的位數,但從傳輸和儲存角度,仍然是按照標準位長來進行的。

因此,即使我們加密一位元組的明文,運算出來的結果也要按照標準位長來使用。

refer: