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」。任何人都可以解釋在這種情況下正確的選擇是什麼?
謝謝
另請注意,如果您位於文件的末尾,則不能保證讀取的返回小於所請求的大小。即使這不可能,你在技術上最終只能讀取8個字節,這會被填充,因此額外的空間會在加密的明文中結束。關於填充的選擇,如果可以改變python方面,那麼你應該使用兩側PKCS5(或PKCS7是相同的)填充。用「''」填充你不能區分一個填充的明文和一個剛好在末尾有空格的明文。 – Perseids
@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
[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