C#實現DES加密解密

DES全稱爲Data Encryption Standard,即數據加密標準。1997年數據加密標準DES正式公佈,其分組長度爲64比特,密鑰長度爲64比特,其中8比特爲奇偶校驗位,所以實際長度爲56比特。現在DES已經被AES所取代。

DES原理和具體計算過程示例可以參考:DES加密教程詳細解讀

C#可以使用自帶的類庫簡單的完成DES加密,主要用到以下三個類:
MemoryStream 內存流
DESCryptoServiceProvider 加密服務提供者類
CryptoStream 將數據流連接到加密轉換的流

由於是對稱加密,加密和解密鑰匙需要一致

以下代碼主要參考了用C#實現DES加密解密封裝,做了一點微小改動,然後加了點註釋

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

namespace Common
{
    /// <summary>
    /// DESEncrypt加密解密算法。
    /// </summary>
    public class DESEncrypt
    {
        public DESEncrypt()
        {

        }

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="str">需要加密的</param>
        /// <param name="sKey">密匙</param>
        /// <returns></returns>
        private string Encrypt(string str, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Encoding.Default.GetBytes(str);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);// 密匙
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);// 初始化向量
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            var retB = Convert.ToBase64String(ms.ToArray());
            return retB;
        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="pToDecrypt">需要解密的</param>
        /// <param name="sKey">密匙</param>
        /// <returns></returns>
        private string Decrypt(string pToDecrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            // 如果兩次密匙不一樣,這一步可能會引發異常
            cs.FlushFinalBlock();
            return System.Text.Encoding.Default.GetString(ms.ToArray());
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章