思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
public
static
string
Encrypt(
string
plainText,
string
AESKey)
{
RijndaelManaged rijndaelCipher =
new
RijndaelManaged();
byte
[] inputByteArray = Encoding.UTF8.GetBytes(plainText);
//得到需要加密的字节数组
rijndaelCipher.Key = Convert.FromBase64String(AESKey);
//加解密双方约定好密钥:AESKey
rijndaelCipher.GenerateIV();
byte
[] keyIv = rijndaelCipher.IV;
byte
[] cipherBytes =
null
;
using
(MemoryStream ms =
new
MemoryStream())
{
using
(CryptoStream cs =
new
CryptoStream(ms, rijndaelCipher.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cipherBytes = ms.ToArray();
//得到加密后的字节数组
cs.Close();
ms.Close();
}
}
var
allEncrypt =
new
byte
[keyIv.Length + cipherBytes.Length];
Buffer.BlockCopy(keyIv, 0, allEncrypt, 0, keyIv.Length);
Buffer.BlockCopy(cipherBytes, 0, allEncrypt, keyIv.Length *
sizeof
(
byte
), cipherBytes.Length);
return
Convert.ToBase64String(allEncrypt);
}
public
static
string
Decrypt(
string
showText,
string
AESKey)
{
string
result =
string
.Empty;
try
{
byte
[] cipherText = Convert.FromBase64String(showText);
int
length = cipherText.Length;
SymmetricAlgorithm rijndaelCipher = Rijndael.Create();
rijndaelCipher.Key = Convert.FromBase64String(AESKey);
//加解密双方约定好的密钥
byte
[] iv =
new
byte
[16];
Buffer.BlockCopy(cipherText, 0, iv, 0, 16);
rijndaelCipher.IV = iv;
byte
[] decryptBytes =
new
byte
[length - 16];
byte
[] passwdText =
new
byte
[length - 16];
Buffer.BlockCopy(cipherText, 16, passwdText, 0, length - 16);
using
(MemoryStream ms =
new
MemoryStream(passwdText))
{
using
(CryptoStream cs =
new
CryptoStream(ms, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read))
{
cs.Read(decryptBytes, 0, decryptBytes.Length);
cs.Close();
ms.Close();
}
}
result = Encoding.UTF8.GetString(decryptBytes).Replace(
"\0"
,
""
);
///将字符串后尾的'\0'去掉
}
catch
{ }
return
result;
}
|
调用:
1
2
3
|
string
jiaMi = MyAESTools.Encrypt(textBox1.Text,
"abcdefgh12345678abcdefgh12345678"
);
string
jieMi = MyAESTools.Decrypt(textBox3.Text,
"abcdefgh12345678abcdefgh12345678"
);
|
本文转自王磊的博客博客园博客,原文链接:http://www.cnblogs.com/vipstone/p/4229275.html,如需转载请自行联系原作者