2014-10-31 91 views
0

我在許多PHP示例代碼中看到用於加密的密鑰是使用pack()轉換爲Hex的。將密鑰轉換爲二進制以進行加密

$binaryKey = pack('H*', $key) 

我創建使用mcrypt的功能來加密和不轉換字符串鍵解密兩種方法,並測試了,沒有任何問題。 我是否錯過了將密鑰轉換爲十六進制的內容?

+2

在這種情況下,您正在使用不同的密鑰。您的密鑰大小爲n * 2,字母表由16個符號組成,而「pack-version」使用大小爲n的密鑰,並且其字母表每個字符有256個符號。 – VolkerK 2014-10-31 15:30:02

回答

1

的關鍵是轉變六角使用pack method.If你不這樣做,那麼你的密鑰包含每字節的一半之多熵(隨機性)爲二進制。例如,一個128位的密鑰將被延伸到128位熵的256位密鑰。 AES-128會變成AES-256,所以會使用稍微不同的算法。

PHP的mcrypt使檢測這種事情相當棘手,因爲它會接受任何大小的關鍵。它只會增加零,直到找到它可以使用的密鑰長度,並且如果超過256位(對於AES),那麼它將在第一個32之後刪除任何字節。密碼學家認爲這是非常糟糕的做法。所以在你的情況下,一個256位的密鑰可能會被拉伸到512位,之後只能被剪切爲256位。您的密鑰將只包含256位密鑰的低128位,十六進制!

所以,如果你有一個很好的192或256位密鑰,是的,你會錯過一些關鍵信息。此外,您可能會遇到兼容性問題,並在以後遇到非常生氣的同事。