首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CryptoJS实现javascript中的AES加密/解密

用CryptoJS实现javascript中的AES加密/解密
EN

Stack Overflow用户
提问于 2014-02-15 23:06:39
回答 1查看 4.6K关注 0票数 1

我试图使用共享秘密在javascript和php之间发送AES加密消息。在Javascript中,我使用的是CryptoJS库。在php中,我使用的是mycrypt。我试图在javascript中构造一个加密消息,然后使用共享秘密在php中解密它。我可以加密和解密Javascript中的消息。我可以在php中加密和解密相同的消息,但两者之间的加密并不相同。

Javascript

代码语言:javascript
复制
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
alert(encrypted);

给出

U2FsdGVkX18+k3pba4l4MbGZfmDjMc1yQ6uj1fg+BGo=

In php

代码语言:javascript
复制
<?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=

解密:消息

我的问题是,为什么这些不一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21804911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档