AES-CBC加密 以及PHP C#实现

折腾了好多天, 感谢乔楚大侠的帮忙, 终于搞定了 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 的扩展。

            

01 /**
02  * pkcs7补码
03  *
04  * @param string $string  明文
05  * @param int $blocksize Blocksize , 以 byte 为单位
06  *
07  * @return String
08  */
09 function addPkcs7Padding($string$blocksize = 32) {
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  * @param String 明文
20  * @param 加密的初始向量(IV的长度必须和Blocksize一样, 且加密和解密一定要用相同的IV)
21  * @param $key 密钥
22  */
23 function aes256cbcEncrypt($str$iv$key ) {  
24     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, addPkcs7Padding($str) , MCRYPT_MODE_CBC, $iv));
25 }
26  
27 /**
28  * 除去pkcs7 padding
29  *
30  * @param String 解密后的结果
31  *
32  * @return String
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, 0, strlen($string)-$slast);
40         return $string;
41     else {
42         return false;
43     }
44 }
45  
46  
47 /**
48  * 解密
49  *
50  * @param String $encryptedText 二进制的密文
51  * @param String $iv 加密时候的IV
52  * @param String $key 密钥
53  *
54  * @return String
55  */
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));
59 }
60  
61 $e =  aes256cbcEncrypt("the dog pass through the street"'12345678901234561234567890123456','12345678901234561234567890123456');
62 echo $e "<br>";
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)
02 {
03     var aes = new RijndaelManaged();
04     aes.KeySize = 256;
05     aes.BlockSize = 256;
06     aes.Padding = PaddingMode.PKCS7;
07     aes.Key = Key;
08     aes.IV = Iv;
09  
10     var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
11     byte[] xBuff = null;
12     using (var ms = new MemoryStream())
13     {
14         using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
15         {
16             byte[] xXml = Encoding.UTF8.GetBytes(Input);
17             cs.Write(xXml, 0, xXml.Length);
18         }
19  
20         xBuff = ms.ToArray();
21     }
22  
23     String Output = Convert.ToBase64String(xBuff);
24     return Output;
25 }
26  
27 private String AES_decrypt(String Input, byte[] Iv, byte[] Key)
28 {
29     RijndaelManaged aes = new RijndaelManaged();
30     aes.KeySize = 256;
31     aes.BlockSize = 256;
32     aes.Mode = CipherMode.CBC;
33     aes.Padding = PaddingMode.PKCS7;
34     aes.Key = Key;
35     aes.IV = Iv;
36  
37     var decrypt = aes.CreateDecryptor();
38     byte[] xBuff = null;
39     using (var ms = new MemoryStream())
40     {
41         using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
42         {
43             byte[] xXml = Convert.FromBase64String(Input);
44             cs.Write(xXml, 0, xXml.Length);
45         }
46  
47         xBuff = ms.ToArray();
48     }
49  
50     String Output = Encoding.UTF8.GetString(xBuff);
51     return Output;
52 }
正文部分到此结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值