龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

C#的对称加密和非对称加密使用

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
在.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;
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));
精彩图集

赞助商链接