簡體   English   中英

在python中獲取AES CBS加密數據的javax.crypto.BadPaddingException

[英]Getting a javax.crypto.BadPaddingException for AES CBS encrypted data in python

我正在將代碼從Java移植到python,這是我在python中的代碼

self.BLOCK_SIZE = 16

def pkcs5_pad(self, s):
    padder = padding.PKCS7(128).padder()
    padded_data = padder.update(s)
    padded_data += padder.finalize()

    return padded_data

def xxx(self):

    iv = "\x00"*self.BLOCK_SIZE
    payload_secret = os.urandom(self.BLOCK_SIZE)
    cipher = AES.new(payload_secret, AES.MODE_CBC, iv)

    # Generate a serial key based on MAC Address
    serial_key = hex(uuid.getnode()).encode('base64').replace('\n', '')
    serial_key_enc = cipher.encrypt(self.pkcs5_pad(serial_key))
    serial_number =serial_key_enc.encode('base64').replace('\n', '')

我在Java中的服務器端代碼拋出javax.crypto.BadPaddingException: Given final block not properly padded 這是我在服務器上解密的Java代碼:

String serialEnc = "s+3YvGfHzmTgDgBfWSGbyxZRQsHNmz3WcX03B0kVHz+HRZYbL+l4hoLBSROeSWnS"; // Java, works
//String serialEnc = "p06pEvjWe8Lc1t+g8ROQgYDsrFC6emHpCEyUKWoZMrI="; //Python, does not
serialEnc = serialEnc.replaceAll(" ", "+");

byte[] iv =
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

IvParameterSpec ips = new IvParameterSpec(iv);
SecretKeySpec skeySpec = new SecretKeySpec(decPayloadKey, "AES");
Cipher symCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
symCipher.init(Cipher.DECRYPT_MODE, skeySpec, ips);

byte[] encBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(serialEnc);
byte[] bytes = symCipher.doFinal(encBytes);
String plain = new String(bytes, "UTF-8");
System.out.println(plain);    

Java中生成加密有效負載的相同代碼是

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey skAESPayloadKey = kgen.generateKey();
byte[] raw = skAESPayloadKey.getEncoded();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips);
byte[] baEncSerialNbr = cipher.doFinal(baSerialNbr);

您正在使用Python和Java生成隨機密鑰。 您必須使用相同的密鑰進行加密和解密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM