凯撒密码(二)

凯撒密码(二)

October 24, 2010

上篇显示了用错误的key得到了错误的结果,现在使用正确的key

这样就得到了正确的结果。

当然,这个程序只是演示凯撒密码的一个思路,没有对其他符号加密,这样有个很严重的后果,就是很key容易被破解。

举例:(key是*不告诉你,嘿嘿)

对 !A! 加密 得到了 !C!

对 !B! 加密 得到了 !D!

看出来了么?key是几?

我还提到了一个暴力破解,简单的说一种思路:

使用频率字典

对常用的单词做成字典,比如this,he,she,me,hello等

然后对key进行枚举,从0到26一一列举,然后对每一种情况检查是否包含字典中的词。如果有,就输出这种破解结果。对于输出的所有结果进行人工筛选。

输出了三种结果,其中第二种是正确的。

最后附上源代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CaesarCode
{
	public partial class WinForm : Form
	{
		public WinForm()
		{
			InitializeComponent();
		}

		private void Caesar(int choose)
		{
			bool flag;
			int key;
			int len;
			int i;
			int member;
			string info = info = txtInput.Text;
			flag = int.TryParse(txtKey.Text, out key);

			if (flag == true && info.Length > 0)
			{
				if (choose != 1)
					key = -key;

				txtOutput.Clear();
				len = info.Length;
				for (i = 0; i < len; i++)
				{
					member = info[i];
					if (member >= 'a' && member <= 'z')
					{
						member = (member + key % 26);
						if (member < 'a') member = (member + 26);
						if (member > 'z') member = (member - 26);
						txtOutput.Text += (char)member;
					}
					else if (member >= 'A' && member <= 'Z')
					{
						member = (member + key % 26);
						if (member < 'A') member = (member + 26);
						if (member > 'Z') member = (member - 26);
						txtOutput.Text += (char)member;
					}
					else if (member >= '0' && member <= '9')
					{
						member = (member + key % 10);
						if (member < '0') member = (member + 10);
						if (member > '9') member = (member - 10);
						txtOutput.Text += (char)member;
					}
					else if (member >= 0 && member <= 47)
					{
						member = (member + key % 48);
						if (member < 0) member = (member + 48);
						if (member > 47) member = (member - 48);
						txtOutput.Text += (char)member;
					}
					else if (member >= 58 && member <= 64)
					{
						member = (member + key % 7);
						if (member < 58) member = (member + 7);
						if (member > 64) member = (member - 7);
						txtOutput.Text += (char)member;
					}
					else if (member >= 91 && member <= 96)
					{
						member = (member + key % 6);
						if (member < 91) member = (member + 6);
						if (member > 96) member = (member - 6);
						txtOutput.Text += (char)member;
					}
					else
					{
						txtOutput.Text += (char)(member + key);
					}
				}
			}
			else
			{
				MessageBox.Show("密钥输入有误!/文本出现错误!");
				txtKey.Clear();
				txtKey.Focus();
			}
		}
		private void btnInfoToCode_Click(object sender, EventArgs e)
		{
			Caesar(1);
		}

		private void btnCodeToInfo_Click(object sender, EventArgs e)
		{
			Caesar(2);
		}

		private void btnClear_Click(object sender, EventArgs e)
		{
			txtOutput.Clear();
			txtInput.Clear();
			txtKey.Clear();
		}

		private void btnForce_Click(object sender, EventArgs e)
		{
			int len;
			int i;
			int j;
			char member;
			bool tryDec = false;
			string info = info = txtInput.Text;
			string[] dictionary = { "the", "ello", "you", "he", "she" };
			string[] result = new string[26];
			txtOutput.Clear();

			for (j = 0; j < 26; j++)
			{
				len = info.Length;
				result[j] = "";
				for (i = 0; i < len; i++)
				{
					member = info[i];

					if (member >= 'a' && member <= 'z')
					{
						member = (char)(member - j % 26);
						if (member < 'a') member = (char)(member + 26);
						if (member > 'z') member = (char)(member - 26);
						result[j] += member;
					}
					else if (member >= 'A' && member <= 'Z')
					{
						member = (char)(member - j % 26);
						if (member < 'A') member = (char)(member + 26);
						if (member > 'Z') member = (char)(member - 26);
						result[j] += member;
					}
					else if (member >= '0' && member <= '9')
					{
						member = (char)(member - j % 10);
						if (member < '0') member = (char)(member + 10);
						if (member > '9') member = (char)(member - 10);
						result[j] += member;
					}
					else
					{
						result[j] += member + j;
					}
				}

				for (i = 0; i < 5; i++)
				{
					if (result[j].Contains(dictionary[i]))
					{
						tryDec = true;
						break;
					}
				}
				if (tryDec == true)
				{
					txtOutput.Text += (result[j] + "/t");
					tryDec = false;
				}
			}
			if (txtOutput.Text.Length == 0)
				MessageBox.Show("破解失败!");
		}

		private void btnImport_Click(object sender, EventArgs e)
		{
			string filePath = "";
			OpenFileDialog dialogOpenFile = new OpenFileDialog();
			dialogOpenFile.AddExtension = true;
			dialogOpenFile.Filter = "text files(*.txt)|*.txt";
			dialogOpenFile.CheckPathExists = true;
			dialogOpenFile.Title = "Import Text";
			DialogResult result = dialogOpenFile.ShowDialog();
			if (result == DialogResult.OK)
			{
				filePath = dialogOpenFile.FileName.ToString();
				using (StreamReader myReader = new StreamReader(filePath))
				{
					txtInput.Text = myReader.ReadToEnd();
				}
			}
			
		}

		private void btnExport_Click(object sender, EventArgs e)
		{
			string filePath = "";
			SaveFileDialog dialogSaveFile = new SaveFileDialog();
			dialogSaveFile.AddExtension = true;
			dialogSaveFile.Filter = "text files(*.txt)|*.txt";
			dialogSaveFile.CheckPathExists = true;
			dialogSaveFile.Title = "Export Text";
			DialogResult result = dialogSaveFile.ShowDialog();
			if (result == DialogResult.OK)
			{
				filePath = dialogSaveFile.FileName.ToString();
				using (StreamWriter myWriter = new StreamWriter(filePath))
				{
					myWriter.Write(txtOutput.Text);
				}
			}
		}

	}
}
最后更新于