我试图使用共享秘密在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=
In 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=
解密:消息
我的问题是,为什么这些不一样?
发布于 2014-02-19 16:09:48
如果它们是一样的话,这将是一个冷冻灾难..。
但是:使用您使用PHP加密的方式(使用EBC模式),您将得到相同的结果。看看.28ECB.29的燕尾服,你就会明白为什么这是个问题。
CryptoJS似乎使用CBC作为默认的分组密码模式(至少在Padding中是这样说的),它有一个随机的初始向量。这比CBC好。
结果应该是相同的,如果您使用相同的密码、相同的分组密码模式(例如CBC)和相同的密钥和IV --当然还有相同的明文--注释表明也可能存在unicode问题。
此外,MCRYPT_RIJNDAEL_256不是AES。AES的块大小为16字节-- AES-128的密钥大小为16字节,AES-256的密钥大小为32字节。MCRYPT_RIJNDAEL_256的块大小为32字节--这是一个很大的差别。
最后一个注意事项:加密数据是不够的!您还必须通过使用HMAC或使用GCM等经过身份验证的分组密码模式对其进行身份验证--如果不这样做,您可能至少容易受到填充oracle攻击:attack。
https://stackoverflow.com/questions/21804911
复制相似问题