Недавно я использовал алгоритм AES в Java для шифрования текста. Теперь мне нужно перестроить этот алгоритм в PHP, но я понятия не имею, как, потому что PHP-алгоритмы в Интернете возвращают разные результаты. Возможно ты можешь помочь мне.
Это Java-код для шифрования:
private static final String KEY = "57238004e784498bbc2f8bf984565090"; public static String encrypt(final String plaintext) throws GeneralSecurityException { SecretKeySpec sks = new SecretKeySpec(hexStringToByteArray(KEY), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks, cipher.getParameters()); byte[] encrypted = cipher.doFinal(plaintext.getBytes()); return byteArrayToHexString(encrypted); } public static byte[] hexStringToByteArray(String s) { byte[] b = new byte[s.length() / 2]; for (int i = 0; i < b.length; i++) { int index = i * 2; int v = Integer.parseInt(s.substring(index, index + 2), 16); b[i] = (byte) v; } return b; } public static String byteArrayToHexString(byte[] b) { StringBuilder sb = new StringBuilder(b.length * 2); for (int i = 0; i < b.length; i++) { int v = b[i] & 0xff; if (v < 16) { sb.append('0'); } sb.append(Integer.toHexString(v)); } return sb.toString().toUpperCase(); }
Можете ли вы, ребята, помочь мне с созданием PHP-скрипта, который возвращает те же результаты?
Пример: открытый текст «STACKOVERFLOW» зашифрован в «FA652ECCDC39A11A93D2458AA2A0793C».
Заранее спасибо!
Это должно сделать это:
function encrypt($plaintext, $key) { $plaintext = pkcs5_pad($plaintext, 16); return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hex2bin($key), $plaintext, MCRYPT_MODE_ECB)); } function decrypt($encrypted, $key) { $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, hex2bin($key), hex2bin($encrypted), MCRYPT_MODE_ECB); $padSize = ord(substr($decrypted, -1)); return substr($decrypted, 0, $padSize*-1); } function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); }
Причина того, что другие алгоритмы PHP, которые вы обнаружили, возвращали разные результаты, вероятно, из-за заполнения. По умолчанию для AES в Java является PKCS5, но PHP не имеет встроенной поддержки для этого (отсюда и функция pkcs5_pad).
Как сказал SLacks, вы действительно не должны использовать ECB. Либо получите код Java, либо измените ваши существующие данные, если потребуется. Пока вы продолжаете использовать ЕЦБ, вы подвергаете риску свои данные.
Кредит: функция заполнения, взятая отсюда .