Scrambler
创建加密文本,该文本对于同一消息每次都不同!

引言
可能我们都尝试编写代码来加扰文本,以便我们可以传递秘密消息。 C# 内置了加密功能,但使用已经存在的东西并不有趣。 过去几天我有一些额外的时间,所以我编写了自己的文本加扰器。
这个程序每次都会得到不同的输出......它很难破解。 您必须知道在哪里查找,我不认为任何不知道代码的人都可以在加扰版本中找到加密的文本,但谁知道呢......我们中的一些人非常聪明。 ;)
想法
这个程序有两个加扰部分。 在第一部分中,它将文本转换为二进制代码。 我可以使用bitArray
,但我找不到一种简单的方法来反转它,所以我添加了“字符”和“二进制”列表。 加扰器是一个类,所以我认为它的速度应该和普通的加密器一样快。 加扰器的第二部分实际上是在做繁重的工作。 它会在每个二进制数之间输入随机字符和随机数量。 每次二进制替换和它们之间的字符数量都是随机的,这样就没有人真正知道哪个字符集将被二进制数(1 和 0)替换。
代码
(文章格式:先解释,然后是代码。)
Form1。 来自按钮事件处理程序的类调用。
{
public partial class Form1 : Form{
Scrambler.Scrambler NewScr = new Scrambler.Scrambler();
public Form1(){
InitializeComponent();}
private void button2_Click(object sender, EventArgs e){
MessageBox.Show(NewScr.MainString(textBox2.Text ,0));}
private void button3_Click(object sender, EventArgs e){
MessageBox.Show(NewScr.MainString(textBox3.Text, 1));}
private void button1_Click(object sender, EventArgs e){
textBox2.Text = NewScr.BinaryString(textBox1.Text);
textBox3.Text = NewScr.ScrambledString(textBox1.Text);}
private void button4_Click(object sender, EventArgs e){
// Exit the program
if (Application.MessageLoop){
// Use this since we are a WinForms app
Application.Exit();}
else{
// Use this since we are a console app
Environment.Exit(1);}}}
}
在 Class 模块中...
private string AllScrChrs
:加扰器字符。 您始终可以更改字符的数量,使您的代码更复杂或更简单。
private string AllScrChrs =
"!@#$%&*abcdefghiklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ1234567890";
类中有三个public
方法
-
public string BinaryString(string MainString)
从文本框传递文本并返回二进制字符串
-
public string ScrambledString(string MainString)
从文本框传递文本并返回加扰的字符串
-
public string MainString(string PassingStr, byte BinaryOrScrambled)
传递二进制或加扰的字符串,以及一个布尔值以确定将处理哪一个。 要么从二进制到文本,要么从加扰到文本。 如果从加扰中选择,代码首先将字符串转换为二进制字符串,然后解码为文本。
public string BinaryString(string MainString){
return BinaryWork(MainString);}
public string ScrambledString(string MainString){
return ScrambstrBinaryext(BinaryWork(MainString));}
public string MainString(string PassingStr, byte BinaryOrScrambled){
string MainText = "";
switch (BinaryOrScrambled){
case 0:
MainText = DecodeBinary(PassingStr);
break;
case 1:
MainText = DecodeBinary((UnScrambstrBinaryext(PassingStr)));
break;}
return MainText;}
private string BinaryWork(string WhatToWorkOn)
调用此方法以创建输入的文本的二进制代码。
private string BinaryWork(string WhatToWorkOn){
string BinaryResults = "";
foreach (char GetChr in WhatToWorkOn){
BinaryResults += GetBinary(GetChr);}
return BinaryResults;}
private string GetBinary(char strChr){
return Convert.ToString(strChr, 2).PadLeft(8, '0');}
private string DecodeBinary(string PassingString)
从此方法中,从二进制字符串创建字符。
private string DecodeBinary(string PassingString){
int ii;
string CharResult="";
for (ii = 0; ii < PassingString.Length; ii+=8){
try{
CharResult += GetCharacter(PassingString.Substring(ii, 8));}
catch (OverflowException) { }}
return CharResult;}
private char GetCharacter(string strBinary){
return (char)Convert.ToInt32(strBinary, 2);}
private string ScrambstrBinaryext(string ScrString)
主加扰器。 让我只解释一下这部分代码的作用,而不是逐行教程。
private string OneAndZero(int Rept, string sOZ)
我使用此方法输入随机字符,二进制数之间有 3 个随机量。 在二进制数开始之前和二进制数结束之后也会调用此方法。 因此,不仅在二进制数和二进制数本身之间,而且两端也随机加扰,使事情变得更加复杂。
private string ScrambstrBinaryext(string ScrString){
int rndRep;
Random intRan = new Random();
string newString = "";
string ScrChrs = AllScrChrs;
string chrOne = ScrChrs.Substring(intRan.Next(ScrChrs.Length), 1);
ScrChrs = ScrChrs.Replace(chrOne, "");
string chrZero = ScrChrs.Substring(intRan.Next(ScrChrs.Length), 1);
ScrChrs = ScrChrs.Replace(chrZero, "");
int IntStrLength = ScrString.Length;
foreach (char OZchr in ScrString){
rndRep = intRan.Next(3);
switch (OZchr){
case '1': // I wrote a method to make things simpler.
newString += OneAndZero(rndRep, chrOne) + OneAndZero(rndRep, ";");
break;
case '0':
newString += OneAndZero(rndRep, chrZero) + OneAndZero(rndRep, ":");
break;}
newString += OneAndZero(intRan.Next(1, 3),
ScrChrs.Substring(intRan.Next(ScrChrs.Length), 1));}
// When returned, the first and the last character are
// random to confuse people. Before that, two characters are our guys
return OneAndZero(intRan.Next(1, 3),
ScrChrs.Substring(intRan.Next(ScrChrs.Length), 1))
+ newString + OneAndZero(intRan.Next(3), chrOne) +
OneAndZero(intRan.Next(3), chrZero)
+ OneAndZero(intRan.Next(1, 3),
ScrChrs.Substring(intRan.Next(ScrChrs.Length), 1));}
// This method is called a few times to enter random number of characters
private string OneAndZero(int Rept, string sOZ){
int ii;
for (ii = 0; ii < Rept; ii++){
sOZ += sOZ.Substring(0, 1);}
return sOZ;}
private string UnScrambstrBinaryext(string Uscr)
解扰器。 再次,与其逐行查看代码,不如让我解释一下这部分代码的作用。
private string rvsString(string ReverseThis)
代码的最后 9 个字符中,包含 1 个额外的字符在末尾,2-二进制“1”,3-二进制“0”字符,我们需要替换它们。 代码的一个非常重要的部分是找出哪些字符是“1”和“0”,它们位于加扰文本的最后三个字符中。 这样,我们就可以在每次加扰调用时为它们放置任何字符。
private string SingleString(string MultiString, string StrFull)
所有重复的字符都将是单数。
private string UnScrambstrBinaryext(string Uscr){
// Cut last 9 characters of the text
// Last 9 characters contain the extra character with 1 & 0 characters
string[] strOneToZero = new string[3];
string ScrChrs = AllScrChrs;
int ii;
string LastNine = rvsString(Uscr.Substring(Uscr.Length - 9));
// A unique way to find unique characters once ;)
foreach (char ChrNine in LastNine){
if (strOneToZero[0] == null){
strOneToZero[0] = ChrNine.ToString(); continue;}
if (strOneToZero[0] == ChrNine.ToString()) continue;
if (strOneToZero[1] == null){
strOneToZero[1] = ChrNine.ToString(); continue;}
if (strOneToZero[1] == ChrNine.ToString()) continue;
strOneToZero[2] = ChrNine.ToString();
break;}
// We need array "1" and "2". "0" is extra
ScrChrs = ScrChrs.Replace(strOneToZero[1],"");
ScrChrs = ScrChrs.Replace(strOneToZero[2], "");
for (ii = 0; ii < ScrChrs.Length; ii++){
Uscr = Uscr.Replace(ScrChrs.Substring(ii,1),"");}
// I wrote a method to make things simpler.
Uscr = SingleString(strOneToZero[1], Uscr);
Uscr = SingleString(strOneToZero[2], Uscr);
Uscr = Uscr.Replace(";", "");
Uscr = Uscr.Replace(":", "");
Uscr = Uscr.Replace(strOneToZero[1], "0");
Uscr = Uscr.Replace(strOneToZero[2], "1");
return Uscr.Substring(0,(Uscr.Length-2));} // Last two was our guys remember?
// Replace duplicate characters with single
private string SingleString(string MultiString, string StrFull){
while (StrFull.IndexOf(MultiString + MultiString) != -1){
StrFull = StrFull.Replace(MultiString + MultiString, MultiString);}
return StrFull;}
// I wrote this reverser for the last 9 characters of the scrambled text
private string rvsString(string ReverseThis){
string rvSt = "";
int ii;
for (ii = (ReverseThis.Length-1); ii > 0; ii--){
rvSt += ReverseThis.Substring(ii, 1);}
return rvSt;}
这是一个非常简单的代码,具有简单的文本和字符工作。 这是一个学习/练习代码,我发现它足够有趣可以发布。 我希望你也觉得它有趣。 :)