私钥加密,这里所说的私钥加密是指通过单个私钥来加密和解密数据。持有私钥的任一方均可通过私钥来解密数据。它是一种可逆加密方法。又称对称加密。
(一)CryptoStream
先说一下CryptoStream类,这个类的作用就是将数据流链接到加密转换的流。CLR使用面向设计进行加密。其设计的核心是CryptoStream。实现CrytoStream的任何对象可以和实现Stream的任何对象链接起来。它们之间直接进行,不需要中间存储。这个流也是流,可以和一般的流理解使用。
CryptoStreamMode mode)
构造器3个参数。其中第一个参数是要加密的流,第二个为要进行的加密的转换,第三个是个枚举类型:Read 对加密流的读访问。 Write 对加密流的写访问。
(二)TripleDESCryptoServiceProvider
支持128,192位的密钥长度。以64位整数倍增加。(DES,数据加密算法,就是Data Encryption Standard)。
它的加密器创建方法:
CreateEncryptor()用当前的 Key 属性和初始化向量 (IV) 创建对称加密器对象。
CreateEncryptor(Byte[], Byte[])
它的解密器创建方法:
CreateDecryptor()用当前的 Key 属性和初始化向量 (IV) 创建对称解密器对象。
CreateDecryptor(Byte>[],Byte[]) 使用指定的密钥 (Key) 和初始化向量 (IV) 创建对称 TripleDES 解密器对象。
加密器与解密器相对。
加密示例:
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = encoding.GetBytes(strContent);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
说明:
·TripleDesCrypto加密要提供一个64整数倍的键值,做为私钥。这个可由md5生成。这里生成的是128位hash值。
·这里对加密的再以base64进行加密,便于传输和存储,且便于我们查看。
·对于字串,二进制等之间转换要用到编码规则,所以要提供编码
·Mode是个CipherMode枚举值,它的类型分为:
CBC 密码块链 (CBC) 模式引入了反馈
ECB 电子密码本 (ECB) 模式分别加密每个块。
CFB 密码反馈 (CFB) 模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块。
CTS 密码文本窃用 (CTS) 模式处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。
同样对于解密器:
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateDecryptor();
byte[] Buffer = Convert.FromBase64String(strContent);
return encoding.GetString(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
顺序和加密器相反:
·Mode枚举
·base64解密
使用:
{
string strContent = "123aaa";
string strKey="qwuduII*6&*%^&(90))";
string str1 = DESEncoding(strContent, strKey, Encoding.Default);
Console.WriteLine(str1);
string str2 = DESDecoding(str1, strKey, Encoding.Default);
Console.WriteLine(str2);
}
结果:
VxtaoIh5K18=
123aaa
这里的key我随便打了几个字符……,我的系统是win2003中文版,这里的编码用的是gb2312编码。
以上创建的加密解密器用的一种创建方法。对于流,如果不需要进行中介存储,则可以通过加密流进行,而不必第三者的介入。但这里的示例主要用于对实现CrytoStream的对象进行操作,来示例这种方法的使用过程。
以加密器为例,它的两个创建方法重载都是返回ICryptoTransform 接口对象
加密器:
string strKey, Encoding encoding)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
FileStream fStream = File.OpenWrite(strPath);
CryptoStream cStream = new CryptoStream(fStream,DESEncrypt,CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(cStream, encoding);
sWriter.WriteLine(strContent);
sWriter.Close();
cStream.Close();
fStream.Close();
}
解密器:
string strKey, Encoding encoding)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateDecryptor();
FileStream fStream = File.Open(strPath, FileMode.Open);
CryptoStream cStream = new CryptoStream(fStream, DESEncrypt, CryptoStreamMode.Read);
StreamReader sReader = new StreamReader(cStream,encoding);
string strReturn = sReader.ReadLine();
sReader.Close();
cStream.Close();
fStream.Close();
return strReturn;
}
(三)RC2CryptoServiceProvider
RC2CryptoServiceProvider 实现支持的密钥长度为从 40 位到 128 位,以 8 位递增。
它的加密器创建方法:
CreateEncryptor(Byte[], Byte[])
解密器方法与之相对:
CreateDecryptor(Byte[], Byte[])
这里不以加密流方向进行加解密示例,仅以一般加密过程进行加解密。这里直接给出3段代码:
{
RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
rc2.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
rc2.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = rc2.CreateEncryptor();
byte[] Buffer = encoding.GetBytes(strContent);
return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer,
0, Buffer.Length));
}
private string Rc2Decoding(string strContent, string strKey, Encoding encoding)
{
RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
rc2.Key = hashMD5.ComputeHash(encoding.GetBytes(strKey));
rc2.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = rc2.CreateDecryptor();
byte[] Buffer = Convert.FromBase64String(strContent);
return encoding.GetString(DESEncrypt.TransformFinalBlock(Buffer,
0, Buffer.Length));
}
public void TestDESRc2()
{
string strContent = "123aaa";
string strKey = "qwuduII*6&*%^&(90))";
string str1 = Rc2Encoding(strContent, strKey, Encoding.Default);
Console.WriteLine(str1);
string str2 = Rc2Decoding(str1, strKey, Encoding.Default);
Console.WriteLine(str2);
}
(四)RijndaelManaged
此算法支持 128、192 或 256 位的密钥长度。
对于示例这里不再赘述。
(五)DESCryptoServiceProvider
支持64位密钥加密。
示例不再赘述。