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加密解密方式
View Code
ios,java,c#文章例子:
http://blog.csdn.net/j_akill/article/details/44079597
https://my.oschina.net/Jacker/blog/86383
不适用于 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
相关文章推荐
- IOS 与 PHP 通信加密,使用AES 128 CBC no padding
- IOS 与 PHP 通信加密,使用AES 128 CBC no padding
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES-CBC加密 以及PHP C#实现
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现【多种语言AES/CBC/PKCS5Padding通用加解密数据】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- JavaScript的CryptoJS AES/ECB/NoPadding加密,可与JAVA objective-c 进行同步加解密
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES-CBC加密 以及PHP C#实现