我在基本的加密/解密方面有问题。我到处寻找一个有效的例子,但还没有找到一个有效的例子。
-I将使用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>
我漏掉了哪一步?
发布于 2014-12-21 00:44:52
我也需要同样的东西,我写了一个简短的库,适用于CryptoJS 3.x和支持openssl。希望这能对你有所帮助,这里是https://github.com/brainfoolong/cryptojs-aes-php的源码和示例文件
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);
}
Javascript库
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;
}
}
示例Javascript
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));
示例PHP
$encrypted = cryptoJsAesEncrypt("my passphrase", "value to encrypt");
$decrypted = cryptoJsAesDecrypt("my passphrase", $encrypted);
发布于 2019-01-31 16:49:29
不要过于专注于编码,只要使用base64解码器即可
在php代码中:
$encrypt_val=base64_encode("value");
而在js上只需:
var my_orignal_val = window.atob(passed_val);
这将足以满足您的需求。
发布于 2014-06-21 23:35:53
您正在使用两个库,这两个库试图容纳严格地说是无效的输入。Rijndael需要16、24或32字节长的随机字节串的密钥。您需要提供一个13个字符的字符串。PHP库Mcrypt直接使用字符串(可能是utf8编码的)作为二进制输入,使用zero pads it to the required 32 bytes作为MCRYPT_RIJNDAEL_256
。另一方面,CryptoJS是decides that you have entered something like a passphrase and instead uses a key derivation function to generate a 32 byte key。
此外,使用的加密算法甚至不匹配。Mcrypt为256位版本使用了原始Rijndael的一个很少实现的变体,而CryptoJS实现了Rijndael提案的广为人知的变体AES256。不过,这两个版本(MCRYPT_RIJNDAEL_128
和AES128)的128位版本是相同的。
稍后您将面临的第三个问题是,Mcrypt还使用了一种疯狂的填充方案来加密数据。由于Rijndael是块密码,它只能加密16、24或32字节的块(取决于变体- AES总是使用16字节的块)。因为这样的数据必须被填充。Mcrypt以一种非注入的方式做到这一点,只需附加零。如果你只编码字符串,这对你来说不是什么大问题,因为utf8编码的字符串从来不包含零字节,所以你可以直接去掉它们(CryptoJS even supports that natively)。
解决所有这些问题的最简单的方法是避免自己实现任何密码学(在没有广泛的主题知识的情况下,无论如何都强烈建议这样做)。您是否可以通过https传输您的敏感信息,https将使用TLS (以前称为SSL)来加密和验证通道?
https://stackoverflow.com/questions/24337317
复制相似问题