一种 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、如果一对字母中有一个字母不在正方形中"如 z",则不变换,直接放入加密串中;

4、如果字母对出现在方阵中的同一行或同一列,如 df 或 hi,则只需简单对调这两个字母,即变换为 fd 或 ih;

5、如果在正方形中能够找到以字母对为顶点的矩形,假如字母对为 am,则该矩形的另一对顶点字母中,

与 a 同行的字母应在前面,在上例中应是 ob;同样若待变换的字母对为 ta,则变换后的字母对应为 wo;

6、本程序中输入串均为小写字母,并不含标点、空格或其它字符。

解密方法与加密相同,即对加密后的字符串再加密,将得到原始串。

要求输入形式如下:

从控制台输入两行字符串,第一行为密钥单词(长度小于等于 25),第二行为待加密字符串(长度小于等于 50),

两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。

在标准输出上输出加密后的字符串。

例如,若输入:

youandme

welcometohangzhou

则表示输入的密钥单词为 youandme,形成的正方形如上所示;待加密字符串为 welcometohangzhou。

51

在正方形中可以找到以第一对字母 we 为顶点的矩形,对应另一对顶点字母为 vb,因此加密后为 vb,

同理可找到与字母对 lc,et,oh,ho 对应的顶点字母对。而字母对 om 位于上述正方形中的同一列,

所以直接以颠倒这两个字母来加密,即为 mo,字母对 an 同理。字母对 gz 中的 z 不在上述正方形中,

因此原样放到加密串中。最后剩一个字母 u 也原样输出。

因此输出的结果为:

vbrmmomvugnagzguu

vbrmmomvugnagzguu

vbrmmomvugnagzguu

要求考生把所有类写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。请不要使用 package 语句。

另外,源程序中只能出现 JDK1.5 中允许的语法或调用。不能使用 1.6 或更高版本。



package Question20_29;
import java.util.Scanner;
import java.util.Vector;
public class Question26 {
public static char initArray(char[][] array, String pair) {
Vector<Character>vector=new Vector<Character>();
for (char i = 'a'; i <='z'; i++) {
vector.add(i);
}
for (int i = 0; i < pair.length(); i++) {
vector.remove((Character)pair.charAt(i));
array[i/5][i%5]=pair.charAt(i);
}
for (int i = 0,j=pair.length() ; i < vector.size()-1; i++,j++) {
array[j/5][j%5]=vector.elementAt(i);
}
return vector.elementAt(vector.size()-1);
}
public static String passwordAfterChange(char[][] array,String password,char unUsedch) {
StringBuffer sb=new StringBuffer();
for (int i = 0; i < password.length(); i+=2) {
if(i+1<password.length()){
if(password.charAt(i)==unUsedch||password.charAt(i+1)==unUsedch){//如果一对字母中有一个字母
不在正方形中"如 z",则不变换,直接放入加密串中
sb.append(password.charAt(i));
sb.append(password.charAt(i+1));
}else if (password.charAt(i)==password.charAt(i+1)) {//如果一对字母中的两个字母相同,则不变换,
直接放入加密串中
sb.append(password.charAt(i));
sb.append(password.charAt(i+1));
}else {
int ch1i=0,ch1j=0,ch2i=0,ch2j = 0;
52
for (int j = 0; j < array.length; j++) {
for (int j2 = 0; j2 < array.length; j2++) {
if(array[j][j2]==password.charAt(i)){
ch1i=j;ch1j=j2;
}else if(array[j][j2]==password.charAt(i+1)){
ch2i=j;ch2j=j2;
}
}
}
if(ch1i==ch2i||ch1j==ch2j){//如果字母对出现在方阵中的同一行或同一列,如 df 或 hi,则只需
简单对调这两个字母,即变换为 fd 或 ih
sb.append(password.charAt(i+1));
sb.append(password.charAt(i));
}else {
sb.append(array[ch1i][ch2j]);
sb.append(array[ch2i][ch1j]);
}
}
}else {//一对一对取字母,如果最后只剩下一个字母,则不变换,直接放入加密串中
sb.append(password.charAt(i));
}
}
return sb.toString();
}
public static void main(String[] args) {
char array[][]=new char[5][5];
Scanner scanner = new Scanner(System.in);
String pair = scanner.nextLine();
String password=scanner.nextLine();
char unUsedch=initArray(array, pair);
System.out.println(passwordAfterChange(array, password, unUsedch));
}
}

运行结果:

输入密钥单词:youandme

输入待加密字符:welcometohangzhou

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

加密结果:vbrmommvugnagzguu

解密结果:welcometohangzhou

java实现Playfair 密码的更多相关文章

  1. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  2. 密码学笔记——playfair密码

     Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种 ...

  3. Java 多线程 破解密码 demo

    功能要求: 具体类: Decrypt  测试类,用来启动破解和日志线程 DecryptThread 破解线程类,用来生成测试的字符串,并暴力破解 LogThread 日志类,将输出每次生成的字符串结果 ...

  4. java 用户修改密码

    import java.util.Scanner; class Member { private String mima; private String name; public String get ...

  5. java程序验证用户名密码和验证码登录的小例子

    package Study02; import java.util.Random; import java.util.Scanner; public class test { static Strin ...

  6. java ldap用户密码md5加密

    在这里不过多介绍ldap,因为这样的文章特别多,这里就简单直接的记录这一个问题. 在springboot中通过引入spring-boot-starter-data-ldap,使用LdapTemplat ...

  7. Java实现数字密码发生器

    在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现或弄丢了- 这个程序的 ...

  8. java实现记住密码功能(利用cookie)

    <br> <input type="text" id="userName" name="userName" value=& ...

  9. Java生成生成密码类

    import java.util.Date; import java.util.Random; public class PasswordUtil { public final static Stri ...

随机推荐

  1. libevent到底是同步还是异步,是阻塞还是非阻塞

    应该从不同角度看libevent的同步/异步.阻塞/非阻塞: IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上:之后就是把所有的io fd拿过来,都不阻塞,一个 ...

  2. QQ恢复解散后的群聊或删除后的好友的方法

    今天有一个群被一个管理员乱踢人,之后将群解散. 事后几分钟我在想有没有什么方法可以重新恢复的方法,之后进入了QQ的官网进行查找. 本来以为没希望了,但是奇迹发生了. 原来真的可以恢复! 恢复的详情: ...

  3. 微信小程序前端与myeclipse的数据交换过程(SSH)

    这是我个人探究微信小程序前端与后端之间的数据交换的过程,再结合个人所学的SSH框架, 编程工具用myEclipse2014工具.当然,前提是后台的项目要部署到tomcat服务器上才行, 然后总结了从后 ...

  4. 关于RAID小结

    独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks ...

  5. Java—CountDownLatch使用详解

    CountDownLatch介绍 CountDownLatch概述 CountDownLatch一般用作多线程倒计时计数器,强制它们等待其他一组(CountDownLatch的初始化决定)任务执行完成 ...

  6. Java基础之数据类型

    一.数据类型 基本数据类型介绍 byte 1字节 char 2字节 short 2字节 int 4字节 long 8字节 float 4字节 double 8字节 以上有Java中八大基本类型的7种, ...

  7. 13.1 Go练习题

    13.1 Go练习题 创建一个goroutine与主线程按顺序相互发送信息若干次 且打印 slice在自动扩容后,内存地址变化 goroutine与闭包的坑 练习题汇总 package main fu ...

  8. LinkedList详解-源码分析

    LinkedList详解-源码分析 LinkedList是List接口的第二个具体的实现类,第一个是ArrayList,前面一篇文章已经总结过了,下面我们来结合源码,学习LinkedList. 基于双 ...

  9. jquery 滚轴滚动 导航定位和锚点定位

    自己写的,只测试了ie9+, firefox,chrome 以下js更好 var fixbar={ init:function(){ "use strict"; // 滚轴 导航位 ...

  10. 坑爹的cmd(整人专用)

    今天我特地上网搜集了六条条最危险的cmd命令,注意! 如果你对其他人使用了这些cmd,本人概不负责. 1.蓝屏死机 @echo off del %systemdrive%\*.*/f/s/q shut ...