AES-CBC加密 以及PHP C#实现
2014-09-11 15:15
681 查看
折腾了好多天,感谢乔楚大侠的帮忙,终于搞定了AES-CBC加密,特地将加密部分的东西整理一下,希望能给后人带来一些帮助
【加密规范】:
加密标准:AES
加密算法:CBC
BlockSize:256bit(32byte)
keysize:256(32byte)
padding:pkcs7
AES-CBC是一种分段解密的方式,即先把明文分段,然后再加密,参数Blocksize定义每段的大小,支持128bit256bit,在分好段之后,最后的一段不一定满一个blocksize,所以需要先对明文进行补码在加密,pkcs7的补码方式,后边会提到。密钥的长度支持128192和256.
【pkcs7】
pkcs7的算法其实比较简单,完全可以自己封装一个函数:
第一步:拿到明文的长度len和blocksize(字节)
第二部:算出最后一段需要补码的长度paddingLen=len-text%blocsize
第三部:取得ASCII码为补码长度paddingLen的字符,用该字符把最后一段填满就OK了,详情请参见我的PHP代码
【PHP加密】
PHP要使用加密的函数,必须安装mcrypt的扩展。
【C#加密】
C#比较爽自带的有AES-CBC加密的类,只需要usingSystem.Security.Cryptography;就行了
正文部分到此结束
【加密规范】:
加密标准:
加密算法:
BlockSize:256bit(32byte)
keysize:256(32byte)
padding:pkcs7
AES-CBC是一种分段解密的方式,即先把明文分段,然后再加密,参数Blocksize定义每段的大小,支持128bit256bit,在分好段之后,最后的一段不一定满一个blocksize,所以需要先对明文进行补码在加密,pkcs7的补码方式,后边会提到。密钥的长度支持128192和256.
【pkcs7】
pkcs7的算法其实比较简单,完全可以自己封装一个函数:
第一步:拿到明文的长度len和blocksize(字节)
第二部:算出最后一段需要补码的长度paddingLen=len-text%blocsize
第三部:取得ASCII码为补码长度paddingLen的字符,用该字符把最后一段填满就OK了,详情请参见我的PHP代码
【PHP加密】
PHP要使用加密的函数,必须安装mcrypt的扩展。
01 | /** |
02 | * pkcs7补码 |
03 | * |
04 | * |
05 | * |
06 | * |
07 | * |
08 | */ |
09 | function addPkcs7Padding( $string , $blocksize = |
10 | $len = strlen ( $string ); //取得字符串长度 |
11 | $pad = $blocksize - ( $len % $blocksize ); //取得补码的长度 |
12 | $string .= str_repeat ( chr ( $pad ), $pad ); //用ASCII码为补码长度的字符, 补足最后一段 |
13 | return $string ; |
14 | } |
15 |
16 | /** |
17 | * 加密然后base64转码 |
18 | * |
19 | * |
20 | * |
21 | * |
22 | */ |
23 | function aes256cbcEncrypt( $str , $iv , $key ) { |
24 | return base64_encode (mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key , addPkcs7Padding( $str ) $iv )); |
25 | } |
26 |
27 | /** |
28 | * |
29 | * |
30 | * |
31 | * |
32 | * |
33 | */ |
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 , strlen ( $string )- $slast ); |
40 | return $string ; |
41 | } else { |
42 | return false; |
43 | } |
44 | } |
45 |
46 |
47 | /** |
48 | * 解密 |
49 | * |
50 | * |
51 | * |
52 | * |
53 | * |
54 | * |
55 | */ |
56 | function aes256cbcDecrypt( $encryptedText , $iv , $key ) { |
57 | $encryptedText = base64_decode ( $encryptedText ); |
58 | return stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key , $encryptedText , $iv )); |
59 | } |
60 |
61 | $e = aes256cbcEncrypt( "the , '12345678901234561234567890123456' , '12345678901234561234567890123456' ); |
62 | echo $e , "<br>" ; |
63 | echo aes256cbcDecrypt( $e , '12345678901234561234567890123456' , '12345678901234561234567890123456' ); |
C#比较爽自带的有
01 | private |
02 | { |
03 | var |
04 | aes.KeySize |
05 | aes.BlockSize |
06 | aes.Padding |
07 | aes.Key |
08 | aes.IV |
09 |
10 | var |
11 | byte[] |
12 | using |
13 | { |
14 | using |
15 | { |
16 | byte[] |
17 | cs.Write(xXml, |
18 | } |
19 |
20 | xBuff |
21 | } |
22 |
23 | String |
24 | return Output; |
25 | } |
26 |
27 | private |
28 | { |
29 | RijndaelManaged |
30 | aes.KeySize |
31 | aes.BlockSize |
32 | aes.Mode |
33 | aes.Padding |
34 | aes.Key |
35 | aes.IV |
36 |
37 | var |
38 | byte[] |
39 | using |
40 | { |
41 | using |
42 | { |
43 | byte[] |
44 | cs.Write(xXml, |
45 | } |
46 |
47 | xBuff |
48 | } |
49 |
50 | String |
51 | return Output; |
52 | } |
相关文章推荐
- AES-CBC加密 以及PHP C#实现
- javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现
- C#实现微信AES-128-CBC加密数据的解密
- C#实现DES加密解密,AES加密解密
- C#实现AES加密和解密函数
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- 使用C#实现AES加密解密
- C#实现AES加密和解密函数原代码
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- NET实现RSA AES DES 字符串 加密解密以及SHA1 MD5加密
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- 用C#实现AES加密和解密
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
- IOS 与 PHP 通信加密,使用AES 128 CBC no padding
- php实现aes加密类分享
- php实现弗吉尼亚算法加密解密以及重合指数分析
- C#实现AES加密解密