.NET技术之美-.NET中的加密和解密

1.加密和解密的相关概念

安全的交流方式需要同时满足三个条件

完整性、保密性、可认证性

2、散列运算

代表:md5运算,md4,SHA1

2.1、三个特点

1.不可逆,散列运算理解为单向的加密2.完整性,任何两个不同的文件,只要相差一个字节,其结果都会是不一样的3.无论文件多大,运算出来的长度都是固定的

2.2、利用md5运算判断消息是否被篡改

1.发送方发送消息和加密消息的散列运算值

2.接收方接受消息和散列运算值

3.接收方利用散列运算算法计算得出散列运算值和发送方的值进行对比,确定文件是否被修改

2.3、利用密钥散列算法

1.在发送方发送消息的时候,不只是对消息进行简单的散列运算计算值,而是通过密钥+消息的方式计算散列值(保证此密钥是双方都知道),例如要发送消息”hello,world”,密钥为“test”,则是通过加密“[test]hello,world ”来进行计算得到散列值,然后将消息”hello ,world”和散列值发送

2.接收方接受消息和散列值通过私有密钥+消息的方式进行计算散列值,然后比对接受方的散列值

3、对称机密

过程:

1.发送方和接收方持有相同密钥

2.发送方利用密钥对消息进行加密,并发送消息

3.接受方利用密钥解密

4、.NET框架对加密和解密的支持

4.1、散列运算:基类(HashAlgorithm )

string plaintest="hello,world!";
   HashAlgorithm alg=HashAlgorithm.Creat("Hash");//初始化对象
   byte[] palinData=Encoding.Default.GetBytes(plaintest);//将字符串转换为自己数组
   byte[] hashData=alg.ComputeHash(plainData);//获得散列值

自定义一个类型

public class HashAlogrithmType{
    public const string SH1="SHA1;"
    public const string SH256="SH256";
    public const string SH384="SH384";
    public const string SH512="SH512";
    public const string MD5="MD5";
}
HashAlgorithm alg=HashAlgorithm.Creat(HashAlogrithmType.SH1);//初始化对象
密钥散列运算知识

只是增加利用密钥和消息进行散列运算,如果允许的情况下可以进行密钥散列运算后,传递给接收方进行比对

4.2、对称加密和解密:基类(SymmetricAlgorithm)

public class SymmetricCryptoHelper { 
      //对称加密算法提供其器
        private ICryptoTransform encryptor;
        private ICryptoTransform decryptor;
        private const int BufferSize=1024;
        public SymmetricCryptoHelper(string algorithmName,byte[] key){
            SymmetricAlgorithm provider=SymmetricAlgorithm.Create(algorithmName);
            provider.Key=key;
            provider.IV=new byte[]{0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0XEF};
            encryptor=provider.CreateDecryptor();
            decryptor=provider.CreateEncryptor();
        }
        public SymmetricCryptoHelper(byte[] key):this("TripleDES",key){
    }
        //加密算法
        public string Encrypt(string clearText){
            //创建明文流
            byte[] clearBuffer=Encoding.UTF8.GetBytes(clearText);
            MemoryStream clearStrem=new MemoryStream(clearBuffer);
            //创建空的密文流
            MemoryStream encryptedStream=new MemoryStream ();
            CryptoStream cryptoStrem=new CryptoStream (encryptedStream,encryptor,CryptoStreamMode.Write);
            //将明文流写入buffer中
            //将buffer中的数据写入到cryptoStrem
            int bytesRead=0;
            byte[] buffer=new byte[BufferSize];
            do{
                bytesRead =clearStrem.Read(buffer,0,BufferSize);
                cryptoStrem.Write(buffer,0,bytesRead);
            }while(bytesRead>0);
            buffer=encryptedStream.ToArray();
            string encryptedText=Convert.ToBase64String(buffer);
            return encryptedText;
        }
    }

使用对称加密的关键位置在于创建provider或者manager,上例中使用的TripleDES来进行加密,所以在构造函数利用SymmetricAlgorithm来生成provider,并且为其属性key,和IV赋值,并且为声明的引用类型provider实例化了对象provider,在对称加密和解密的过程主要是存在一个明文流和加密流,而且需要中间的cryptostream来实现两者的转换,当然在转换的过程中,我们还需要定义一个大小一定的字节数组,在每次循环读取明文流的过程中保证读取一定的大小,然后转换到密文流中取,并且通过循环语句去判断定义的子节数组是否有大小,如果没有则会跳出循环.结束明文流到密文流的写入过程。

key是对称加密和解密中的key密钥(key一般是为16字节),而八字节的IV属性是为防止很多原重复消息生成加密后生成任然重复消息

4.3、非对称加密

4.4、数字签名