RSA金鑰長度 明文長度和密文長度

2021-09-07 08:27:30 字數 2352 閱讀 4845

本文整理rsa加解密中必須考慮到的金鑰長度、明文長度和密文長度問題知識,對第一次接觸rsa的開發人員來說,rsa算是比較複雜的演算法,以後還會補充幾篇rsa基礎知識專題文章,用最簡單最通俗的語言描述rsa,既方便自己溫習,也方便各位新入門的朋友參考,其實rsa演算法應用也很簡單,rsa的複雜度是因為數學家把效率和安全也考慮進去的緣故。

本文先只談金鑰長度、明文長度和密文長度的概念知識,rsa的理論及示例等以後再談。提到金鑰,我們不得不提到rsa的三個重要大數:公鑰指數e、私鑰指數d和模值n。這三個大數是我們使用rsa時需要直接接觸的,理解了本文的基礎概念,即使未接觸過rsa的開發人員也能應對自如的使用rsa相關函式庫,無需深入了解e、d、n是如何生成的,只需要知道我該如何用、要注意什麼。

首先我們說的「金鑰」是指誰?由於rsa金鑰是(公鑰+模值)、(私鑰+模值)分組分發的,單獨給對方乙個公鑰或私鑰是沒有任何用處,所以我們說的「金鑰」其實是它們兩者中的其中一組。但我們說的「金鑰長度」一般只是指模值的位長度。目前主流可選值:1024、2048、3072、4096...

目前主流金鑰長度至少都是1024bits以上,低於1024bit的金鑰已經不建議使用(安全問題)。那麼上限在**?沒有上限,多大都可以使用。所以,主流的模值是1024位,實際運算結果可能會略小於1024bits,注意,這個值不是絕對的,跟素數的生成演算法有關係,只是告訴素數生成器「幫我生成乙個接近1024位的素數而已」,然後生成器「好,給您乙個,這個差不多1024位」。

素數生成器這麼厲害?說生成1024位就會出個1024位的大整數?真實的情況是素數生成器也只是在1024bits對應的整數附近進行「摸索」而已,大家其實都不容易,又要快又要準確又要隨機性,那麼素數生成器也只能應付一下,找到1024位的算是好運,沒找到1024位,1023位也照樣送出來:)。

公鑰指數是隨意選的,但目前行業上公鑰指數普遍選的都是65537(0x10001,5bits),該值是除了1、3、5、17、257之外的最小素數,為什麼不選的大一點?當然可以,只是考慮到既要滿足相對安全、又想運算的快一點(加密時),pkcs#1的乙個建議值而已。

有意的把公鑰指數選的小一點,但是對應私鑰指數肯定很大,意圖也很明確,大家都要用公鑰加密,所以大家時間很寶貴,需要快一點,您乙個人私鑰解密,時間長一點就多擔待,少數服從多數的典型應用。

公鑰指數隨意選,那麼私鑰就不能再隨意選了,只能根據演算法公式(ed%k=1,k=(p-1)(q-1))進行運算出來。那麼私鑰指數會是多少位?根據ed關係,私鑰d=(x*k+1)/e,所以單看這個公式,私鑰指數似乎也不是唯一結果,可能大於也可能小於1024bits的,但我們習慣上也是指某個小於1024bits的大整數。

包括前文的公鑰指數,在實際運算和儲存時為方便一般都是按照標準位長進行使用,前面不足部分補0填充,所以,使用儲存和轉換這些金鑰需要注意統一緩衝區的長度。

網上有說明文長度小於等於金鑰長度(bytes)-11,這說法本身不太準確,會給人感覺rsa 1024只能加密117位元組長度明文。實際上,rsa演算法本身要求加密內容也就是明文長度m必須0n,運算就會出錯?!那怎麼辦?且聽下文分解。

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

如果小於這個長度怎麼辦?就需要進行padding,因為如果沒有padding,使用者無法確分解密後內容的真實長度,字串之類的內容問題還不大,以0作為結束符,但對二進位制資料就很難理解,因為不確定後面的0是內容還是內容結束符。

只要用到padding,那麼就要占用實際的明文長度,於是才有117位元組的說法。我們一般使用的padding標準有noppadding、oaeppadding、pkcs1padding等,其中pkcs#1建議的padding就占用了11個位元組。

如果大於這個長度怎麼辦?很多演算法的padding往往是在後邊的,但pkcs的padding則是在前面的,此為有意設計,有意的把第乙個位元組置0以確保m的值小於n。

這樣,128位元組(1024bits)-減去11位元組正好是117位元組,但對於rsa加密來講,padding也是參與加密的,所以,依然按照1024bits去理解,但實際的明文只有117位元組了。

關於pkcs#1 padding規範可參考:rfc2313 chapter 8.1,我們在把明文送給rsa加密器前,要確認這個值是不是大於n,也就是如果接近n位長,那麼需要先padding再分段加密。除非我們是「定長定量自己可控可理解」的加密不需要padding。

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

c=(p^e)%n

所以,c最大值就是n-1,所以不可能超過n的位數。儘管可能小於n的位數,但從傳輸和儲存角度,仍然是按照標準位長來進行的,所以,即使我們加密一位元組的明文,運算出來的結果也要按照標準位長來使用(當然了,除非我們能再採取措施區分真實的位長,一般不在考慮)。

至於明文分片多次加密,自然密文長度成倍增長,但已不屬於一次加密的問題,不能放到一起考慮。

RSA金鑰長度 明文長度和密文長度

本文介紹rsa加解密中必須考慮到的金鑰長度 明文長度和密文長度問題,對第一次接觸rsa的開發人員來說,rsa算是比較複雜的演算法,rsa演算法本身其實也很簡單,rsa的複雜度是因為數學家把效率和安全也考慮進去的緣故。本文先只談金鑰長度 明文長度和密文長度的概念知識,rsa的理論及示例等以後再談。提到...

RSA金鑰長度 明文長度和密文長度

本文介紹rsa加解密中必須考慮到的金鑰長度 明文長度和密文長度問題,對第一次接觸rsa的開發人員來說,rsa算是比較複雜的演算法,天緣以後還會補充幾篇rsa基礎知識專題文章,用最簡單最通俗的語言描述rsa,讓各位了解rsa演算法本身其實也很簡單,rsa的複雜度是因為數學家把效率和安全也考慮進去的緣故...

RSA金鑰長度 明文長度和密文長度

srclink 本文整理rsa加解密中必須考慮到的金鑰長度 明文長度和密文長度問題知識,對第一次接觸rsa的開發人員來說,rsa算是比較複雜的演算法,以後還會補充幾篇rsa基礎知識專題文章,用最簡單最通俗的語言描述rsa,既方便自己溫習,也方便各位新入門的朋友參考,其實rsa演算法應用也很簡單,rs...