【发布时间】:2018-01-24 07:04:12
【问题描述】:
我正在尝试使用 JavaScript 复制 PHP 字符串加密。这是PHP代码:
<?php
$iv = "1234567890123456";
$key = "aaaaaaaaaaaaaaaa";
$input = "texttexttexttext";
$encrypted = openssl_encrypt($input, "AES-256-CBC", $key, 0, $iv);
echo $encrypted;
// "ZwY1i+vqP3acszeDiscCTx/R4a6d2AtkcInmN9OTCNE="
但是,当我尝试在 JavaScript 中复制它时,它会给出不同的密文:
var aesjs = require("aes-js");
var base64 = require("js-base64");
var iv = aesjs.utils.utf8.toBytes("1234567890123456");
var key = aesjs.utils.utf8.toBytes("aaaaaaaaaaaaaaaa");
var text = aesjs.utils.utf8.toBytes("texttexttexttext");
var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv);
var encryptedBytes = aesCbc.encrypt(text);
var b64encoded = base64.Base64.encode(encryptedBytes);
console.log(b64encoded);
// "MTcyLDIsNjAsMTU5LDcxLDEwLDE4Myw4LDE…wyMTIsMjIyLDk3LDEyNCw1MywxNzIsMjIy"
我不知道如何让它提供相同的输出。有什么想法吗?
【问题讨论】:
-
MTcyLDIsNjAsMTU5LDcxLDEwLDE4Myw4LDE…解码为172,2,60,159,71,10,183,8,1…。看起来base64.Base64.encode()编码了encryptedBytes的字符串表示。如果你尝试console.log(encryptedBytes.toString('base64'));,输出是什么? -
只是一个想法:在 PHP 中,您明确使用 256 位密钥。使用 aesjs,密钥长度似乎由密钥变量的字节数/位数决定 - 在您的情况下,它是 16*8 = 128 位而不是 256 位。
标签: javascript php encryption aes