C#加解密之DES算法的實(shí)現(xiàn)
前言
說(shuō)完了對(duì)稱加密中的AES,這一篇再來(lái)介紹下DES。
加解密原理什么的就不介紹了,大家可以自行百度(主要我也不太明白,也不需要太明白),大致說(shuō)一下兩者的區(qū)別吧!
- 首先肯定是加密算法的不同,嗯,這一句完全是廢話,不同的加密方式算法肯定不會(huì)一樣。
- AES比DES的運(yùn)算速度更快。
- AES比DES破解難度高,相對(duì)比較安全。
代碼實(shí)現(xiàn)的話其實(shí)AES和DES的寫法是基本差不多的,但是這里有一個(gè)參數(shù)問(wèn)題還是需要提一下。在上一篇AES中我們有介紹過(guò)密鑰長(zhǎng)度只能是16、24、32;在DES中的話,密鑰(Key)的長(zhǎng)度是8(由于密鑰的長(zhǎng)度問(wèn)題,所以這里如果使用暴力破解的話,還是有很高的概率可以還原數(shù)據(jù)),有向量(IV)的話,長(zhǎng)度一般也是8;然后就是在AES中我們采用的是Rijndael,在這里我們換成DESCryptoServiceProvider;兩個(gè)加密的實(shí)現(xiàn)代碼主要就是這里的不同,其他基本一模一樣,所以稍微改一下即可。
實(shí)現(xiàn)功能
使用DES加密方式加解密文本數(shù)據(jù)
開(kāi)發(fā)環(huán)境
開(kāi)發(fā)工具:Visual Studio 2013
.NET Framework版本:4.5
實(shí)現(xiàn)代碼
public class DesUtil { /// <summary> /// DES加密 /// </summary> /// <param name="desModel"></param> /// <returns></returns> public static byte[] Encrypt(DesModel desModel) { //使用8位密鑰 byte[] key8 = new byte[8]; //如果我們的密鑰不是8為,則自動(dòng)補(bǔ)全到8位 byte[] byteKey = Encoding.UTF8.GetBytes(desModel.Key.PadRight(key8.Length)); //復(fù)制密鑰 Array.Copy(byteKey, key8, key8.Length); //使用8位向量 byte[] iv8 = new byte[8]; //如果我們的向量不是8為,則自動(dòng)補(bǔ)全到8位 byte[] byteIv = Encoding.UTF8.GetBytes(desModel.IV.PadRight(iv8.Length)); //復(fù)制向量 Array.Copy(byteIv, iv8, iv8.Length); // 創(chuàng)建加密對(duì)象 DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); desProvider.Mode = desModel.Mode; desProvider.Padding = desModel.Padding; desProvider.Key = key8; desProvider.IV = iv8; byte[] result = null; try { using (MemoryStream ms = new MemoryStream()) { using (CryptoStream EncryptStream = new CryptoStream(ms, desProvider.CreateEncryptor(), CryptoStreamMode.Write)) { EncryptStream.Write(desModel.Data, 0, desModel.Data.Length); EncryptStream.FlushFinalBlock(); result = ms.ToArray(); } } } catch { } return result; } /// <summary> /// DES解密 /// </summary> /// <param name="desModel"></param> /// <returns></returns> public static byte[] Decrypt(DesModel desModel) { //使用8位密鑰 byte[] key8 = new byte[8]; //如果我們的密鑰不是8為,則自動(dòng)補(bǔ)全到8位 byte[] byteKey = Encoding.UTF8.GetBytes(desModel.Key.PadRight(key8.Length)); //復(fù)制密鑰 Array.Copy(byteKey, key8, key8.Length); //使用8位向量 byte[] iv8 = new byte[8]; //如果我們的向量不是8為,則自動(dòng)補(bǔ)全到8位 byte[] byteIv = Encoding.UTF8.GetBytes(desModel.IV.PadRight(iv8.Length)); //復(fù)制向量 Array.Copy(byteIv, iv8, iv8.Length); // 創(chuàng)建解密對(duì)象 DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider(); desProvider.Mode = desModel.Mode; desProvider.Padding = desModel.Padding; desProvider.Key = key8; desProvider.IV = iv8; byte[] result = null; try { using (MemoryStream ms = new MemoryStream(desModel.Data)) { using (CryptoStream DecryptStream = new CryptoStream(ms, desProvider.CreateDecryptor(), CryptoStreamMode.Read)) { using (MemoryStream msResult = new MemoryStream()) { byte[] temp = new byte[1024 * 1024]; int len = 0; while ((len = DecryptStream.Read(temp, 0, temp.Length)) > 0) { msResult.Write(temp, 0, len); } result = msResult.ToArray(); } } } } catch { } return result; } /// <summary> /// DES加密字符串 /// </summary> /// <param name="data"></param> /// <param name="key"></param> /// <param name="iv"></param> /// <returns></returns> public static string Encrypt(string data, string key, string iv = "") { byte[] bytes = Encoding.UTF8.GetBytes(data); byte[] result = Encrypt(new DesModel { Data = bytes, Key = key, IV = iv, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 }); if (result == null) { return ""; } return Convert.ToBase64String(result); } /// <summary> /// DES解密字符串 /// </summary> /// <param name="data"></param> /// <param name="key"></param> /// <param name="iv"></param> /// <returns></returns> public static string Decrypt(string data, string key, string iv = "") { byte[] bytes = Convert.FromBase64String(data); byte[] result = Decrypt(new DesModel { Data = bytes, Key = key, IV = iv, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 }); if (result == null) { return ""; } return Encoding.UTF8.GetString(result); } public class DesModel { /// <summary> /// 需要加密/解密的數(shù)據(jù) /// </summary> public byte[] Data { get; set; } /// <summary> /// 密鑰 /// </summary> public string Key { get; set; } /// <summary> /// 向量 /// </summary> public string IV { get; set; } /// <summary> /// 加密模式 /// </summary> public CipherMode Mode { get; set; } /// <summary> /// 填充模式 /// </summary> public PaddingMode Padding { get; set; } } }
private void btn_Des_Encrypt_Click(object sender, EventArgs e) { string result = DesUtil.Encrypt(textBox1.Text, "12345678900987654321"); textBox2.Text = result; } private void btn_Des_Decrypt_Click(object sender, EventArgs e) { string result = DesUtil.Decrypt(textBox2.Text, "12345678900987654321"); textBox1.Text = result; }
實(shí)現(xiàn)效果
以上就是C#加解密之DES算法的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C# DES算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF調(diào)用ffmpeg實(shí)現(xiàn)屏幕錄制
這篇文章主要為大家詳細(xì)介紹了WPF如何調(diào)用ffmpeg實(shí)現(xiàn)屏幕錄制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2023-05-05ListView Adapter優(yōu)化 實(shí)例
ListView Adapter優(yōu)化 實(shí)例,需要的朋友可以參考一下2013-04-04C#實(shí)現(xiàn)獲取運(yùn)行平臺(tái)系統(tǒng)信息的方法
這篇文章主要介紹了C#實(shí)現(xiàn)獲取運(yùn)行平臺(tái)系統(tǒng)信息的方法,比較典型的C#應(yīng)用,需要的朋友可以參考下2014-07-07C#實(shí)現(xiàn)調(diào)用本機(jī)攝像頭實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)調(diào)用本機(jī)攝像頭的方法,可以實(shí)現(xiàn)調(diào)用本機(jī)攝像頭進(jìn)行拍照,具有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08