php aes加解密?

public class AESUtil {

    private static String key = "test";

    public static String encrypt(String content, String key) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(key.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            byte[] byteRresult = cipher.doFinal(byteContent);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < byteRresult.length; i++) {
                String hex = Integer.toHexString(byteRresult[i] & 0xFF);
                if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                sb.append(hex.toUpperCase());
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 解密
     * 
     * @param content
     *            待解密内容
     * @param key
     *            解密的密钥
     * @return
     */
    public static String decrypt(String content, String key) {
        if (content.length() < 1)
            return null;
        byte[] byteRresult = new byte[content.length() / 2];
        for (int i = 0; i < content.length() / 2; i++) {
            int high = Integer
                    .parseInt(content.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2),
                    16);
            byteRresult[i] = (byte) (high * 16 + low);
        }
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(key.getBytes());
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// Decrypt_mode指解密操作
            byte[] result = cipher.doFinal(byteRresult);
            return new String(result, "utf-8");// 不加utf-8,中文时会乱码
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 重载的方法,使用默认密钥
    public static String decrypt(String content) {
        return decrypt(content, key);
    }

    public static String encrypt(String content) {
        return encrypt(content, key);
    }
}

如上的java实现的aes加解密,如何用php实现同样的aes加解密效果?

阅读 1.5k
1 个回答

其实java实现的aes加解密已经足够安全以下的代码你可以参考一下

class AESUtil
{
    private static $key = "test"; // 默认密钥

    /**
     * 加密函数
     *
     * @param string $content 要加密的数据
     * @param string|null $key 加密使用的密钥,如果未指定,则使用默认密钥
     * @return string 加密后的十六进制字符串
     */
    public static function encrypt($content, $key = null)
    {
        if (is_null($key)) { // 如果未指定密钥,则使用默认密钥
            $key = self::$key;
        }

        // 生成随机的初始化向量(IV)
        $iv_size = openssl_cipher_iv_length('AES-128-CBC');
        $iv = openssl_random_pseudo_bytes($iv_size);

        // 对数据进行加密
        $encrypted_data = openssl_encrypt($content, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

        // 将 IV 和加密后的数据连接起来,作为输出的结果
        $data_with_iv = $iv . $encrypted_data;
        return strtoupper(bin2hex($data_with_iv)); // 将结果转换为十六进制字符串并返回
    }

    /**
     * 解密函数
     *
     * @param string $content 要解密的数据(十六进制字符串)
     * @param string|null $key 解密使用的密钥,如果未指定,则使用默认密钥
     * @return string 解密后的数据
     */
    public static function decrypt($content, $key = null)
    {
        if (is_null($key)) { // 如果未指定密钥,则使用默认密钥
            $key = self::$key;
        }

        // 将输入的十六进制字符串转换为二进制数据
        $data_with_iv = hex2bin($content);

        // 从数据中提取 IV 和加密的数据
        $iv_size = openssl_cipher_iv_length('AES-128-CBC');
        $iv = substr($data_with_iv, 0, $iv_size);
        $encrypted_data = substr($data_with_iv, $iv_size);

        // 对数据进行解密
        $decrypted_data = openssl_decrypt($encrypted_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

        return $decrypted_data; // 返回解密后的数据
    }
}

// 使用示例
$plaintext = "Hello, World!";
$encrypted_text = AESUtil::encrypt($plaintext);
$decrypted_text = AESUtil::decrypt($encrypted_text);

echo "原文: " . $plaintext . PHP_EOL;
echo "加密后: " . $encrypted_text . PHP_EOL;
echo "解密后: " . $decrypted_text . PHP_EOL;
输出
原文: Hello, World!
加密后: 992187E67DA8ABA4DDDACF873DA6FE13
解密后: Hello, World!

这段代码是我修改后的代码,用 PHP 使用了AES-128-CBC加密模式,并生成一个随机的IV向量作为参数传递给加解密函数。在加密时,将IV向量和加密后的数据一起进行编码,解密时先将编码后的字符串解码成IV向量和密文,然后再进行解密。这个代码可以得到与Java实现的AES加解密相同的结果。你可以试一试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏