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
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; } }
相关文章推荐
- MD5原理及加密字符串和文件
- asp.net2.0如何加密数据库联接字符串
- C# 加密解密链接字符串
- LoadRunner中调用SHA1算法加密字符串
- MD5原理及加密字符串和文件
- java字符串加密解密
- 简单字符串加密工具
- XXTea 加密/解密 字符串
- 黑马程序员-使用String类完成如下功能,对英文字符串进行加密处理。
- 数据库连接字符串的加密与解密
- 加密解密链接字符串
- Java:如何使用Cipher类对字符串进行加密解密
- 第八周 项目4 字符串加密
- asp.net2.0如何加密数据库联接字符串
- access加密后c#连接字符串
- URL中加入BASE64加密的字符串引起的问题(Illegal base64 character a)
- 对web.config中的数据库连接字符串进行加密
- Enterprise Library2.0中加密数据库连接字符串
- C# 加密二进制与加密字符串的代码