使用CryptoJS和PHP进行AES加密

Shasha

我想使用JavaScript实现AES加密。使用的AES CBC模式。我已经设法在PHP中做到这一点。看起来像:

 public function encrypt($value) {
        if (empty($value)) {
          return $value;
        }
        $value = Unicode::convertToUtf8($value, 'UTF-8');
        if ($key = $this->getEncryptionKey()) {
          // Generates from key 1st 16 bytes.
          $iv = mb_substr($key, 0, 16);
          //encrypt message with key
          $message = openssl_encrypt($value, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
          return base64_encode($message);
        }
    }

    public function getEncryptionKey() {
        $key = 'secret';
        $key = Unicode::convertToUtf8($key, 'UTF-8');

        // Make sure the key is the correct size.
        if (strlen($key) < 32) {
          $key = str_pad($key, 32, "\0");
        }

        if (strlen($key) > 32) {
          $key = mb_substr($key, 0, 32);
        }

        return $key;
    }

如果我给$ value = retest2; 它给了我ukUCH0SvgdmM8vTqQumAVg ==输出

我知道这是正确的,我也使用C#尝试了同样的结果。但是,当我尝试使用JavaScript复制此代码时,我无法产生相同的PHP输出。以下是我尝试过的javascript代码:

const message = utf8.encode('retest2');
const password = utf8.encode('secret').padEnd(32, '\0');
const key =  CryptoJS.enc.Hex.parse(password);
const iv =  CryptoJS.enc.Hex.parse(password.substring(0, 16));

const encrypted = CryptoJS.AES.encrypt(message, key, {
    iv: iv
});
console.log(btoa(encrypted.toString()));

使用相同的值,我得到dzd4bjNwenduQT09我还阅读了关于同一主题的其他类似问题,但似乎无法弄清楚哪里出了问题?谢谢!

香基

正如@symcbean所说,

您不应将密钥或从密钥派生的数据用作初始化向量。

我认为,您别无选择,您必须使用从中派生的密钥或数据作为初始化向量。

几个月前,我遇到了完全相同的情况,我做了类似的事情,

const message = 'retest2';
let password = 'secret';
if (password.length < 32) {
    password = password.padEnd(32, '\0');
}
const iv = CryptoJS.enc.Utf8.parse(password.substring(0, 16));
password = CryptoJS.enc.Utf8.parse(password);
const encrypted = CryptoJS.AES.encrypt((message), (password), {
    iv: iv
});
console.log(CryptoJS.enc.Base64.stringify(encrypted.ciphertext));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Go和PHP进行AES加密

使用 CryptoSwift 和 CryptoJS 的 AES 加密

使用CryptoJS的AES加密

使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

使用CryptoJS进行AES加密并使用CodeIgniter进行解密

CryptoJS使用密码对AES进行加密,但PHP解密需要一个密钥

使用CryptoJS在javascript中进行AES加密/解密

使用CryptoJS在Java中进行AES加密并在JavaScript中进行解密

使用CryptoJS(JAVASCRIPT)和OpenSSL(PHP)实现相同的加密

如何使用密钥大小为128的CryptoJS在AES中进行加密?

CryptoJs-通过PHP和Javascript进行加密/解密-简单的输出加密字符串

在浏览器的Node和CryptoJS之间使用AES加密时的问题

AES-256 CBC加密在Ruby / PHP中成功,但是使用CryptoJS解密失败

使用CryptoJS进行OpenSSL加密-解密

使用RSA和AES进行加密/解密;标准?

使用openssl和PyCrypto进行AES_128_CTR加密

使用phpseclib进行RSA和AES混合加密/解密失败

Go中的AES-CTR加密和CryptoJS中的解密

使用AES进行视频加密

CryptoJS AES解密用PHP openssl_encrypt加密的消息

使用CryptoJS加密并使用PHP解密

如何使用CryptoJs正确加密AES256的方法

在 C# 中使用 MD5 和 SHA256 的 CryptoJS AES 加密未生成正确的值

如何使用phpseclib进行加密和使用AES算法使用Java进行解密

使用AES进行Rails加密,过于复杂

使用AES进行文件加密解密

使用CommonCrypto进行Swift AES加密

使用OpenSSL / AES进行网络加密的说明

使用C#进行AES加密