簡體   English   中英

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

[英]AES encryption/decryption in javascript using CryptoJS

我正在嘗試使用共享密鑰在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加密方式(使用EBC模式),您將始終獲得相同的結果。 您可以在http://en.wikipedia.org/wiki/Cipher_block_chaining#Electronic_codebook_.28ECB.29上查看燕尾服的特性,以查看為什么這是一個問題。

CryptoJS似乎使用CBC作為默認的分組密碼模式(至少他們在https://code.google.com/p/crypto-js/#Block_Modes_and_Padding中這樣說),它具有一個隨機的初始向量。 這比CBC好。

結果應該是相同的,如果您使用相同的密碼,相同的分組密碼模式(例如CBC)以及相同的密鑰和IV(當然還有相同的純文本),則注釋表明也可能存在unicode問題。

此外,MCRYPT_RIJNDAEL_256不是AES。 AES的BLOCK大小為16字節-AES-128的KEY大小為16字節,AES-256的KEY大小為32字節。 MCRYPT_RIJNDAEL_256的BLOCK大小為32字節-差異很大。

最后一點:加密數據還不夠! 您還必須通過使用HMAC或使用經過身份驗證的塊密碼模式(例如GCM)對它進行身份驗證-如果不這樣做,則可能至少會遭受填充oracle攻擊: http : //en.wikipedia.org /維基/ Padding_oracle_attack

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM