2009-09-26 28 views
0

我想加密一些日期使用從CALG_RSA_KEYX鍵類型所做的交換密鑰對派生的公鑰。我使用cryptgetkeyparam KP_BLOCKLEN確定塊大小爲512位。看起來,我可以在53(424位)中提供cryptencrypt的最大字節數,我得到的加密長度爲64。我如何確定可以將多少字節送入cryptencrypt?如果我輸入超過53個字節,則調用失敗。加密API - 塊模式加密確定輸入字節數

回答

2

編輯:雖然由OP所接受這種反應被標記,請參閱拉斯穆斯·法伯響應代替,因爲這是一個更好的響應。 24小時後發佈,Rasmus的迴應糾正了事實錯誤,特別是將OAEP誤描述爲分組密碼; OAEP實際上是一種在PKCS-1的編碼原語上用於密鑰加密的方案。 OAEP更安全,並且對最大消息長度設置了更大的限制,這個限制也被綁定到散列算法及其密鑰長度。

答覆如下的另一個缺點是它沒有強調CALG_RSA_KEYX應該專門爲密鑰交換,任何長度的消息的傳輸後,可發生與任何對稱密鑰加密算法需要,可使用。 OP意識到了這一點,他只是試圖與PK「玩」,儘管在長篇評論中有深度,但我的確涵蓋了這麼多。

暫時,我在這裏留下這個迴應,作爲記錄,還有Mike D可能想提及它,但如果你認爲這樣做會更好完全刪除它;爲了清晰起見,我不介意這麼做!
      -mjv- 2009年9月29日

原答覆:

你檢查從GetLastError函數(錯誤代碼),以下cryptencrypt()的虛假申報? 我懷疑它可能是NTE_BAD_LEN,除非有其他問題。

也許你可以發佈圍繞你的調用criptencryt()的代碼。

賓果,看到CryptEncrypt()調用。

由於您沒有打開CRYPT_OAEP標誌,因此您似乎沒有使用RSAES w/OAEP方案。這個OAEP方案是基於RSAES的分組密碼。然而,後面的加密算法只能加密比其密鑰大小稍小的消息(以字節表示)。這是由於PKCS#1中定義的最小填充大小;這種填充有助於保護算法免受某些關鍵攻擊,我認爲基於已知明文的算法)。

因此,你有三種選擇:

  • 使用CRYPT_OAEP在標誌參數CryptEncrypt()
  • 延長密鑰大小說1024(如果你擁有控制權,提防更長的密鑰會增加編碼/解碼的時間...)
  • 限制自己使用短於54字節的明文消息。

爲了便於記錄,我想記下一些在線資源。

 
- The [RSA Labs][1] web site which is very useful in all things crypto. 
- Wikipedia articles on the subject are also quite informative, easier to read 
    and yet quite factual (I think). 

如果有疑問,但是,千萬諮詢一個真正加密專家像我:-)

+0

你是對的,錯誤是NTE_BAD_LEN。 這裏的加密電話... \t \t \t如果(!CryptEncrypt(hPublicKey,0,TRUE,0,(無符號字符*)&szMessage,及LL,2048)) 我從調試代碼知道,如果DWORD LL包含超過53個,該函數返回一個錯誤。對於LL = 53,函數成功,LL返回爲64,即密鑰塊大小。 當我讀取MSDN時,LL是輸入中要加密的字節數,並且改變了對加密文本實際大小的調用。 dwBufLen,第五個參數(2048)可能是可用於加密的緩衝區的實際大小。 – 2009-09-26 13:15:15

+0

我在http://msdn.microsoft.com/en-us/library/ms867086.aspx上發現了更多讓我比以往更加困惑的東西。在「加密和解密數據:CryptEncrypt,CryptDecrypt」標題下查看3/4的結尾。 (續)下一條評論 – 2009-09-26 15:21:24

+1

在那裏您會找到一個調用cryptencrypt並帶有NULL pbData參數的示例,以便查找所需的緩衝區大小。我的困惑出現了,因爲1)我們最初擁有DwSize中的數據長度。第一次調用dwSize之後可能會增加,所以第二次調用實際上會加密超過預期的數據。 2)被加密的數據是使用new()獲得的緩衝區中剩下的任何垃圾,但也許作者只是選擇複製它? – 2009-09-26 15:22:19

3

RSA使用通常的PKCS#1 v.1.5模式可以加密最多爲k-11個字節的消息,其中k是以字節爲單位的模數的長度。所以一個512位密鑰最多可以加密53個字節,一個1024位密鑰最多可以加密117個字節。

使用OAEP的RSA可以對高達k-2 * hLen-2的消息進行加密,其中k是模數字節長度,hLen是基礎散列函數輸出的長度。因此,使用SHA-1,一個512位密鑰可以加密多達22個字節,一個1024位密鑰可以加密多達86個字節。

您通常不應該使用RSA密鑰直接加密您的消息。相反,您應該生成一個隨機對稱密鑰(f.x. AES密鑰),使用對稱密鑰對您的消息進行加密,使用RSA密鑰對密鑰進行加密並將兩種加密傳輸給收件人。這通常稱爲混合加密。

+0

謝謝Rasmus,糾正我的不準確的陳述,並強調RSA = OAEP應專門用作密鑰交換協議。儘管我在這一觀點中深入闡述了這一點,但重要的是要讓這些事情擺在面前,以免未來的讀者在我的總體混淆和不準確反應的基礎上放鬆時間併產生有缺陷的實現。我只是在嘲笑OP(我相信他也知道RSA密鑰交換的預期用途),試圖「玩PK」。我的迴應現在「重定向」給你的我的+1,它可能最終浮出水面。 – mjv 2009-09-28 14:56:37

+0

@Rasmus:如果您認爲我應該刪除我的回覆,請告知。 – mjv 2009-09-28 14:57:11

+1

我認爲如果你刪除它會是一種遺憾。您修復了答案以顯示正確答案,評論中的討論很有意思。 – 2009-09-28 17:35:23