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