【发布时间】:2014-02-15 23:06:39
【问题描述】:
我正在尝试使用共享密钥在 javascript 和 php 之间发送 AES 加密消息。在 Javascript 中,我使用的是 CryptoJS 库。在 php 中,我使用的是 mycrypt。我正在尝试在 javascript 中构造一条加密消息,然后使用共享密钥在 php 中对其进行解密。我可以用 Javascript 加密和解密消息。我可以在 php 中加密和解密相同的消息 - 但两者之间的加密方式不同。
Javascript
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
alert(encrypted);
给予
U2FsdGVkX18+k3pba4l4MbGZfmDjMc1yQ6uj1fg+BGo=
在php中
<?php
$Pass = "Secret Passphrase";
$Clear = "Message";
$crypted = fnEncrypt($Clear, $Pass);
echo "Encrypted: ".$crypted."</br>";
$newClear = fnDecrypt($crypted, $Pass);
echo "Decrypted: ".$newClear."</br>";
function fnEncrypt($sValue, $sSecretKey) {
return rtrim(
base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$sSecretKey, $sValue,
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
)
),"\0"
);
}
function fnDecrypt($sValue, $sSecretKey) {
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$sSecretKey,
base64_decode($sValue),
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
),"\0"
);
}
输出是
加密:iqJ0R5ahRP7GpWKtW7+OBSCGnudDr99VbJC36OQlmgE=
解密:消息
我的问题是,为什么这些不一样?
【问题讨论】:
-
php 是 ascii 而 js 是 unicode,所以即使字符串看起来它们具有相同的二进制模式,但它们没有,并且当您将这些位混淆时,差异变得明显。 php可以做unicode了吗?
-
php 基本上对 unicode 保持沉默。字符串只是字符的“字符串”(哈哈)。这些字符是 1byte-per-char ascii 还是像 utf16 或 utf8 这样的多字节不是 PHP 的工作要弄清楚。
标签: javascript php security encryption cryptography