65.9K
CodeProject 正在变化。 阅读更多。
Home

Scrambler

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (7投票s)

2010年5月5日

CPOL

3分钟阅读

viewsIcon

82489

downloadIcon

425

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

请查看此程序的剪辑片段.

引言

可能我们都尝试编写代码来加扰文本,以便我们可以传递秘密消息。 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;}

这是一个非常简单的代码,具有简单的文本和字符工作。 这是一个学习/练习代码,我发现它足够有趣可以发布。 我希望你也觉得它有趣。 :)

© . All rights reserved.