关于C#编写波雷费密码的困惑
本人初学C#编程,新的不能再新了。现在遇到了第一个难题,是关于使用C#模拟波雷费密码的。对于如何编写算法小弟百思不得其解,遂向论坛各位高手求助。我会写上目前我摸索到的和我的想法。
首先什么是波雷费密码:
波雷费密码是一种对称式密码,是首种双字母取代的加密法。
在第二次布尔战争和第一次世界大战,英军用了它;在二战,澳大利亚人也用了。波雷费密码所用的工具很少,而且很快便能加密讯息。
它主要用来加密重要而又不关键的讯息。当时,敌军的密码分析员很快解出密码,可惜得的讯息都不重要。现时,波雷费密码被视为十分不安全的。
如何加密:
1选取一个英文字作密匙。除去重复出现的字母。将密匙的字母逐个逐个加入5×5的矩阵内,剩下的空间将未加入的英文字母依a-z的顺序加入。(将Q去除,或将I和J视作同一字。)
2将要加密的讯息分成两个一组。若组内的字母相同,将X(或Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入X字。
3在每组中,找出两个字母在矩阵中的地方。
若两个字母不同行也不同列,在矩阵中找出另外两个字母,使这四个字母成为一个长方形的四个角。
若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。
若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。
4新找到的两个字母就是原本的两个字母加密的结果。
举个例子:
取“playfair example”为密匙,得
P L A Y F
I R E X M
B C D G H
J K N O S
T U V W Z
要加密的讯息为 “Hide the gold in the tree stump”。
明文处理为:HI DE TH EG OL DI NT HE TR EX ES TU MP
就会得到“BM ND ZB XD KY BV JV DM UI XM MN UV IF”。
我现在的进度是使用写好的明文和密钥来制作密文
才开了小头,感觉漏洞百出,不知如何是好了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;//In order to use Regex.Replace method
namespace assigment1
{
class Encrypt
{
public string Keypad(string key)//处理密钥KEY的方法
{
string Firststep;
Firststep = key.ToUpper();//密钥所有字母变作大写
string strkey = Regex.Replace(Firststep, "[^A-Z]+","");//对比KEY中的字母,随后添加A-Z的字母,做成字符串。
return strkey = strkey.Replace("J", "I");//替换密钥中的J为I,返回处理的密钥。
}
public string Messagepad(string Message)//处理明文的方法,检查若有重复字母,添加“X”,返回处理好的明文。(好像漏掉了只有一个字的词组尾添加“X”的命令,如何实现呢?)
{
string paddedStr = "";
if (Message.Length > 0)
{
int i = 0;
char fc, sc;
while (i < Message.Length)
{
fc = Message[i];
i++;
if (i == Message.Length || Message[i] == fc)
{
sc = 'X';
}
else
{
sc = Message[i];
i++;
}
paddedStr += fc;
paddedStr += sc;
}
}
return paddedStr;
}
}
}
之后想的是再用2个方法完成任务。一个是GetMatrix方法把一开始处理好的KEY做成5*5的矩阵,一个是EncryptStr方法,把处理好的明文对照KEY做成密码输出。看到过别人的一个方法非常巧妙,但不知如何实现:先取得传入原文字符串长度,使用For循环字符串长度除以2次,每次把字符串的第i次和第i+1次分别赋给两个临时Char变量。之后用string类的indexof方法取得这两个字母在Key序列中的位置。由于5*5矩阵,那么所在位置除以5就是他的行号,除以5的余数就是他的列号,继续判断,如果是在同行,那么如果有一个除以5的余数为0,那么说明这个字母在行末。则取该行第一个值,否则取所在位置加一的值。继续来判断同列,如果所在位置大于19,那么必然是在矩阵最下面一层,那么位置减20就是他的密文。如果不是列末,那么位置加5就是他的密文。最后如果既不在同行又不在同列,那么他所在位置除以5后取整再乘以5就是他的行地址,再加上位置除以5的余数就是他的密文位置。
小弟才疏学浅,想破脑袋也束手无策。恳请各路高手帮帮我吧!非常非常的感谢!!