DES加密算法不同编程语言通用写法(aardio,php,c#,java等)
编辑时间:2017-12-18 作者:Jacen.He 浏览量:3663 来源:http://bbs.aardio.com/forum.ph

不同编程语言中AES加解密结果要保持一致要注意以下一些要点:

不同编程语言中AES加解密结果要保持一致要注意以下一些要点:
1、工作模式CBC,填充模式PKCS5,不同语言要保持一致。 2、在下面的示例中,加密向量统一设为与密钥相同。
3、不同编程语言使用的文本编码要一致,同一个字符串,使用UTF8或GBK编码在内存中存储的实际数据可能是不一样的。在aardio中默认编码为UTF-8,使用 string.fromto进行转换为其他编码。
4、如果加密后返回的密文用了BASE64或16进制编码,那么在解密时同样也先做对应的逆向解码。
先看aardio实现AES加密、解密的代码:

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版本:

<?
class CryptDes
{
    public $key = "";
    public $iv = "\x12\x34\x56\x78\x90\xAB\xCD\xEF";
    public function init_crypt($key)
    {
        $this->key = $key; 
    }
    public function encrypt($str)
    { 
        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
        $str = $this->pkcs5Pad($str, $size);
        $hexString = bin2hex(mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv));
        return strtoupper($hexString);
    }
    public function decrypt($str)
    { 
        $strBin = $this->hex2bin(strtolower($str));
        $str = mcrypt_cbc(MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv);
        $str = $this->pkcs5Unpad($str);
        return $str;
    }
    public function hex2bin($hexData)
    {
        $binData = '';
        for ($i = 0; $i < strlen($hexData); $i += 2) {
            $binData .= chr(hexdec(substr($hexData, $i, 2)));
        }
        return $binData;
    }
    public function pkcs5Pad($text, $blocksize)
    {
        $pad = $blocksize - strlen($text) % $blocksize;
        return $text . str_repeat(chr($pad), $pad);
    }
    public function pkcs5Unpad($text)
    {
        $pad = ord($text[strlen($text) - 1]);
        if ($pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, -1 * $pad);
    }
} 
$des = new CryptDes(); 
$des->init_crypt("abcd1234"); 
$sstr = $des->encrypt("def测试"); //加密
$str = $des->decrypt($sstr); //解密
echo $sstr;
?>

注意上面的PHP版本将加密结果转换为了16进制字符,

在aardio中使用 crypt.bin.decodeHex() 函数转回来, 注意aardio10使用UTF8编码,上面的PHP文件也应该存为UTF8编码,如果PHP使用GBK编码,那么相应的在aardio中也要做GBK编码转换。

import console; 

import crypt.des; 
var des = crypt.des(); 
des.setPassword("abcd1234" ) 

var phpsstr = "077E5E400A140170";//服务端返回的加密数据
phpsstr = string.unhex( phpsstr,"" ); //十六进制解码

var str = des.decrypt(phpsstr) ; //DES解码
str = string.fromto(str,0,65001) //PHP页面使用了UTF8,用这句转回来

console.log( str ) 
console.pause()


转帖于:http://bbs.aardio.com/forum.php?mod=viewthread&tid=13148&extra=page%3D1

后面c#的,java的我就不转了。

来说两句吧