C#的对称加密和非对称加密使用
在.net中,由 System.Security.Cryptography 命名空间提供了加密和哈希的几个类。下面放一个使用对称加密的简单例子: using System; using System.Security.Cryptography; using System.Text; using System.IO; /// su
在.net中,由 System.Security.Cryptography 命名空间提供了加密和哈希的几个类。下面放一个使用对称加密的简单例子:
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
/// <summary>
/// 使用对称加密的例子
/// </summary>
class Class1
{
static void Main(string[] args)
{
Class1 c = new Class1();
c.StartDemo();
}
public void StartDemo()
{
//establish symmetric algorithm
SymmetricAlgorithm sa = Rijndael.Create();
//key and iv
sa.GenerateKey(); //产生随机的 (32*8) 位的密钥
//sa.GenerateIV(); //初始向量,在ECB模式里面可以不用IV
sa.Mode = CipherMode.ECB; //块处理模式
sa.Padding = PaddingMode.Zeros; //末尾数据块的填充模式
//establish crypto stream
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
//
string plaintext; //原始文本
byte[] cipherbytes; //加密后的数据
byte[] finalbytes; //解密后的数据
plaintext = "How are you? 这是一行文字。";
byte[] plainbytes = Encoding.UTF8.GetBytes(plaintext);
Console.WriteLine("原始文本是:\n{0}\n", plaintext);
//加密过程
cs.Write(plainbytes, 0, plainbytes.Length);
cs.Close();
cipherbytes = ms.ToArray();
ms.Close();
//下面的为加密过程
ms = new MemoryStream(cipherbytes);
cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);
finalbytes = new byte[plainbytes.Length];
cs.Read(finalbytes, 0, plainbytes.Length);
string finaltext = Encoding.UTF8.GetString(finalbytes);
Console.WriteLine("解密后的文本是:\n{0}\n\n", finaltext);
Console.WriteLine("按任意键继续
");
Console.ReadLine();
}
}
非对称的例子:
using System.Security.Cryptography;
using System.Text;
using System.IO;
/// <summary>
/// 使用对称加密的例子
/// </summary>
class Class1
{
static void Main(string[] args)
{
Class1 c = new Class1();
c.StartDemo();
}
public void StartDemo()
{
//establish symmetric algorithm
SymmetricAlgorithm sa = Rijndael.Create();
//key and iv
sa.GenerateKey(); //产生随机的 (32*8) 位的密钥
//sa.GenerateIV(); //初始向量,在ECB模式里面可以不用IV
sa.Mode = CipherMode.ECB; //块处理模式
sa.Padding = PaddingMode.Zeros; //末尾数据块的填充模式
//establish crypto stream
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
//
string plaintext; //原始文本
byte[] cipherbytes; //加密后的数据
byte[] finalbytes; //解密后的数据
plaintext = "How are you? 这是一行文字。";
byte[] plainbytes = Encoding.UTF8.GetBytes(plaintext);
Console.WriteLine("原始文本是:\n{0}\n", plaintext);
//加密过程
cs.Write(plainbytes, 0, plainbytes.Length);
cs.Close();
cipherbytes = ms.ToArray();
ms.Close();
//下面的为加密过程
ms = new MemoryStream(cipherbytes);
cs = new CryptoStream(ms, sa.CreateDecryptor(), CryptoStreamMode.Read);
finalbytes = new byte[plainbytes.Length];
cs.Read(finalbytes, 0, plainbytes.Length);
string finaltext = Encoding.UTF8.GetString(finalbytes);
Console.WriteLine("解密后的文本是:\n{0}\n\n", finaltext);
Console.WriteLine("按任意键继续


Console.ReadLine();
}
}
非对称的例子:
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
/// <summary>
/// 一个简单的使用.NET非对成加密算法的例子
/// 本例的程序很简单,仅用于说明如何在.NET里面使用非对称(RSA)算法。
/// Kwanhong 2005.9
/// </summary>
class Class1
{
public static void Main(string[] args)
{
Class1 c = new Class1();
c.StartDemo();
}
public void StartDemo()
{
//RSA的加解密过程:
// 有 rsa1 和 rsa2 两个RSA对象。
// 现在要 rsa2 发送一段信息给 rsa1, 则先由 rsa1 发送“公钥”给 rsa2
// rsa2 获取得公钥之后,用来加密要发送的数据内容。
// rsa1 获取加密后的内容后,用自己的私钥解密,得出原始的数据内容。
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider();
RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider();
string publickey;
publickey = rsa1.ToXmlString(false); //导出 rsa1 的公钥
string plaintext;
plaintext = "你好吗?这是用于测试的字符串。"; //原始数据
Console.WriteLine("原始数据是:\n{0}\n", plaintext);
rsa2.FromXmlString(publickey); //rsa2 导入 rsa1 的公钥,用于加密信息
//rsa2开始加密
byte[] cipherbytes;
cipherbytes = rsa2.Encrypt(
Encoding.UTF8.GetBytes(plaintext),
false);
/*//////////////////////////////////////////////*/
Console.WriteLine("加密后的数据是:");
for (int i = 0; i < cipherbytes.Length; i++)
{
Console.Write("{0:X2} ", cipherbytes[i]);
}
Console.WriteLine("\n");
/*//////////////////////////////////////////////*/
//rsa1开始解密
byte[] plaintbytes;
plaintbytes = rsa1.Decrypt(cipherbytes, false);
Console.WriteLine("解密后的数据是:");
Console.WriteLine(Encoding.UTF8.GetString(plaintbytes));
Console.ReadLine();
}
}
在写加密解密程序时,经常需要先将用户的密码计算出哈希值,然后再将哈希值给加密解密过程使用,常用的哈希算法有MD5。在使用过程中由于 MD5CryptoServiceProvider 提供了多种方法去计算md5的hash值,反而令人搞不清楚,所以这里帖出计算md5的几种常见方法:
先引用命名空间:
using System.Security.Cryptography;
using System.Text;
然后:
MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider();
string source="HelloWorld";
byte[] message;
message=Encoding.Default.GetBytes(source);
//方法1
// 使用ComputeHash方法,适合用于计算简单的字符串的md5值时
md5.ComputeHash(message);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法2
// 使用TransformFinalBlock方法,适合用于原始数据不多时
md5.Initialize();
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法3
// 此方法等同于方法2
md5.Initialize();
md5.TransformBlock(message,0,message.Length,
message,0); //note: output bytes must equal input bytes
md5.TransformFinalBlock(message,0,0);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法4
// 将原始消息分两次编码,得出的结果跟上面的一样,适合用于计算大量原始数据时,例如计算一个文件的md5值
md5.Initialize();
message=Encoding.Default.GetBytes("Hello");
md5.TransformBlock(message,0,message.Length,
message,0);
message=Encoding.Default.GetBytes("World");
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
using System.IO;
using System.Text;
using System.Security.Cryptography;
/// <summary>
/// 一个简单的使用.NET非对成加密算法的例子
/// 本例的程序很简单,仅用于说明如何在.NET里面使用非对称(RSA)算法。
/// Kwanhong 2005.9
/// </summary>
class Class1
{
public static void Main(string[] args)
{
Class1 c = new Class1();
c.StartDemo();
}
public void StartDemo()
{
//RSA的加解密过程:
// 有 rsa1 和 rsa2 两个RSA对象。
// 现在要 rsa2 发送一段信息给 rsa1, 则先由 rsa1 发送“公钥”给 rsa2
// rsa2 获取得公钥之后,用来加密要发送的数据内容。
// rsa1 获取加密后的内容后,用自己的私钥解密,得出原始的数据内容。
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider();
RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider();
string publickey;
publickey = rsa1.ToXmlString(false); //导出 rsa1 的公钥
string plaintext;
plaintext = "你好吗?这是用于测试的字符串。"; //原始数据
Console.WriteLine("原始数据是:\n{0}\n", plaintext);
rsa2.FromXmlString(publickey); //rsa2 导入 rsa1 的公钥,用于加密信息
//rsa2开始加密
byte[] cipherbytes;
cipherbytes = rsa2.Encrypt(
Encoding.UTF8.GetBytes(plaintext),
false);
/*//////////////////////////////////////////////*/
Console.WriteLine("加密后的数据是:");
for (int i = 0; i < cipherbytes.Length; i++)
{
Console.Write("{0:X2} ", cipherbytes[i]);
}
Console.WriteLine("\n");
/*//////////////////////////////////////////////*/
//rsa1开始解密
byte[] plaintbytes;
plaintbytes = rsa1.Decrypt(cipherbytes, false);
Console.WriteLine("解密后的数据是:");
Console.WriteLine(Encoding.UTF8.GetString(plaintbytes));
Console.ReadLine();
}
}
在写加密解密程序时,经常需要先将用户的密码计算出哈希值,然后再将哈希值给加密解密过程使用,常用的哈希算法有MD5。在使用过程中由于 MD5CryptoServiceProvider 提供了多种方法去计算md5的hash值,反而令人搞不清楚,所以这里帖出计算md5的几种常见方法:
先引用命名空间:
using System.Security.Cryptography;
using System.Text;
然后:
MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider();
string source="HelloWorld";
byte[] message;
message=Encoding.Default.GetBytes(source);
//方法1
// 使用ComputeHash方法,适合用于计算简单的字符串的md5值时
md5.ComputeHash(message);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法2
// 使用TransformFinalBlock方法,适合用于原始数据不多时
md5.Initialize();
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法3
// 此方法等同于方法2
md5.Initialize();
md5.TransformBlock(message,0,message.Length,
message,0); //note: output bytes must equal input bytes
md5.TransformFinalBlock(message,0,0);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法4
// 将原始消息分两次编码,得出的结果跟上面的一样,适合用于计算大量原始数据时,例如计算一个文件的md5值
md5.Initialize();
message=Encoding.Default.GetBytes("Hello");
md5.TransformBlock(message,0,message.Length,
message,0);
message=Encoding.Default.GetBytes("World");
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
精彩图集
精彩文章