八进制加解密个性版

思路:

1.有个RichTextBox控件用于文本的输入与输出、一个Button控件(encode)用于加密程序的触发执行、一个Button(decode)控件用于解密程序的触发执行、用Label控件给用户相应的提示

2.在注册事件的外边定义变量

1.定义一个字符串变量str来接收用户输入到文本框中的文本

3.encode按钮的注册事件中的程序抒写

1.通过定义使用TextRange变量,使用户输入到文本框中的文本传入到str中

2.将str接收到的字符串分隔为一个个单个的字符,第一步加密,将其存入到新建立的string泛型中

通过一个循环来进行"分割出一个字符——第一步加密——存放"的循环操作

1. 循环条件(int i = 0; i < (str.Length-2); i += 1)

循环条件为什么要减2? 因为在定义使用TextRange变量时,它会在我们输入的数末尾增加两个数,我们要把这两个不相干数除去,也就是不去循环它们

2.定一个字符变量char1来存放被分割出来的单个字符, 分割代码是Convert.ToChar(str.Substring(i, 1))

3.定义一个字符串变量str1来存放被第一步加密后的单个字符,第一步加密的代码是Convert.ToString(char1, 8)

4.由于中文字符在vs 2017中转换为八进制数字最高是6位数,所以为了方便解密,加密后位数不够6位的要补成6位;通过if——else if——else语句来实现。存放代码是 list.Add(str1)

3.第二步加密(字符串倒序,即每6位第一步加密数据倒序)

如果被加密的字符个数是偶数,则通过一个for循环逐对将首端和尾端的数据交换位置;如被加密的字符个数是奇数,则在接下来的for循环中,将最后一个数排除在外,使其不参与该循环

1.if条件判断被加密的字符个数是偶数还是寄数,判断代码是.Count % 2 == 0

2.首端和尾端的数据进行交换位置时,需要对存放第一步加密数据的泛型进行操作,因此需要两个索引变量分别从头和尾,每完成一次交换就向中间靠近1个单位。向中间靠近的代码分别是++和--
     首端索引由循环条件中的int变量担任,尾端索引需要新定义一个int变量l
     若是偶数处理,则尾端数据索引初始值是.Count-1, 即应该l=.Count-1;若是奇数处理,则将第一步加密数据的最后一个数据排除之后的尾端数据索引初始值是.Count-2, 即应该l=.Count-2

3.首端和尾端的数据进行交换位置属于两个数据相互交换位置,所以需要一个中间变量m

4.两个for循环分别在if和else中处理偶数和奇数情况。偶数时,循环条件是k<.Count/2; 奇数时, 循环条件是k<(.Count-1)/2;

4.检查输出加密结果的文本框是否存在内容,若存在,则清空其内容

1.通过定义TextRange变量,来进行.Text!=null判断

2.清空内容代码:this. .Document.Blocks.Clear();

5.通过for循环输出存放在泛型中的加密后的内容到输出文本框

1. .AppendText(list[j])

4.decode按钮的注册事件中的程序抒写

1.通过定义使用TextRange变量,使用户输入到文本框中的数字文本传入到str中

2.将str中的空格剪掉,编程代码是str.Replace(" ", "")

3.通过一个for循环,用新建立的string泛型,依次存放str中的,6个数字为一个单位的数据。

1. 循环条件(int i = 0; i < (str.Length-2); i += 1)

循环条件为什么要减2? 因为在定义使用TextRange变量时,它会在我们输入的数末尾增加两个数,我们要把这两个不相干数除去,也就是不去循环它们

4.执行第一步解密(倒序泛型中的所单位数据)

5.检查输出加密结果的文本框是否存在内容,若存在,则清空其内容

1.通过定义TextRange变量,来进行.Text!=null判断

2.清空内容代码:this. .Document.Blocks.Clear();

6.通过一个for循环二次解密并输出存放在泛型中的一次解密后的内容到输出文本框

1.进行将一个单位数据解密成10进制——解密成字符,编程代码是(char)Convert.ToInt32(list[j], 8)的循环操作;

2.进行将二次解密好的单个字符转换成字符串,编程代码是.ToString()的循环操作

3.进行对转换成字符串的单个字符输出的循环操作,编程代码是.AppendText()

源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Secret
{
    /// 
    /// MainWindow.xaml 的交互逻辑
    /// 
    public partial class MainWindow : Window
    {
        
        public MainWindow()
        {
            InitializeComponent();
        }
        string str;

        private void before_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void after_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void encode_Click_1(object sender, RoutedEventArgs e)
        {
            TextRange tR = new TextRange(before.Document.ContentStart, before.Document.ContentEnd);
            str = tR.Text;

            char char1;
            string str1;
            List<string> list = new List<string>();
            int k, l, n;   
            string m;

            for (int i = 0; i < (str.Length - 2); i += 1)  //因方不知道为什么,用了TextRange后,TextRange会在我们输入的数末尾增加两个数,而且这两个数还显示不出来,十分奇怪。所以我们要将这两个有干扰的数字通过不循环它们除去。
            {                                           //这两个数还显示不出来我原因已经查明,vs 2017的默认字符转换编码格式不是ASCII, 因为这两个数字之一的八进制值是15,十进制值是13,对应的应该是音符,然而000141000015000015000015表示a的前面有三个空行,000012000012000141表示a的前面有一个三空行。
                char1 = Convert.ToChar(str.Substring(i, 1));
                str1 = Convert.ToString(char1, 8);

                if (str1.Length < 2)
                {
                    str1 = "00000" + str1;
                    list.Add(str1);
                }
                else if (str1.Length < 3)
                {
                    str1 = "0000" + str1;
                    list.Add(str1);
                }
                else if (str1.Length < 4)
                {
                    str1 = "000" + str1;
                    list.Add(str1);
                }
                else if (str1.Length < 5)
                {
                    str1 = "00" + str1;
                    list.Add(str1);
                }
                else if (str1.Length < 6)
                {
                    str1 = "0" + str1;
                    list.Add(str1);
                }

                else list.Add(str1);
            }

            try
            {
                if (list.Count % 2 == 0)
                {
                    l = list.Count - 1;
                    for (k = 0; k < list.Count / 2; k++)
                    {
                        m = list[k];
                        list[k] = list[l];
                        list[l] = m;
                        --l;
                    }
                }
                else
                {
                    l = list.Count - 2;
                    for (n = 0; n < (list.Count - 1) / 2; n++)
                    {
                        m = list[n];
                        list[n] = list[l];
                        list[l] = m;
                        --l;
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            TextRange tR1 = new TextRange(after.Document.ContentStart, after.Document.ContentEnd);
            if (tR1.Text != null)
            {
                this.after.Document.Blocks.Clear();
            }

            for (int j = 0; j < list.Count; j++)
            {
                after.AppendText(list[j]);
            }
        }

        private void decode_Click(object sender, RoutedEventArgs e)
        {
            TextRange tR = new TextRange(before.Document.ContentStart, before.Document.ContentEnd);
            str = tR.Text;

            int k, l, n;
            string m;
            List<string> list = new List<string>();

            str = str.Replace(" ", "");
            str = str.Replace("\r\n", "");
            for (int i = 0; i < (str.Length - 2); i += 6)
            {
                if (i + 5 < str.Length)
                {
                    list.Add(str.Substring(i, 6));
                }
            }
            try
            {
                if (list.Count % 2 == 0)
                {
                    l = list.Count - 1;
                    for (k = 0; k < list.Count / 2; k++)
                    {
                        m = list[k];
                        list[k] = list[l];
                        list[l] = m;
                        --l;
                    }
                }
                else
                {
                    l = list.Count - 2;
                    for (n = 0; n < (list.Count - 1) / 2; n++)
                    {
                        m = list[n];
                        list[n] = list[l];
                        list[l] = m;
                        --l;
                    }

                }
                TextRange tR1 = new TextRange(after.Document.ContentStart, after.Document.ContentEnd);
                if (tR1.Text != null)
                {
                    this.after.Document.Blocks.Clear();

                }

                for (int j = 0; j < list.Count; j++)
                {
                    char a = (char)Convert.ToInt32(list[j], 8);
                    string c = char.ToString(a);
                    after.AppendText(c);
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
    }
}