AES-CBC加密 以及PHP C#实现
来源:互联网 发布:网络零售商 编辑:程序博客网 时间:2024/05/22 11:35
折腾了好多天, 感谢乔楚大侠的帮忙, 终于搞定了 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
}
- AES-CBC加密 以及PHP C#实现
- AES-CBC加密 以及PHP C#实现
- [PHP]实现AES-256-CBC和HMAC_SHA512加密
- php aes 128 CBC加密、解密函数
- android加密,php解密 , AES,CBC, PKCS7Padding
- javascript实现AES加密解密(ECB&CBC)
- AES-CBC加密
- aes加密,CBC
- php AES cbc模式 pkcs7 128位加密解密
- java/php对应的AES/CBC/PKCS5Padding模式 加密解密
- AES CBC模式加密/解密
- android AES-256-CBC加密
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现【多种语言AES/CBC/PKCS5Padding通用加解密数据】
- C#实现AES加密解密
- AES加密CBC模式兼容互通四种编程语言平台AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
- AES加密解密(使用php扩展mcrypt实现AES加密)
- C++ AES之CBC加密模式
- iOS CommonCrypto 对称加密 AES ecb,cbc
- 宏offsetof(TYPE, MEMBER)
- 学习笔记:自定义文字常量
- HDU4342 History repeat itself
- expdp impdp中 exclude/include 的使用
- 线段树 add操作(无惰性标记)
- AES-CBC加密 以及PHP C#实现
- mysql 存储过程加事务的简单写法
- 排序算法汇总总结
- 高仿UI特效专辑
- Starling Feathers Controls Callout
- mysql5.6.20编译安装
- Android View、ViewGroup 事件分发机制(一)
- Floyd最短路径算法
- android ffmpeg及相关开源库使用