ich versuche im moment einen cipher zwischen Python und Java zu verwenden, das funktioniert aber nicht.
Bei dem java ergebnis hängen immer 16 byte mehr hinten dran.
Schlimmer noch, wenn Java das Python ergebnis deciphern soll gibt es eine 'Given final block not properly padded' exception.
Zuerst das Java Cipher:
Code: Alles auswählen
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
public class AES{
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
public static String asHex (byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10)
strbuf.append("0");
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
public static void main(String[] args) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec("abcdefghijklmnop".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte [] input = "AAAAAAAAAAAAAAAA".getBytes();
byte[] encrypted = cipher.doFinal(input);
System.out.println("encrypted string: " + asHex(encrypted));
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(hexStringToByteArray("8c155e4e9bf78570ee6300dc5f8a418a")); // << raises
String originalString = new String(original);
System.out.println("Original string: " +
originalString + " " + asHex(original));
}
}
Jetzt das Python Cipher:
from Crypto.Cipher import AES
Code: Alles auswählen
plain = "A"*16
obj=AES.new('abcdefghijklmnop', AES.MODE_ECB)
print binascii.hexlify(obj.encrypt(plain))
Dann das ganze mal decoded mit python ergibt:
Code: Alles auswählen
>>> obj.decrypt(binascii.unhexlify('8c155e4e9bf78570ee6300dc5f8a418a'))
'AAAAAAAAAAAAAAAA'
>>> obj.decrypt(binascii.unhexlify('8c155e4e9bf78570ee6300dc5f8a418a8e64ce873f174dbb2423fcd814580e15'))
'AAAAAAAAAAAAAAAA\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
Das Java scheint also extra zu padden .... Aber warum nur ... der input ist ja 16 byte.