折腾了好多天, 感谢乔楚大侠的帮忙, 终于搞定了 AES - CBC 加密, 特地将加密部分的东西整理一下, 希望能给后人带来一些帮助
【加密规范】:
加密标准:AES
加密算法:CBC
BlockSize:256bit(32byte)
keysize : 256 (32byte)
padding : pkcs7
AES-CBC是一种分段解密的方式,即先把明文分段, 然后再加密, 参数Blocksize 定义每段的大小, 支持 128bit 256 bit , 在分好段之后,最后的一段不一定满一个blocksize, 所以需要先对明文进行补码在加密,pkcs7 的补码方式, 后边会提到。 密钥的长度支持 128 192 和 256.
【pkcs7】
pkcs7 的算法其实比较简单, 完全可以自己封装一个函数:
第一步: 拿到明文的长度 len 和 blocksize (字节)
第二部: 算出最后一段需要补码的长度 paddingLen = len - text % blocsize
第三部: 取得 ASCII 码 为补码长度 paddingLen的字符, 用该字符把最后一段填满就OK了, 详情请参见我的PHP代码
【PHP加密】
PHP要使用加密的函数, 必须安装 mcrypt 的扩展。
09 | function addPkcs7Padding( $string , $blocksize = 32) { |
10 | $len = strlen ( $string ); |
11 | $pad = $blocksize - ( $len % $blocksize ); |
12 | $string .= str_repeat ( chr ( $pad ), $pad ); |
23 | function aes256cbcEncrypt( $str , $iv , $key ) { |
24 | return base64_encode (mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key , addPkcs7Padding( $str ) , MCRYPT_MODE_CBC, $iv )); |
34 | function stripPkcs7Padding( $string ){ |
35 | $slast = ord( substr ( $string , -1)); |
36 | $slastc = chr ( $slast ); |
37 | $pcheck = substr ( $string , - $slast ); |
38 | if (preg_match( "/$slastc{" . $slast . "}/" , $string )){ |
39 | $string = substr ( $string , 0, strlen ( $string )- $slast ); |
56 | function aes256cbcDecrypt( $encryptedText , $iv , $key ) { |
57 | $encryptedText = base64_decode ( $encryptedText ); |
58 | return stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key , $encryptedText , MCRYPT_MODE_CBC, $iv )); |
61 | $e = aes256cbcEncrypt( "the dog pass through the street" , '12345678901234561234567890123456' , '12345678901234561234567890123456' ); |
63 | echo aes256cbcDecrypt( $e , '12345678901234561234567890123456' , '12345678901234561234567890123456' ); |
【C#加密】
C# 比较爽自带的有 AES-CBC加密的类, 只需要 using System.Security.Cryptography; 就行了
01 | private String AES_encrypt(String Input, byte[] Iv, byte[] Key) |
03 | var aes = new RijndaelManaged(); |
06 | aes.Padding = PaddingMode.PKCS7; |
10 | var encrypt = aes.CreateEncryptor(aes.Key, aes.IV); |
12 | using (var ms = new MemoryStream()) |
14 | using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write)) |
16 | byte[] xXml = Encoding.UTF8.GetBytes(Input); |
17 | cs.Write(xXml, 0, xXml.Length); |
23 | String Output = Convert.ToBase64String(xBuff); |
27 | private String AES_decrypt(String Input, byte[] Iv, byte[] Key) |
29 | RijndaelManaged aes = new RijndaelManaged(); |
32 | aes.Mode = CipherMode.CBC; |
33 | aes.Padding = PaddingMode.PKCS7; |
37 | var decrypt = aes.CreateDecryptor(); |
39 | using (var ms = new MemoryStream()) |
41 | using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write)) |
43 | byte[] xXml = Convert.FromBase64String(Input); |
44 | cs.Write(xXml, 0, xXml.Length); |
50 | String Output = Encoding.UTF8.GetString(xBuff); |
正文部分到此结束