不同编程语言中DES加解密结果要保持一致要注意以下一些要点:
1、工作模式CBC,填充模式PKCS5,不同语言要保持一致。
2、向量要一致,默认使用'\x12\x34\x56\x78\x90\xAB\xCD\xEF'
3、密钥要一致,DES密钥为8位,3DES可以使用24位密钥
4、使用的文本编码要一致,同一个字符串,使用UTF8或GBK编码在内存中存储的实际数据可能是不一样的。在aardio中使用 string.fromto进行转换。
5、如果加密后返回的密文用了BASE64或16进制编码,那么在解密时同样也先做对应的逆向解码。
首先看aardio加解密
import console;
import crypt.bin;
import crypt.aes;
//创建AES加密算法容器
var aes = crypt.aes();
//设置密钥(最大32个字节)
aes.setPassword("1234567812345678");
//加密
var str = aes.encrypt("Test String");
//BASE64编码加密结果
console.log( crypt.bin.encodeBase64( str ) );
//解密
str = aes.decrypt(str);
console.log(str);
console.pause(true);php实现加解密
import console;
import php;
php.code =/***
//AES加密
function aes_encrypt($encryptKey,$encryptStr) {
$localIV = $encryptKey;
$encryptKey = $encryptKey;
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $encryptKey, $localIV);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($encryptStr) % $block);
$encryptStr .= str_repeat(chr($pad), $pad);
$encrypted = mcrypt_generic($module, $encryptStr);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return base64_encode($encrypted);
}
//AES解密
function aes_decrypt($encryptKey,$encryptStr) {
$localIV = $encryptKey;
$encryptKey = $encryptKey;
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $encryptKey, $localIV);
$encryptedData = base64_decode($encryptStr);
$encryptedData = mdecrypt_generic($module, $encryptedData);
$e = ord($encryptedData[strlen($encryptedData)-1]);
if($e<=16)$encryptedData=substr($encryptedData, 0,strlen($encryptedData)-$e);
return $encryptedData;
}
$result = aes_encrypt("1234567812345678",'Test String');
$decryptString = aes_decrypt("1234567812345678",$result);
echo $result;
echo $decryptString;
***/
php.print = function( msg ) {
console.log("echo:", msg)
}
php.exec( php.code );
console.pause();因为PHP7.1废弃了mcrypt,所以写法不一样, 要保持加解密结果与上面的aardio代码一致,需要这样写
<?php
//AES加密
function aes_encrypt($key,$str)
{
return base64_encode( openssl_encrypt($str, 'AES-128-CBC',$key,OPENSSL_RAW_DATA,$key) );;
}
//AES解密
function aes_decrypt($key,$str)
{
return openssl_decrypt(base64_decode($str), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $key);
}
$result = aes_encrypt("1234567812345678",'Test String');
$str = aes_decrypt("1234567812345678",$result);
echo $result."<br>";
echo $str;
?>转帖于:http://bbs.aardio.com/forum.php?mod=viewthread&tid=13818