C#學習第21天:安全與加密(Security and Cryptography)

核心概念


1. 什么是加密?

  • 加密:加密是一種將數據轉換為一種不可讀形式的方法,只有持有相應密鑰的人才能解密并讀取數據。
  • 目的:確保數據的機密性和安全性,特別是在傳輸過程中過防止未授權訪問。

2. 加密類型

對稱加密:

  • 使用相同的密鑰進行加密和解密。
  • 常見算法:AES、DES。
  • 優點:速度快,適合大數據量加密。

非對稱加密:

  • 使用公鑰加密和私鑰解密。
  • 常見算法:RSA。
  • 優點:安全性高,適合密鑰交換和數字簽名。

3. 散列函數

  • 散列函數:又稱為哈希函數,將任意長度的數據轉換為固定長度的字符串。
  • 特點:不可逆,常用于驗證數據完整性。
  • 常見算法:MD5、SHA-256。

?實際使用


對稱加密示例:AES

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;public class AesEncryptionExample
{public static void Main(){string original = "Sensitive data that needs encryption";// 創建AES加密服務實例using (Aes aesAlg = Aes.Create()){// 加密字符串到字節數組byte[] encrypted = EncryptStringToBytes_Aes(original, aesAlg.Key, aesAlg.IV);// 解密字節數組回字符串string decrypted = DecryptStringFromBytes_Aes(encrypted, aesAlg.Key, aesAlg.IV);Console.WriteLine($"Original: {original}");Console.WriteLine($"Decrypted: {decrypted}");}}static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV){// 參數檢查if (plainText == null || plainText.Length <= 0)throw new ArgumentNullException(nameof(plainText));if (Key == null || Key.Length <= 0)throw new ArgumentNullException(nameof(Key));if (IV == null || IV.Length <= 0)throw new ArgumentNullException(nameof(IV));byte[] encrypted;// 使用AES算法using (Aes aesAlg = Aes.Create()){aesAlg.Key = Key; // 設置加密密鑰aesAlg.IV = IV;   // 設置初始化向量// 創建一個加密器來執行流轉換ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);// 用內存流進行加密using (MemoryStream msEncrypt = new MemoryStream()){// 創建加密流using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){swEncrypt.Write(plainText); // 寫入并加密數據}encrypted = msEncrypt.ToArray(); // 獲取加密后的字節數組}}}return encrypted; // 返回加密字節數組}static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV){// 參數檢查if (cipherText == null || cipherText.Length <= 0)throw new ArgumentNullException(nameof(cipherText));if (Key == null || Key.Length <= 0)throw new ArgumentNullException(nameof(Key));if (IV == null || IV.Length <= 0)throw new ArgumentNullException(nameof(IV));string plaintext = null;// 使用AES算法using (Aes aesAlg = Aes.Create()){aesAlg.Key = Key; // 解密密鑰aesAlg.IV = IV;   // 初始化向量// 創建解密器ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);// 用內存流進行解密using (MemoryStream msDecrypt = new MemoryStream(cipherText)){// 創建解密流using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)){using (StreamReader srDecrypt = new StreamReader(csDecrypt)){plaintext = srDecrypt.ReadToEnd(); // 讀取并解密數據}}}}return plaintext; // 返回解密后的字符串}
}

非對稱加密示例:RSA

using System;
using System.Security.Cryptography;
using System.Text;public class RsaEncryptionExample
{public static void Main(){// 創建RSA實例using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){// 導出公鑰和私鑰string publicKey = rsa.ToXmlString(false); // 公鑰,不包含私鑰string privateKey = rsa.ToXmlString(true); // 私鑰,包含全部信息string original = "Data for RSA encryption";// 加密數據byte[] encrypted = Encrypt(original, publicKey);// 解密數據string decrypted = Decrypt(encrypted, privateKey);Console.WriteLine($"Original: {original}");Console.WriteLine($"Decrypted: {decrypted}");}}public static byte[] Encrypt(string data, string publicKey){using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){rsa.FromXmlString(publicKey); // 加載公鑰var dataBytes = Encoding.UTF8.GetBytes(data); // 轉換數據為字節數組return rsa.Encrypt(dataBytes, false); // 執行加密}}public static string Decrypt(byte[] data, string privateKey){using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()){rsa.FromXmlString(privateKey); // 加載私鑰var decryptedBytes = rsa.Decrypt(data, false); // 執行解密return Encoding.UTF8.GetString(decryptedBytes); // 轉換回字符串}}
}

SHA-256 散列示例

using System;
using System.Security.Cryptography;
using System.Text;public class HashingExample
{public static void Main(){string data = "Data to hash";// 計算SHA-256散列值string hash = ComputeSha256Hash(data);Console.WriteLine($"Data: {data}");Console.WriteLine($"Hash: {hash}");}public static string ComputeSha256Hash(string rawData){using (SHA256 sha256Hash = SHA256.Create()){// 將輸入字符串轉換為字節數組并計算其哈希值byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));// 將字節數組轉變為十六進制字符串StringBuilder builder = new StringBuilder();for (int i = 0; i < bytes.Length; i++){builder.Append(bytes[i].ToString("x2")); // 格式化為兩位十六進制}return builder.ToString(); // 返回散列值}}
}
  • SHA-256散列值,通常用來驗證兩個文件是否相同。

這些示例展示了如何在C#中實現常見的安全和加密任務。如果有其他問題或需要進一步講解,請隨時告訴我!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78679.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV 圖形API(77)圖像與通道拼接函數-----對圖像進行幾何變換函數remap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對圖像應用一個通用的幾何變換。 函數 remap 使用指定的映射對源圖像進行變換&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

在線時間戳轉換工具

給大家推薦一個在線時間戳轉換工具 點擊跳轉-鴿鴿在線工具 這個工具除了時間戳轉換&#xff0c;到首頁還能選擇使用很多其他小工具&#xff0c;歡迎使用

WPF之面板特性

文章目錄 1. 概述2. WPF布局系統基礎2.1 布局過程概述2.2 布局重新計算的觸發條件2.3 布局重新計算的核心方法 3. WPF內置面板類型及特性3.1 面板類型概覽3.2 Canvas面板3.3 StackPanel面板3.4 WrapPanel面板3.5 DockPanel面板3.6 Grid面板3.7 UniformGrid面板3.8 Virtualizing…

【技術追蹤】通過潛在擴散和先驗知識增強時空疾病進展模型(MICCAI-2024)

向擴散模型中引入先驗知識&#xff0c;實現疾病進展預測&#xff0c;擴散模型開始細節作業了~ 論文&#xff1a;Enhancing Spatiotemporal Disease Progression Models via Latent Diffusion and Prior Knowledge 代碼&#xff1a;https://github.com/LemuelPuglisi/BrLP 0、摘…

[ linux-系統 ] 常見指令2

1. man 指令 語法&#xff1a;man [選項] 命令 功能&#xff1a;查看聯機手冊獲取幫助。 選項說明-k根據關鍵字搜索聯機幫助。num只在第num章節找。-a顯示所有章節的內容。 man是 Unix 和類 Unix 系統中的一個命令&#xff0c;用于查看操作系統和軟件的手冊頁面&#xff08;ma…

STL之stackqueue

stack的介紹&#xff08;可以想象成棧&#xff09; 1.stack是一種容器適配器&#xff0c;專門用在具有后進先出操作的上下文環境中&#xff0c;其刪除只能從容器的一端進行元素的插入與提取操作 2.stack是作為容器適配器被實現的&#xff0c;容器適配器即是對特點類封裝作為其…

【現代深度學習技術】現代循環神經網絡06:編碼器-解碼器架構

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上&#xff0c;結合當代大數據和大算力的發展而發展出來的。深度學習最重…

宏電全新升級單北斗5G電力DTU,為每一公里電力線路注入可靠連接

在配網自動化改造與數字化轉型的雙重驅動下&#xff0c;宏電股份推出全新升級版H7710-DLWZ系列5G電力DTU&#xff0c;聚焦配網通信鏈路冗余、國產自主可控、復雜環境適應性三大核心需求&#xff0c;為配電自動化、臺區智能運維、分布式能源接入等場景提供高可靠通信底座。 國產…

學習海康VisionMaster之間距檢測

一&#xff1a;進一步學習了 今天學習下VisionMaster中的間距檢測工具&#xff1a;主要類似于卡尺工具&#xff0c;測量物體的長度或者寬度或者間距 二&#xff1a;開始學習 1&#xff1a;什么是間距檢測&#xff1f; 間距測量模塊用于檢測兩特征邊緣之間的間距&#xff0c;首…

藍橋杯 18. 積木

積木 原題目鏈接 題目描述 小明用積木搭了一個城堡。為了方便&#xff0c;小明使用的是大小相同的正方體積木&#xff0c;并將其搭建在一個 n 行 m 列的方格圖上。每個積木占據方格圖中的一個小格子。 小明的城堡是立體的&#xff0c;可以將積木壘在其他積木上。當某個格子…

C++負載均衡遠程調用學習之基礎TCP服務

目錄 1.LARS課程模塊介紹 2.LARS的功能演示機場景作用 3.LARS的reactor框架的組成部分 4.Lars_reactor的項目目錄構建 5.Lars_tcp_server的基礎服務開發 6.Lars_tcp_server的accept實現 7.LarsV0.1總結 1.LARS課程模塊介紹 2.LARS的功能演示機場景作用 # Lars系統開發 …

EasyExcel使用總結

EasyExcel 文章目錄 EasyExcel1、導入1.1、基本方式導入1.導入依賴2. 加載源文件基本語法 3. 讀取數據行4. 讀取結果 1.2、模型映射導入1.定義實體映射類2. 操作讀取基本語法 3. 讀取數據行4. 讀取結果 1.3、導入類型轉換器語法 1.4、導入監聽器基本語法&#xff1a; 1.5、多行…

【愚公系列】《Manus極簡入門》022-藝術創作顧問:“藝術靈感使者”

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

藍橋杯15屆國賽 最小字符串

問題描述 給定一個長度為 N 且只包含小寫字母的字符串 S&#xff0c;和 M 個小寫字母 c1,c2,...,cM?。現在你要把 M 個小寫字母全部插入到字符串 S 中&#xff0c;每個小寫字母都可以插入到任意位置。請問能得到的字典序最小的字符串是什么&#xff1f; 輸入格式 第一行包含…

【東楓科技】代理英偉達產品:DPU

NVIDIA BlueField-3 DPU 400Gb/s 基礎設施計算平臺 NVIDIA BlueField -3 數據處理單元 (DPU) 是第三代基礎設施計算平臺&#xff0c;使企業能夠構建從云端到核心數據中心再到邊緣的軟件定義、硬件加速的 IT 基礎設施。借助 400Gb/s 以太網或 NDR 400Gb/s InfiniBand 網絡連接…

依圖科技C++后端開發面試題及參考答案

請介紹你所了解的分布式系統 分布式系統是由多個獨立的計算節點通過網絡連接組成的系統&#xff0c;這些節點共同協作以完成特定的任務。分布式系統的設計目標在于提升系統的性能、可擴展性、可靠性和容錯性。 從性能方面來看&#xff0c;分布式系統能夠把任務分配到多個節點…

Python cv2濾波與模糊處理:從原理到實戰

在圖像處理領域&#xff0c;濾波與模糊是預處理階段的兩大核心操作&#xff0c;既能消除噪聲干擾&#xff0c;又能實現藝術化效果。本文將結合OpenCV的cv2庫&#xff0c;系統講解濾波與模糊的原理及Python實現&#xff0c;帶你從理論到實戰全面掌握這項技術。 一、濾波與模糊的…

在 Laravel 12 中實現 WebSocket 通信時進行身份驗證

在 Laravel 12 中實現 WebSocket 通信時&#xff0c;若需在身份驗證失敗后主動斷開客戶端連接&#xff0c;需結合 頻道認證機制 和 服務端主動斷連操作。以下是具體實現步驟&#xff1a; 一、身份驗證流程設計 WebSocket 連接的身份驗證通常通過 私有頻道&#xff08;Private …

FPGA----基于ZYNQ 7020實現petalinux并運行一個程序

引言&#xff1a;上一節我們講到了使用Alinx 7020b自帶的sd卡中的petalinux進行epics的編譯&#xff0c;但此種方案個性化程度不足。如&#xff1a;我們項目需要FPGA側的配合&#xff0c;那么我們需要重新編譯petalinx。 注意&#xff1a;本文的知識點來自下面兩篇文章&#x…

Spring Web MVC————入門(1)

今天開始正式帶大家學習Spring部分的內容了&#xff0c;大家嘗試去弄個專業版嗷&#xff0c;學習起來爽一點 在idea中下載這個插件就行了 我們之后開始創建Spring項目&#xff0c; 藍色 部分自己起名&#xff0c;type選Maven&#xff0c;其他的默認就好了&#xff0c;之后nex…