使用Java和PHP进行AES加密

我最近在Java中使用AES算法来加密文本。 现在我需要在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算法返回不同结果的原因可能是因为填充。 Java中AES的默认值是PKCS5,但PHP没有本机支持(因此pkcs5_pad函数)。

正如SLacks所说,你真的不应该使用ECB。 如果需要,可以更改Java代码或重新加密现有数据。 只要您继续使用ECB,就会使您的数据面临风险。

Credit:Padding函数取自此处 。