C#實(shí)現(xiàn)XOR密碼(異或密碼)的示例代碼
XOR密碼(異或密碼)是一種簡(jiǎn)單的加密算法,它使用異或(XOR)操作來(lái)對(duì)明文和密鑰進(jìn)行加密和解密。
異或操作是一種位運(yùn)算,它對(duì)兩個(gè)二進(jìn)制數(shù)的對(duì)應(yīng)位進(jìn)行比較,如果兩個(gè)位相同(都為0或都為1),則結(jié)果位為0,否則為1。以下是兩個(gè)二進(jìn)制數(shù)進(jìn)行異或操作的真值表:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
在XOR密碼中,我們將明文的每個(gè)字節(jié)(8個(gè)位)與密鑰的對(duì)應(yīng)字節(jié)進(jìn)行異或操作,生成密文。解密過(guò)程與加密過(guò)程相同,將密文的每個(gè)字節(jié)與密鑰的對(duì)應(yīng)字節(jié)進(jìn)行異或操作,得到原始明文。
XOR密碼的特點(diǎn)包括:
1、異或操作具有反轉(zhuǎn)性質(zhì),即 `A XOR B XOR B = A`。所以,如果我們知道明文或密文和密鑰中的一個(gè),可以輕松獲取另一個(gè)。
2、由于異或操作是一種可逆運(yùn)算,所以加密和解密使用相同的算法。
3、異或密碼相對(duì)較簡(jiǎn)單,安全性較低。因此,它通常用于輔助加密或在加密算法中的一個(gè)步驟。
為了提高安全性,通常會(huì)使用較長(zhǎng)的密鑰,并且使用隨機(jī)生成的密鑰。在實(shí)際應(yīng)用中,XOR密碼常常與其他加密算法結(jié)合使用,以增加安全性。
值得注意的是,XOR密碼的安全性依賴(lài)于密鑰的保密性。如果密鑰被泄露,攻擊者可以輕松解密消息。因此,在實(shí)際使用中,需要采取措施確保密鑰的安全性,例如使用安全的密鑰交換協(xié)議或使用公鑰密碼學(xué)。
下面是一個(gè)使用C#編寫(xiě)的XOR密碼的完整示例:
using System; using System.Text; public class XORCipher { private static string EncryptDecrypt(string input, string key) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.Length; i++) { // Perform XOR operation between the current character in the input and key char c = (char)(input[i] ^ key[i % key.Length]); sb.Append(c); } return sb.ToString(); } public static void Main() { Console.WriteLine("Enter the text to encrypt:"); string input = Console.ReadLine(); Console.WriteLine("Enter the encryption key:"); string key = Console.ReadLine(); // Encrypt the input string encrypted = EncryptDecrypt(input, key); Console.WriteLine("Encrypted text: " + encrypted); // Decrypt the encrypted text string decrypted = EncryptDecrypt(encrypted, key); Console.WriteLine("Decrypted text: " + decrypted); } }
在這個(gè)示例中,我們定義了一個(gè)`XORCipher`類(lèi),其中包含一個(gè)用于加密和解密的`EncryptDecrypt`方法。該方法接受明文和密鑰作為輸入,在每個(gè)字符上執(zhí)行異或操作,并返回加密或解密后的結(jié)果。
在`Main`方法中,我們首先提示用戶輸入要加密的文本和密鑰。然后,我們調(diào)用`EncryptDecrypt`方法對(duì)輸入進(jìn)行加密,并打印加密后的結(jié)果。接下來(lái),我們使用相同的密鑰對(duì)加密后的文本進(jìn)行解密,并打印解密后的結(jié)果。
你可以根據(jù)需要修改該示例,例如添加錯(cuò)誤檢查或擴(kuò)展密鑰長(zhǎng)度。請(qǐng)記住,密鑰的保密性非常重要,且必須與解密者共享。
方法補(bǔ)充
除了上文的實(shí)現(xiàn)方法,小編為大家整理了其他C#實(shí)現(xiàn)簡(jiǎn)單異或加密的相關(guān)代碼,希望對(duì)大家有所幫助
將本地的mp4和ts文件加密為“dj”文件,無(wú)法播放。解密則是將“dj”文件解密為mp4或ts文件。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.Write("請(qǐng)輸入操作方式(1加密、0解密):"); var key = Console.ReadLine(); if (key == "1") { Encrypt(); } else { Dencrypt(); } Console.ReadKey(); } /// <summary> /// 加密處理 /// </summary> static void Encrypt() { string path = AppDomain.CurrentDomain.BaseDirectory; string[] extends = new string[] { "*.ts", "*.mp4" }; foreach (var ex in extends) { foreach (var file in Directory.GetFiles(path, ex)) { Encrypt(file, file + ".dj"); Console.WriteLine($"[{file}]加密成功"); File.Delete(file); } } Console.WriteLine("所有文件加密成功"); } static void Dencrypt() { string path = AppDomain.CurrentDomain.BaseDirectory; foreach (var file in Directory.GetFiles(path, "*.dj")) { Encrypt(file, file.Replace(".dj", "")); Console.WriteLine($"[{file}]解密成功"); File.Delete(file); } Console.WriteLine("所有文件解密成功"); } static void Encrypt(string sourceFileName, string targetFileName) { using (var writeStream = File.OpenWrite(targetFileName)) { //int start = 0; int len = 0; byte[] readBytes = new byte[1024]; using (var readStream = File.OpenRead(sourceFileName)) { var totalLenth = readStream.Length; while ((len = readStream.Read(readBytes, 0, readBytes.Length)) > 0) { writeStream.Write(Encry(readBytes), 0, len); Console.WriteLine($"[{sourceFileName}]讀取中[{readStream.Position}/{totalLenth}]"); } } } } static byte[] Encry(byte[] bs) { for (int i = 0; i < bs.Length; i++) { bs[i] = (byte)(bs[i] ^ 0x12); } return bs; } } }
到此這篇關(guān)于C#實(shí)現(xiàn)XOR密碼(異或密碼)的示例代碼的文章就介紹到這了,更多相關(guān)C# XOR密碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)讓ListBox適應(yīng)最大Item寬度的方法
這篇文章主要介紹了C#實(shí)現(xiàn)讓ListBox適應(yīng)最大Item寬度的方法,涉及ListBox控件的操作技巧,需要的朋友可以參考下2015-05-05c#遍歷System.drawing.Color下面的所有顏色以及名稱(chēng)以查看
c#遍歷System.drawing.Color下面的所有顏色以及名稱(chēng)以查看,需要的朋友可以參考一下2013-02-02C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用
這篇文章主要介紹了C#Windows窗體設(shè)計(jì)之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07C#不改變圖像長(zhǎng)寬比例調(diào)整圖像大小方式
文章介紹了在UI顯示圖片時(shí),當(dāng)容器大小固定而圖片尺寸大于容器時(shí),可以通過(guò)編碼計(jì)算長(zhǎng)寬來(lái)重繪圖像,以確保圖像的長(zhǎng)寬比例不變,C#代碼示例展示了如何在Winform前端實(shí)現(xiàn)這一功能2025-01-01解析使用enumerator模式簡(jiǎn)化異步操作的詳解
本篇文章是對(duì)使用enumerator模式簡(jiǎn)化異步操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05c#數(shù)據(jù)綁定之?dāng)?shù)據(jù)轉(zhuǎn)化為信息的示例
這篇文章主要介紹了c#數(shù)據(jù)綁定中的數(shù)據(jù)轉(zhuǎn)化為信息的示例,需要的朋友可以參考下2014-04-04C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn)
本文主要介紹了C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02C#使用Win32?Api實(shí)現(xiàn)進(jìn)程注入到wechat的過(guò)程
這篇文章主要介紹了C#使用Win32?Api實(shí)現(xiàn)進(jìn)程注入到wechat,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09