C#/DES加密解密


命名空間引用

using System.IO;//內存流讀寫方法調用
using System.Security.Cryptography;//加密解密方法調用

加密方法

String key = "12345678";//定義加密解密所用密鑰。
Console.WriteLine("請輸入要加密的字符串:");
String str = Console.ReadLine();//讀取要加密的字符串
DESCryptoServiceProvider des = new DESCryptoServiceProvider();//實例化加密類對象
byte[] arr_key = Encoding.UTF8.GetBytes(key.Substring(0, 8));//定義字節數組用來存放密鑰 GetBytes方法用於將字符串中所有字節編碼為一個字節序列
////!!!DES加密key位數只能是64位,即8字節
////注意這里用的編碼用當前默認編碼方式,不確定就用Default
byte[] arr_str = Encoding.UTF8.GetBytes(str);//定義字節數組存放要加密的字符串
MemoryStream ms = new MemoryStream();//實例化內存流對象
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(arr_key, arr_key), CryptoStreamMode.Write);//創建加密流對象,參數 內存流/初始化向量IV/加密流模式
cs.Write(arr_str, 0, arr_str.Length);//需加密字節數組/offset/length,此方法將length個字節從 arr_str 復制到當前流。0是偏移量offset,即從指定index開始復制。
cs.Close();
string str_des = Convert.ToBase64String(ms.ToArray());
Console.WriteLine("加密后的字符串:");
Console.WriteLine(str_des);

對於初始化向量iv

簡易理解,為了防止想同的明文加密后密文仍然一致,需要在加密算法中引入變化的量,由此引入向量的,用戶指定向量初始值,加密算法自動計算出其后續值,加密時每部分混合密鑰和當前向量值進行加密,由此相同的明文加密后的密文會不一致,提升安全性。

加密流程總結

在加密方法加密字符串、密鑰、初始向量均需外部傳入。首先將三部分轉化為字符數組,然后實例化加密類對象,實例化內存流對象,實例化加密流對象(CryptoStream 的任何加密對象可以和實現 和Stream 的任何對象鏈接起來,因此加密對象的流式處理輸出可以作為另一個對象的輸入,通俗理解即即內存流作為加密流的輸出對象),加密流讀取字節數組並加密到流,隨后將加密后的流輸出到內存流並清空緩沖區。注意此處需要執行只有調用FlushFinalBlock后,數據才被真正寫入內存流。舉個例子:

 

解密方法需要用到 加密字符串、密鑰、初始化向量。

//解密
ms = new MemoryStream();
byte[] arr_des = Convert.FromBase64String(str_des);//注意這里仍要將密文作為base64字符串處理獲得數組,否則報錯
//byte[] arr_des = Encoding.UTF8.GetBytes(str_des);//不可行,將加密方法中ms的字符數組轉為utf-8也不行
des = new DESCryptoServiceProvider();//解密方法定義加密對象
cs = new CryptoStream(ms, des.CreateDecryptor(arr_key, arr_key), CryptoStreamMode.Write);
cs.Write(arr_des, 0, arr_des.Length);
cs.FlushFinalBlock();

cs.Close();
Encoding.UTF8.GetString(ms.ToArray());//此處與加密前編碼一致
Console.WriteLine("解密后的字符串:");
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM