AES加密算法多编程语言通用写法(aardio,php,c#,java等)
编辑时间:2017-12-18 作者:Jacen.He 浏览量:4096 来源:Jacen.He

不同编程语言中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

来说两句吧