我正在将代码从 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);