您的位置:首页 > 大数据 > 人工智能

Playfair密码 变种加密字符串

2013-11-05 20:28 330 查看
一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下:
1.首先按行填入密钥串。
2.紧接其后,按字母序按行填入不在密钥串中的字母。
3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换。
如果密钥为youandme,则该方阵如下: 
y o u a n
d m e b c
f g h i j
k l p q r
s t v w x
在加密一对字母时,如am,在方阵中找到以这两个字母为顶点的矩形(红色字体):
y o u a n
d m e b c
f g h i j
k l p q r
s t v w x
 
这对字母的加密字母为该矩形的另一对顶点,如本例中为ob。
请设计程序,使用上述方法对输入串进行加密,并输出加密后的串。
另外有如下规定:
1、一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中;
2、如果一对字母中的两个字母相同,则不变换,直接放入加密串中;
3、如果一对字母中有一个字母不在正方形中,则不变换,直接放入加密串中;
4、如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母,即变换为fd或ih;
5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为am,则该矩形的另一对顶点字母中,与a同行的字母应在前面,在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应为wo;
6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。
解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。
要求输入形式如下:
从控制台输入两行字符串,第一行为密钥单词(长度小于等于25),第二行为待加密字符串(长度小于等于50),两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。
在标准输出上输出加密后的字符串。
例如,若输入:
youandme
welcometohangzhou
输出的结果为:
vbrmmomvugnagzguu



import java.util.Scanner;

public class PlayFair {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String fair;
String yuanS = "";
String miS = "";
fair = input.nextLine();
yuanS = input.nextLine();
char[] yuanChar = yuanS.toCharArray();
char[][] playFair = new char[5][5];
String s = getPlayFair(playFair, fair);
for (int i = 0; i < yuanChar.length; i = i + 2) {
if (i + 1 >= yuanChar.length) {
miS += yuanChar[i];
} else {
miS += getFunction(yuanChar[i], yuanChar[i + 1], playFair, s);
}

}
System.out.println(miS);
}

public static String getFunction(char a, char b, char[][] playFair, String s) {
String tempString = "";
int intA = s.indexOf(a);
int intB = s.indexOf(b);
int iA, iB, jA, jB;
iA = intA / 5;
jA = intA % 5;
iB = intB / 5;
jB = intB % 5;
if (intA >= 0 && intB >= 0) {
if (iA == iB || jA == jB) {
tempString += playFair[iB][jB];
tempString += playFair[iA][jA];
} else {
tempString += playFair[iA][jB];
tempString += playFair[iB][jA];
}

} else {
tempString += a;
tempString += b;
}
return tempString;
}

public static String getPlayFair(char[][] playFair, String fair) {
String s = "";
int t = 0;
char[] tempChar = fair.toCharArray();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * 5 + j >= fair.length()) {
for (int k = 97 + t; k < 97 + 26; k++) {
if (fair.indexOf((char) k) >= 0) {
t++;
} else {
playFair[i][j] = (char) k;
s += playFair[i][j];
t++;
break;
}
}
} else {
playFair[i][j] = tempChar[i * 5 + j];
s += playFair[i][j];
}
}
}
return s;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息