我想用Java解密AES加密的消息。我一直在嘗試standard library和BouncyCastle的各種算法/模式/填充選項。沒有:-(在Java中解密AES編碼的消息(用Python加密)
加密實體是用Python編寫,並已在生產運氣加密郵件已經出去了,所以我不能輕易改變的那部分的Python代碼看起來是這樣的:
from Crypto.Cipher import AES
import base64
import os
import sys
BLOCK_SIZE = 16
PADDING = '\f'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
secret = 'XXXXXXXXXXXXXXXX'
cipher = AES.new(secret)
clear='test'
encoded = EncodeAES(cipher, clear)
print 'Encrypted string:>>{}<<'.format(encoded)
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:>>{}<<'.format(decoded)
顯然使用了AES,我發現我必須使用ECB模式,但是我還沒有找到適用於Java端的填充模式,如果輸入符合塊大小並且沒有填充,我可以解密如果消息需要填充,解密失敗
解密的Java代碼如下所示:
public class AESPaddingTest {
private enum Mode {
CBC, ECB, CFB, OFB, PCBC
};
private enum Padding {
NoPadding, PKCS5Padding, PKCS7Padding, ISO10126d2Padding, X932Padding, ISO7816d4Padding, ZeroBytePadding
}
private static final String ALGORITHM = "AES";
private static final byte[] keyValue = new byte[] { 'X', 'X', 'X', 'X',
'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' };
@BeforeClass
public static void configBouncy() {
Security.addProvider(new BouncyCastleProvider());
}
@Test
public void testECBPKCS5Padding() throws Exception {
decrypt("bEpi03epVkSBTFaXlNiHhw==", Mode.ECB,
Padding.PKCS5Padding);
}
private String decrypt(String valueToDec, Mode modeOption,
Padding paddingOption) throws GeneralSecurityException {
Key key = new SecretKeySpec(keyValue, ALGORITHM);
Cipher c = Cipher.getInstance(ALGORITHM + "/" + modeOption.name() + "/" + paddingOption.name());
c.init(Cipher.DECRYPT_MODE, key);
byte[] decValue = c.doFinal(valueToDec.getBytes());
String clear = new String(Base64.encodeBase64(decValue));
return clear;
}
}
引發的錯誤是:
javax.crypto.IllegalBlockSizeException:輸入長度必須多個16時 的帶襯墊的密
任何想法解密?
如果您可以共享解密時收到的錯誤消息,那麼它會加快解決過程。 – lkamal
當然可以。拋出'javax.crypto.IllegalBlockSizeException:當使用填充密碼解密時,輸入長度必須是16的倍數'異常。 –
在將它傳遞給解密函數之前,您是首先解碼Base64編碼的消息嗎? – initramfs