首页 > 解决方案 > 使用php解密AES中的字符串

问题描述

我目前正在研究加密和解密。我已经使用https://medium.com/@amitasaurus/encrypting-decrypting-a-string-with-aes-js-1d9efa4d66d7加密了我的 api 密钥,如下所示

            var api_key = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
            var d = new Date();
            var n = d.getTime();
            var final_key = api_key+'/'+n;
            var encrypted = CryptoJS.AES.encrypt('encryption', final_key);
            var encrypted_key = encrypted.toString();

并将加密的密钥传递给服务器端。我用了

<?php
$key = pack("H*", "0123456789abcdef0123456789abcdef");
$iv =  pack("H*", "abcdef9876543210abcdef9876543210");
$encrypted = base64_decode('U2FsdGVkX19gHSzwsrc5H9K6rqDYr2E8oYoVNSp8INU=');
$decrypt_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
echo $decrypt_string;

?> 用于解密加密的字符串。当我打印解密的字符串时,就像这样 ��9Һ��دa<��5*| աT�;��놻��V�[�}��ID-�}��硵� 有什么建议打印为解码字符串吗?

标签: phpencryptionaes

解决方案


mcrypt默认为零填充。这意味着,无论您使用哪种密文和密钥组合,unpadding都不会失败。相反,它只是返回无效的随机明文。

CryptoJS 默认使用从给定密码派生的 OpenSSL 密钥。只要您不能模仿 CryptoJS 生成的最终 AES 密钥值,您的解密将返回随机明文。

GCM等现代模式在密文中包含一个身份验证标签,以确保密文/密钥组合的有效性,否则将产生验证错误。请注意,当直接用于传输模式安全时,CBC 模式绝对不安全。


推荐阅读