玩轉C#之【Encrypt加密解密】

更新於 2024/09/15閱讀時間約 21 分鐘

介紹

這章節純看智商
  • 不可逆加密:原文加密後變成密文,但密文沒辦法解密文回原文
  • 可逆加密:原文加密過後的密文,可以在將密文解密回原文
  • 對稱:表示加解密是否使用同一個key

MD5 不可逆加密

MD5 使用的命名空間是 System.Security.Cryptography
/// <summary>
/// 不可逆加密
/// 1 防止被篡改
/// 2 防止明文儲存
/// 3 防止抵赖,數字簽名
/// </summary>
public class MD5Encrypt
{
#region MD5
/// <summary>
/// MD5加密
/// 使用的UTF8編碼
/// </summary>
/// <param name="source">待加密字串</param>
/// <param name="length">16或32值之一,其他則採用.net默認MD5加密算法</param>
/// <returns>加密后的字串</returns>
public static string Encrypt(string source, int length = 32)//默認參數
{
if (string.IsNullOrEmpty(source)) return string.Empty;
HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
byte[] bytes = Encoding.UTF8.GetBytes(source);//這裡需要區別編碼的
byte[] hashValue = provider.ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
switch (length)
{
case 16:
for (int i = 4; i < 12; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
case 32:
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
default:
for (int i = 0; i < hashValue.Length; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
}
return sb.ToString();
}
#endregion MD5

#region MD5摘要
/// <summary>
/// 獲取檔案的MD5摘要
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string AbstractFile(string fileName)
{
using (FileStream file = new FileStream(fileName, FileMode.Open))
{
return AbstractFile(file);
}
}

/// <summary>
/// 根據stream獲取檔案摘要
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static string AbstractFile(Stream stream)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);

StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
#endregion
}
MD5是一種公開的算法,相同的字串可以得到一樣的結果
應用:可以做密碼檢查=>將使用者密碼md5一下,存到資料庫裡,下一次使用者輸入密碼的時候md5一下在做比對
MD5網路上的解密,都是使用樣本比對的方式
密碼複雜一點的方式,加鹽(密碼加上一段文字在做MD5) 或做兩次MD5
以下運用得原理,只有相同文件才能有相同的md5
應用:
  • 防止程式串改:下載VS安裝文件(md5)從官方網站下載,到非官方網站下載只要確認檔案的md5碼有沒有樣就可以
  • 急速秒傳:百度雲 一瞬間就傳完了,第一次上傳,傳完保存MD5,先計算md5--比對-匹配了就不需要上傳了
  • GIT/Svn: md5比對
任何數據MD5後結果都不一樣,到目前為止還沒碰過 2的128次方可能性

DES 對稱可逆加密

應用:數據傳輸
優點:加密速度快
缺點:密鑰的安全是問題
是公開的演算法,即使拿到密文,也推算不了密鑰,也推算不回原文
/// <summary>
/// DES AES Blowfish
///  對稱加密算法的優點是速度快,
///  缺點是密鑰管理不方便,要求共享密鑰。
/// 可逆對稱加密,密鑰長度8
/// </summary>
public class DesEncrypt
{
private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Substring(0, 8));
private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Insert(0, "w").Substring(0, 8));

/// <summary>
/// DES 加密
/// </summary>
/// <param name="text">需要加密的值</param>
/// <returns>加密后的结果</returns>
public static string Encrypt(string text)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
StreamWriter sWriter = new StreamWriter(crypStream);
sWriter.Write(text);
sWriter.Flush();
crypStream.FlushFinalBlock();
memStream.Flush();
return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
}
}

/// <summary>
/// DES解密
/// </summary>
/// <param name="encryptText"></param>
/// <returns>解密后的结果</returns>
public static string Decrypt(string encryptText)
{
DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
byte[] buffer = Convert.FromBase64String(encryptText);

using (MemoryStream memStream = new MemoryStream())
{
CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
crypStream.Write(buffer, 0, buffer.Length);
crypStream.FlushFinalBlock();
return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
}
}
}

RSA 非對稱可逆加密

加密鑰做為私鑰 解密鑰做為公鑰 保證訊息一定來自某個人
加密鑰做為公開 解密鑰做為私有 表示訊息只有我能看的到
加密解密速度不快,安全性好
/// <summary>
/// RSA ECC
/// 可逆非對稱加密
/// 非對稱加密算法的優點是密鑰管理很方便,缺點速度慢。
/// </summary>
public class RsaEncrypt
{
/// <summary>
/// 獲取加密/解密對
/// 给你一個,是無法推算出另外一个的
///
/// Encrypt Decrypt
/// </summary>
/// <returns>Encrypt Decrypt</returns>
public static KeyValuePair<string, string> GetKeyPair()
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
string publicKey = RSA.ToXmlString(false);
string privateKey = RSA.ToXmlString(true);
return new KeyValuePair<string, string>(publicKey, privateKey);
}

/// <summary>
/// 加密:内容+加密key
/// </summary>
/// <param name="content"></param>
/// <param name="encryptKey">加密key</param>
/// <returns></returns>
public static string Encrypt(string content, string encryptKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(encryptKey);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(content);
byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
return Convert.ToBase64String(resultBytes);
}

/// <summary>
/// 解密 内容+解密key
/// </summary>
/// <param name="content"></param>
/// <param name="decryptKey">解密key</param>
/// <returns></returns>
public static string Decrypt(string content, string decryptKey)
{
byte[] dataToDecrypt = Convert.FromBase64String(content);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(decryptKey);
byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
UnicodeEncoding ByteConverter = new UnicodeEncoding();
return ByteConverter.GetString(resultBytes);
}


/// <summary>
/// 可以合併在一起的,每次產生一组新的密鑰
/// </summary>
/// <param name="content"></param>
/// <param name="encryptKey">加密key</param>
/// <param name="decryptKey">解密key</param>
/// <returns>加密后结果</returns>
private static string Encrypt(string content, out string publicKey, out string privateKey)
{
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
publicKey = rsaProvider.ToXmlString(false);
privateKey = rsaProvider.ToXmlString(true);

UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(content);
byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);
return Convert.ToBase64String(resultBytes);
}
}
關於數字證書SSL之後會專門寫一篇文章跟大家講解

參考資料

本篇已同步發表至個人部落格
https://moushih.com/2022ithome16/
我的鐵人賽文章
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
8會員
39內容數
我是這個部落格的作者,喜歡分享有關投資 💰、軟體開發 💻、占卜 🔮 和虛擬貨幣 🚀 的知識和經驗。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
一代軍師 的其他內容
環境安裝 這邊可以先安裝Expression Tree Visualizer工具 Viusla studio 2019 安裝方式: 檔案(ExpressionTreeVisualizer.2019)下載完之後,將檔案複製到此目錄: C:\Program Files (x86)\Microsoft V
環境準備 準備用測試資料 語法說明 Where 應用場景:過濾、查詢等功能 說明:與SQL命令中的where功能相似,都是過濾範圍內的數值 例如:使用where篩選,年紀大於30的同學 First 應用場景:篩選出第一筆資料,但資料如果是空的會跳Exception 說明:返回集合中的第一個元素,其實
介紹 LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。 大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
環境安裝 這邊可以先安裝Expression Tree Visualizer工具 Viusla studio 2019 安裝方式: 檔案(ExpressionTreeVisualizer.2019)下載完之後,將檔案複製到此目錄: C:\Program Files (x86)\Microsoft V
環境準備 準備用測試資料 語法說明 Where 應用場景:過濾、查詢等功能 說明:與SQL命令中的where功能相似,都是過濾範圍內的數值 例如:使用where篩選,年紀大於30的同學 First 應用場景:篩選出第一筆資料,但資料如果是空的會跳Exception 說明:返回集合中的第一個元素,其實
介紹 LINQ全名是(Language-Integrated Query),是一組以直接將查詢功能整合至C# 語言為基礎之技術的名稱。 大家可以想像SQL有SQL的查詢語法,MySql有MySql的查詢語法,但我們可以只透過LINQ語法,C#會自動幫我們轉換成對應的資料庫查詢語法,有點像是秦始皇統一
介紹 序列化、反序列化概念: 📷 關於泛型委派、解偶、非同步多執行緒、委派的歷史寫法演進之後會專門寫一篇文章跟大家講解 使用方式 測試資料 SerializableAttribute 微軟說明文件 二進位序列化 雖然這裡介紹BinaryFormatter但在 .NET 7中已經屬於過時的方法了
介紹 委派 透過委派可以實現把方法作為參數傳遞 從範例可以看出我們將DoNothing當成參數在傳遞 📷 事件 事件:是帶event關鍵字的委派的實體,可以限制變數被外部直接使用/直接賦予值(安全保障) 特點: 不能直接Invoke() 不能 賦予 null => = null 委派是一個類型
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Token Extension的主角之一 Transfer Fee 目前官方釋出的代幣擴充功能總共 14 項,其中又以 Transfer fee 這個擴充為最多人使用。Transfer fee 嚴格規範了每筆轉帳交易的手續費,讓代幣的發行者擁有更好手續費來源,同時也保障 NFT 創作者的版稅收益。
Thumbnail
今年一月正式推出的 Solana 上的新標準 Token Extension,重塑了之前 Solana 所使用的 token 協議,替 Solana的鏈上資產解放更多潛力。資產之間的交互將變得更靈活,除了讓帳戶之間的轉帳更有保障之外,也在 Defi 未來的結構性商品上產生了更多的想像空間。
Thumbnail
《玩轉腦朋友2》刪除角色1:Shame 羞恥 在《玩轉腦朋友》的開發過程中,「羞恥」原本是27種情緒之一,最初設計為男性角色。但在續集中,「羞恥」被重新塑造成女性角色,預計成為新的情緒角色。然而,導演認為「羞恥」會讓萊莉的成長故事過於沉重和黑暗,因此將這種情緒融合進「阿焦」的性格中,成為「我不夠
Thumbnail
這是一篇關於名古屋旅遊的文章,介紹了從機場到市區、不同景點的遊玩體驗,特別適合親子自由行。
Thumbnail
通路創新和創意結合,帶來了許多令人驚喜的商業案例。從Amazon Go的無人商店到UBEREAT機器人送餐,不同品牌都在用新科技改變生活方式。本文分享了幾個成功的通路創新案例,絕對能啟發你的Idea!
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
暢銷懸疑小說的《法庭遊戲》改編為電影版,日前也在台灣上映,燒腦的情節加上法庭的諜對諜攻防;再加上永瀨廉、杉咲花、北村匠海三位高人氣演員加持。
Thumbnail
自2020年問世以來,日本潮流品牌Water The Plant便以其獨特的設計理念和色彩豐富的產品系列,在全球潮流文化中掀起了一股正能量的旋風。
Thumbnail
戴姆勒克萊斯勒出產的後輪驅動雙門跑車 Chrysler Crossfire(火線),使用 33% 賓士 SLK 跑車零件,在 2003 年推出,於 2007 年因為公司重組後停產。雖然,1:1 的新車買不起,那買台 1:18 的模型車來玩玩總是可以的。😜