2014-04-29 93 views
0

我期待在一些常見蟒示例代碼不加密,設置這樣的:Python到Java的加密/解密,確保密碼匹配?

encryptor = AES.new(key, AES.MODE_CBC, iv) 
chunksize = 64*1024 

while True: 
    chunk = infile.read(chunksize) 
    if len(chunk) == 0: 
     break 
    elif len(chunk) % 16 != 0: 
     chunk += ' ' * (16 - len(chunk) % 16) 

    outfile.write(encryptor.encrypt(chunk)) 

試圖建立Java代碼從上述解密輸出,我看到不同的初始化密碼填充例子:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

或:

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 

即使所有的Python片段是相同方式實現。

我希望在這種情況下使用「NoPadding」。任何人都可以解釋在這種情況下正確的選擇是什麼?

謝謝

+0

另請注意,如果您位於文件的末尾,則不能保證讀取的返回小於所請求的大小。即使這不可能,你在技術上最終只能讀取8個字節,這會被填充,因此額外的空間會在加密的明文中結束。關於填充的選擇,如果可以改變python方面,那麼你應該使用兩側PKCS5(或PKCS7是相同的)填充。用「''」填充你不能區分一個填充的明文和一個剛好在末尾有空格的明文。 – Perseids

+0

@Perseids我想我明白 - 有很多python示例聲稱是PKCS5或PKCS7,只是用空格填充。我從規格參考中看到不同的:[http://programmerin.blogspot.com/2011/08/python-padding-with-pkcs7.html],[ftp://ftp.rsasecurity.com/pub/pkcs/ ascii/pkcs-7.asc] – user3203425

+0

[blogspot文章]中的一個(http://programmerin.blogspot.de/2011/08/python-padding-with-pkcs7.html)看起來很好,即使我猜測python密碼庫應該已經有例程。此外,我建議你使用[HMAC](https://en.wikipedia.org/wiki/Hash-based_message_authentication_code)(encrypt-then-mac)加密後認證你的消息,以防止所謂的[填充oracle攻擊](http ://robertheaton.com/2013/07/29/padding-oracle-attack/)(請參閱https://security.stackexchange.com/questions/38942/how-to-protect-against-padding-oracle-attacks) 。 – Perseids

回答

1

的Python代碼是填充帶有空格(' '),除非我誤解的代碼(不是一個Python的傢伙)。您需要在Java代碼中手動填充並使用"AES/CBC/NoPadding"