Szybki, który do tej pory unikał mnie (długa noc). Porównuję AES256 w PHP vs Java i zauważam rozbieżności. Proszę dla uproszczenia zignorować klucz ascii i wartość zerową IV, zostaną one zastąpione w produkcji. Ale muszę ominąć ten pierwszy i nie może dowiedzieć się, gdzie jestem erring:AES256 na Java vs PHP
PHP:
echo base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
"1234567890ABCDEF1234567890ABCDEF",
"This is a test",
MCRYPT_MODE_CBC,
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
)
);
Java
byte[] key = "1234567890ABCDEF1234567890ABCDEF".getBytes("UTF-8");
byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec newKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
byte[] results = cipher.doFinal("This is a test".getBytes("UTF-8"));
return Base64.encodeToString(results,Base64.DEFAULT);
wyjściowego PHP: wyjście 0KwK+eubMErzDaPU1+mwTQ==
Java : DEKGJDo3JPtk48tPgCVN3Q==
Nie do końca oczekiwałem o_O!
Próbowałem również MCRYPT_MODE_CBC
, MCRYPT_MODE_CFB
, MCRYPT_MODE_ECB
, MCRYPT_MODE_NOFB
, itp .. żaden z nich nie wyprodukował ciągu Java.
Czy próbowałeś zmienić 'Cipher.getInstance (" AES ");' na 'Cipher.getInstance (" AES/CBC/NoPadding ");' –
Yezzir, "AES/CBC/NoPadding" produkuje IllegalBlockSizeException: dane nie blokują wyrównany rozmiar. "AES/CBC/PKCS5Padding" produkuje "DEKGJDo3JPtk48tPgCVN3Q ==", podobnie jak "AES/CBC/PKCS7Padding". –
To było głupie, bez wyściółki musisz mieć pewność, że podajesz wielokrotność rozmiaru bloku. Napiszę odpowiedź z tym, co uważam za rozwiązanie. –