当前位置: 首页 > 知识库问答 >
问题:

用PHP加密,用Javascript解密(cryptojs)

公良扬
2023-03-14

我在基本加密/解密方面遇到了麻烦。我到处找了一个可行的例子,但还没有找到一个可行的例子。

-我将使用php加密,使用cryptojs解密,以获得一个小的安全层

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js">
<?
$text = "this is the text here";
$key = "encryptionkey";

$msgEncrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
$msgBase64 = trim(base64_encode($msgEncrypted));

echo "<h2>PHP</h2>";
echo "<p>Encrypted:</p>";
echo $msgEncrypted;
echo "<p>Base64:</p>";
echo $msgBase64;
 ?>

<p>AES Decrypt</p>
<script> 
    var key = 'encryptionkey';
    var encrypted = "<?php echo $msgBase64 ?>";
    //tried  var base64decode = CryptoJS.enc.Base64.parse(encrypted); 
    var decrypted = CryptoJS.AES.decrypt(encrypted, key);
    console.log( decrypted.toString(CryptoJS.enc.Utf8) );
</script>

共有1个答案

麹权
2023-03-14

我也需要同样的东西,并且编写了一个很短的库,它适用于CryptoJS3.x和支持openssl的PHP。希望对此有所帮助,源代码和示例文件如下https://github.com/brainfolong/cryptojs-aes-php

/**
* Decrypt data from a CryptoJS json encoding string
*
* @param mixed $passphrase
* @param mixed $jsonString
* @return mixed
*/
function cryptoJsAesDecrypt($passphrase, $jsonString){
    $jsondata = json_decode($jsonString, true);
    $salt = hex2bin($jsondata["s"]);
    $ct = base64_decode($jsondata["ct"]);
    $iv  = hex2bin($jsondata["iv"]);
    $concatedPassphrase = $passphrase.$salt;
    $md5 = array();
    $md5[0] = md5($concatedPassphrase, true);
    $result = $md5[0];
    for ($i = 1; $i < 3; $i++) {
        $md5[$i] = md5($md5[$i - 1].$concatedPassphrase, true);
        $result .= $md5[$i];
    }
    $key = substr($result, 0, 32);
    $data = openssl_decrypt($ct, 'aes-256-cbc', $key, true, $iv);
    return json_decode($data, true);
}

/**
* Encrypt value to a cryptojs compatiable json encoding string
*
* @param mixed $passphrase
* @param mixed $value
* @return string
*/
function cryptoJsAesEncrypt($passphrase, $value){
    $salt = openssl_random_pseudo_bytes(8);
    $salted = '';
    $dx = '';
    while (strlen($salted) < 48) {
        $dx = md5($dx.$passphrase.$salt, true);
        $salted .= $dx;
    }
    $key = substr($salted, 0, 32);
    $iv  = substr($salted, 32,16);
    $encrypted_data = openssl_encrypt(json_encode($value), 'aes-256-cbc', $key, true, $iv);
    $data = array("ct" => base64_encode($encrypted_data), "iv" => bin2hex($iv), "s" => bin2hex($salt));
    return json_encode($data);
}
var CryptoJSAesJson = {
    stringify: function (cipherParams) {
        var j = {ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)};
        if (cipherParams.iv) j.iv = cipherParams.iv.toString();
        if (cipherParams.salt) j.s = cipherParams.salt.toString();
        return JSON.stringify(j);
    },
    parse: function (jsonStr) {
        var j = JSON.parse(jsonStr);
        var cipherParams = CryptoJS.lib.CipherParams.create({ciphertext: CryptoJS.enc.Base64.parse(j.ct)});
        if (j.iv) cipherParams.iv = CryptoJS.enc.Hex.parse(j.iv)
        if (j.s) cipherParams.salt = CryptoJS.enc.Hex.parse(j.s)
        return cipherParams;
    }
}
var encrypted = CryptoJS.AES.encrypt(JSON.stringify("value to encrypt"), "my passphrase", {format: CryptoJSAesJson}).toString();
var decrypted = JSON.parse(CryptoJS.AES.decrypt(encrypted, "my passphrase", {format: CryptoJSAesJson}).toString(CryptoJS.enc.Utf8));
$encrypted = cryptoJsAesEncrypt("my passphrase", "value to encrypt");
$decrypted = cryptoJsAesDecrypt("my passphrase", $encrypted);
 类似资料:
  • 问题内容: 我正在使用JavaScript加密用户密码,如下所示: 它工作正常,但现在我正尝试在服务器端的PHP中像这样解密: 它根本不起作用,解密后的密码字符串看起来很奇怪: 有用的注释后,这是我的JavaScript代码的当前状态: 我正在将saltHex和CipherTextHex发送到PHP服务器,并且正在使用mcrypt_decrypt(),如下所示: 仍然无法使用此更新的代码。 有人可

  • null 解密(PHP) $IVSIZE=mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_CBC); $iv=mcrypt_create_iv($ivsize,MCRYPT_RAND); mcrypt_decrypt(MCRYPT_RIJNDAEL_256,'test',$encrypt,MCRYPT_MODE_CBC,$iv);

  • 问题内容: 我想使用公共密钥加密技术在JavaScript中加密,在PHP中解密。我一直在尝试找到可以完成此任务的库,但是遇到了问题。 我目前正在使用 openpgpjs ,但是我需要所有浏览器的支持,甚至测试页在唯一列为受支持的浏览器(Google Chrome)上都有错误。 关于最终目标的注意事项: TCP连接已受SSL保护。 此保护层的主要目的是防御有意或无意的Web服务器日志记录,崩溃转储

  • 问题内容: 有人要求我用PHP解密使用以下Java类加密的字符串。 我不懂Java,因此我需要一些帮助来理解这种加密。 1)这行是什么意思? 2)我应该为第一个参数使用什么值 3)什么时候应该在我的php脚本中使用MD5? 问题答案: 1)它创建用于基于密码的加密的参数,哈希计算中包含的盐和哈希算法执行的迭代次数(在其自身的输出中)。它用于击退彩虹表攻击,基本上,攻击者必须经过相同的迭代次数才能检

  • 我试图通过演示应用程序在as3crypto中加密一个文本。 现在我正试图通过php解密加密的文本,但似乎文本没有正确解密。有人知道如何通过PHP正确解密吗?还是我做错了?请启发我... 这是一个场景: > 在http://crypto.hurlant.com/demo/: 初始化向量:留空 按加密。选择base64并复制密码文本。 制作一个包含以下代码的php脚本并运行它:

  • null 下面是我当前的代码: 以下是我的结果: 原文: 正如您所看到的,加密中缺少几个字符,这也影响了解密。缺的是2号线的v和3号线的v 你知道为什么吗?