2009-06-08 65 views
2

我很難理解密碼學中的密鑰長度要求。我目前使用DES,我認爲它是56位......現在,通過將8個字符的密碼轉換爲byte[]我的密碼學工作。如果我使用7位數的密碼,它不會。我應該如何創建我的DES密鑰?爲什麼7個字符的字符串不夠?

現在,請原諒我,如果我錯了,但是因爲ASCII字符是7位,所以8 * 7 = 56位?

這對我來說似乎不太合適。如果我想使用密鑰,爲什麼不能傳遞我的密鑰(即MD5哈希)的醃製散列?

我確定這很簡單,但我無法清楚地瞭解發生了什麼。

回答

7

每個算法都被設計爲接受一定的密鑰長度。關鍵是用作算法的一部分,因此,不能滿足你的心願。

共同密鑰大小是:

  • DES:56位密鑰
  • AES:128-256bit密鑰(常用的值是128,192和256)
  • RSA(不對稱密碼):1024, 2048,4096位密鑰

一個數字,如1234567只是一個4字節的變量。密鑰預期是一個字節數組,如"1234567"(可隱式轉換爲C中的一個)或'{'1','2','3','4','5','6','7 '}。

如果您希望將您的密鑰的MD5哈希值傳遞給DES,您應該使用一些密鑰壓縮技術。例如,你可以使用前7個字節(有些不合需要),或者對MD5哈希(使用已知的常量密鑰)執行DES加密,並將除最後一個字節以外的所有字節都作爲DES操作的密鑰。

編輯:我在這裏討論的DES是根據NIST發佈的標準實現的。它可能是(如上所述),您的特定API期望對密鑰長度有不同的要求,並從中得出最終的7字節密鑰。

2

你不應該直接將密碼傳遞給算法。使用例如Rfc2898DeriveBytes類,它也會對你的密碼進行加密。它可以使用任意長度。

查看示例here

編輯: D'哦 - 你的問題是不是C#或.Net標籤:/

0

根據MSDN DES支持64位的密鑰長度。

5

密鑰的大小必須是64位,但密鑰只能使用56位。其他8位是奇偶校驗位(內部使用)。

ASCII字符具有8位大小。

+0

一些權利,一些錯誤。 US-ASCII字符只有7位。但是,謝謝你指出DES密鑰的每個字節都包含一個奇偶校驗位。 – erickson 2009-06-08 16:16:52

12

DES使用56位密鑰:8字節,其中每個字節中的一位是奇偶校驗位。

但是,一般來說,無論算法如何,推薦使用公認的密鑰導出算法將文本密碼轉換爲對稱密碼密鑰。

PKCS#5(RFC 2898)中描述的PBKDF2算法是一種廣泛使用的密鑰導出函數,可以生成任意長度的密鑰。在它的核心,PBKDF2通過哈希函數通過結合鹽和密碼來生成實際的密鑰。散列重複了很多次,因此攻擊者嘗試在她的最常用密碼的「字典」中輸入每個條目將會很昂貴和緩慢。

較早的版本PBKDF1可以爲DES加密生成密鑰,但不推薦在新應用中使用DES和PBKDF1。

大多數具有加密支持的平臺都在其API中包含PKCS#5密鑰派生算法。

+0

感謝您指出八個字節中每一個都有一個奇偶校驗位(丟棄?)。 – 2013-06-28 17:15:07

0

爲了避免這個問題並增加一個實現的整體安全性,通常我們會將密鑰的散列變體傳遞給加密函數,而不是密鑰本身。

此外,最好使用特定於您正在操作且不會更改的值(例如,內部用戶標識符)對散列進行「加鹽」操作。這可以確保對於任何兩個密鑰實例,結果會有所不同。

一旦你有你的派生密鑰,你可以根據你的特定加密函數的要求提取它的第一個n-bites。

相關問題