2013-07-21 52 views
4

我正在使用AES的PyCrypto實現,並試圖使用24字節密鑰加密一些文本(24字節)。爲什麼AES的所有輸入都是16的倍數?

aes_ecb = AES.new('\x00'*24, AES.MODE_ECB) 
aes_ecb.encrypt("123456"*4) 

我得到這個驚人的錯誤ValueError: Input strings must be a multiple of 16 in length
那麼爲什麼我的輸入必須是16的倍數?對我而言,輸入字符串長度必須是我的密鑰大小的倍數,這樣會更有意義,因爲這樣可以在密鑰和明文塊之間進行很好的按位運算。

回答

4

AES是block cipher。從維基百科頁面引用:「分組密碼是在固定長度的比特組上運行的確定性算法」。

AES只能使用128位的塊(即16個字符,正如您注意到的那樣)。

如果您的輸入的長度可能不是128的倍數,則取決於您的應用程序,您可能必須非常小心如何處理padding

+0

然後在引擎蓋下,AES填充我的密鑰,以便它是16的倍數? – Mark

+1

@Mark它是輸入必須是塊大小的倍數,而不是密鑰。 AES允許密鑰大小爲128,192和256.一個塊的加密不是密鑰和塊之間的簡單XOR,它更復雜,並且不要求塊大小與密鑰大小相同。 –

1

只想補充有關操作

的MODS信息

是的,AES是128位(16字節)的塊加密有多個可能的密鑰長度(128,192,256),但這樣做的原因文本填充限制(和錯誤消息)是ECB mode of operation。 ECB是最簡單的加密模式。我不知道你的目標,所以會跳過它不提供嚴格的消息機密的部分。

CBC和CTR更常見,通常適合使用,在CTR模式下,您不需要128位消息長度。

還有用於ECB和CBC模式的ciphertext stealing (CTS)方法。使用操作的塊加密模式,它允許對於不整除成塊 而不導致密文的任何擴充消息的 處理,在 稍微增加了複雜性

成本

方法

但是對於ECB模式的密文竊取要求明文比一個128位塊長。

相關問題