--- tags: DES, Encryption, 加密, Key --- # DES加密,到底金鑰長度應該設定多長? 在 2020年的某一天,我在測試廠商提供的 WEB API時,按照廠商提供的說明,先將資料用 DES加密後再進行傳送,聽起來不會太困難,於是我立刻著手寫了一小段程式碼測試,但實務上通常不會這麼順利。 我將廠商提供的金鑰餵給 DES,立刻得到一個因金鑰長度不正確引發的 Exception(key too large),檢查過金鑰後確認沒有任何錯字且跟廠商提供的金鑰一模一樣。 於是我上維基百科搜尋 DES架構,發現 DES的金鑰長度被限制在 64 bits,但是廠商提供的卻是長度 256 bits的金鑰,很明顯的跟架構不符合,於是我將相關資訊轉寄給廠商,廠商卻說:沒這回事,你看看我們的 sample code( java),一看之下不得了了,還真的是用 256 bits進行加密,難道 Java有什麼神奇的魔力!? ![](https://i.imgur.com/XpPvImY.png) 廠商提供的範例確實可以執行,但如此一來就不符合 DES的規範了! 最後我找到了 Java官方對 DES加密的說明,上面寫著"只會取前 8 bytes",為了佐證這一點,我還特地去找出 DESKeySpec()的 Source Code比較,確實跟文件的描述一致。 ![](https://i.imgur.com/u2OYHZ9.png) 這下總算真相大白了,廠商誤以為金鑰越長越好,實際上人家只會認前 8 bytes !!!