2

我最近在 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”。

提前致谢!

4

1 回答 1

3

这应该这样做:

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,您的数据就会面临风险。

信用:从这里获取的填充功能。

于 2013-07-24T15:13:10.697 回答