zoukankan      html  css  js  c++  java
  • .NET C# DES入门

    DES加密应该是最基础的加密算法,为了搞清楚它在.NET C#里面的用法,我费了不少功夫,希望有心人能看到。
    DES一共就有4个参数参与运作:明文、密文、密钥、向量。为了初学者容易理解,可以把4个参数的关系写成:密文=明文+密钥+向量;明文=密文-密钥-向量。为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!
    下面我们做加密和解密方法:
    using System;
    //这个是使用DES的基础
    using System.Security.Cryptography;
    //这个是处理文字编码的前提
    using System.Text;
    //以“流”的形式处理文字,也是微软DES算法要求的
    using System.IO;
    /// <summary>
    /// DES加密方法
    /// </summary>
    /// <param name="strPlain">明文</param>
    /// <param name="strDESKey">密钥</param>
    /// <param name="strDESIV">向量</param>
    /// <returns>密文</returns>
    public string DESEncrypt(string strPlain,string strDESKey,string strDESIV)
    {
     
    //把密钥转换成字节数组
     byte[] bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey);
     
    //把向量转换成字节数组
     byte[] bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV);
     
    //声明1个新的DES对象
     DESCryptoServiceProvider desEncrypt=new DESCryptoServiceProvider();
     
    //开辟一块内存流
     MemoryStream msEncrypt=new MemoryStream();
     
    //把内存流对象包装成加密流对象
     CryptoStream csEncrypt=new CryptoStream(msEncrypt,desEncrypt.CreateEncryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Write);
     
    //把加密流对象包装成写入流对象
     StreamWriter swEncrypt=new StreamWriter(csEncrypt);
     
    //写入流对象写入明文
     swEncrypt.WriteLine(strPlain);
     
    //写入流关闭
     swEncrypt.Close();
     
    //加密流关闭
     csEncrypt.Close();
     
    //把内存流转换成字节数组,内存流现在已经是密文了
     byte[] bytesCipher=msEncrypt.ToArray();
     
    //内存流关闭
     msEncrypt.Close();
     
    //把密文字节数组转换为字符串,并返回
     return UnicodeEncoding.Unicode.GetString(bytesCipher);
    }
    /// <summary>
    /// DES解密方法
    /// </summary>
    /// <param name="strCipher">密文</param>
    /// <param name="strDESKey">密钥</param>
    /// <param name="strDESIV">向量</param>
    /// <returns>明文</returns>
    public string DESDecrypt(string strCipher,string strDESKey,string strDESIV)
    {
     
    //把密钥转换成字节数组
     byte[] bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey);
     
    //把向量转换成字节数组
     byte[] bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV);
     
    //把密文转换成字节数组
     byte[] bytesCipher=UnicodeEncoding.Unicode.GetBytes(strCipher);
     
    //声明1个新的DES对象
     DESCryptoServiceProvider desDecrypt=new DESCryptoServiceProvider();
     
    //开辟一块内存流,并存放密文字节数组
     MemoryStream msDecrypt=new MemoryStream(bytesCipher);
     
    //把内存流对象包装成解密流对象
     CryptoStream csDecrypt=new CryptoStream(msDecrypt,desDecrypt.CreateDecryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Read);
     
    //把解密流对象包装成读出流对象
     StreamReader srDecrypt=new StreamReader(csDecrypt);
     
    //明文=读出流的读出内容
     string strPlainText=srDecrypt.ReadLine();
     
    //读出流关闭
     srDecrypt.Close();
     
    //解密流关闭
     csDecrypt.Close();
     
    //内存流关闭
     msDecrypt.Close();
     
    //返回明文
     return strPlainText;
    }
     
  • 相关阅读:
    文本比较算法Ⅳ——Nakatsu算法
    网游中,“时间停止的实现”的设想
    GDI+绘制自定义行距的文本(续)
    GDI+绘制自定义行距的文本的三种方法。
    文本比较算法Ⅱ——Needleman/Wunsch算法
    文本比较算法Ⅲ——计算文本的相似度
    javascript笔记:深入分析javascript里对象的创建(上)续篇
    java笔记:自己动手写javaEE框架(五)Spring事务管理学习
    java笔记:自己动手写javaEE框架(三)引入SQL监控技术P6spy
    java笔记:自己动手写javaEE框架(一)数据访问层DAO以及DAO的单元测试
  • 原文地址:https://www.cnblogs.com/chuncn/p/1082428.html
Copyright © 2011-2022 走看看