您的位置:首页 > Web前端 > JavaScript

javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子

2017-11-21 11:31 1026 查看
运行环境 php7.0

不适用于 php7.0以上版本,因为mcrypt_encrypt()函数已删除

为何要采用 no padding 这种形式:

AES加密如果原输入数据不够16字节的整数位,就要补齐,如果采用

pkcs7或者pkcs5这种加密方式,末端添加的数据可能是0x1,0x2,0x3,不固定,

在解码后需要把末端多余的字符去掉,就显得比较棘手。

如果不管补齐多少位,末端都是'\0',去掉的话比较容易操作。

PHP的AES加密填充只有ZeroPadding(补零 - 因为数据长度不是16的整数倍就需要填充)

好了,再次确认一下,这里使用的是 AES128 CBC no padding加密解密方式

<?php

header("Content-type: text/html; charset=utf-8");
date_default_timezone_set('Asia/Shanghai');

const key_prefix = 'key1234567812345678';
const iv_prefix = 'iv1234567812345678';
const padding = '0000000000000000000';      //补充位数
const token = 'token';
/**
* AES加密
*/
function strEncode($data) {
//需要是16位
$key = substr(key_prefix.token . padding,0,16);
$iv = substr(iv_prefix .token . padding,0,16);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted);
}

/*
* AES解密
*/
function strDecode($encrypted){
//需要是16位
$key = substr(key_prefix . token . padding,0,16);
$iv = substr(iv_prefix . token . padding,0,16);
$encryptedData = base64_decode($encrypted);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encryptedData, MCRYPT_MODE_CBC, $iv);

return $decrypted;
}
$data = 'Test String+啊';
$encodeData = strEncode($data);
$decodeData = strDecode($encodeData);

echo '<pre>';
print_r([
'加密语言'=>'php',
'加密方法'=>'AES128 CBC no padding',
'加密内容'=>$data,
'加密密文'=>$encodeData,
'解密明文'=>$decodeData,
]);
echo '<br>';
echo '<br>';
?>

<script src="aes.js"></script>
<script src="pad-zeropadding.js"></script>
<script>
var data = "Test String+啊";
var token = 'token';
var padding = '0000000000000000000';
var temp_key = 'key1234567812345678'+token+padding;
var temp_iv = 'iv1234567812345678'+token+padding;
//需要是16位
var key  = CryptoJS.enc.Latin1.parse(temp_key.substring(0,16));
var iv   = CryptoJS.enc.Latin1.parse(temp_iv.substring(0,16));
//加密
var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});

//解密
var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
var decodeData = decrypted.toString(CryptoJS.enc.Utf8);

/*document.write(encrypted.ciphertext);
document.write('<br/>');
document.write(encrypted.key);
document.write('<br/>');
document.write(encrypted.iv);
document.write('<br/>');
document.write(encrypted.salt);*/
document.write('加密语言:javascript');
document.write('<br/>');
document.write('加密内容:'+data);
document.write('<br/>');
document.write('加密密文:'+encrypted);
document.write('<br/>');
document.write('解密明文:'+decodeData);
document.write('<br/>');

</script>


aes.js


/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
/**
* Zero padding strategy.
*/
CryptoJS.pad.ZeroPadding = {
pad: function (data, blockSize) {
// Shortcut
var blockSizeBytes = blockSize * 4;

// Pad
data.clamp();
data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
},

unpad: function (data) {
// Shortcut
var dataWords = data.words;

// Unpad
var i = data.sigBytes - 1;
while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
i--;
}
data.sigBytes = i + 1;
}
};


View Code
ios,java,c#文章例子:

http://blog.csdn.net/j_akill/article/details/44079597

https://my.oschina.net/Jacker/blog/86383
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐