文章目录

  • 一、实现广义的凯撒密码加密算法
  • 二、实现广义的playfair密码的加密算法
  • 总结
    • 加密原理:

一、实现广义的凯撒密码加密算法

//实现广义的凯撒密码//凯撒密码的加密String plaintext="";String ciphertext="";public String enk(){System.out.println("请输入明文");Scanner sc = new Scanner(System.in);plaintext = sc.next();char[] chars = plaintext.toCharArray();for(int i=0; i<chars.length; i++){int j = chars[i];chars[i] = (char)(j+3);ciphertext += chars[i];}return ciphertext;}

二、实现广义的playfair密码的加密算法

package Bender;
import java.util.Scanner;
public class Test {String plaintext="";String ciphertext="";/*实现playfair密码加密*/public char[][] playk() {//将给出的密码字符串加入到密码表中System.out.println("请输入编制密码表的单词");Scanner sc = new Scanner(System.in);plaintext = sc.next();char[] chars1 = plaintext.toCharArray();//转换为字符数组char[][] chars2 = new char[5][5];//空的密码表//编制密码表chars2[0][0] = chars1[0];//直接将第一个字符加入密码表int num = 1;//记录密码表中的已有元素个数for(int i=1; i<chars1.length; i++){//对明文字符数组(一维数组)进行遍历if('i'==chars1[i]||'j'==chars1[i]) {//插入的是i||jfor(int j=0; j<=(num/5); j++) { //对密码表(二维数组)进行遍历boolean jud = false;for (int k = 0; k < 5; k++) {//插入密码表的操作只有两种情况if (chars2[j][k]=='\0') {//遍历到空,说明密码表中的密码遍历完了没有找到相同的,那么就应该执行插入操作,并且跳出对密码表(二维数组)的遍历chars2[j][k] = 'i';jud = true;num++;break;} else if ("i".equals(chars2[j][k]) || "j".equals(chars2[j][k])) {//遍历到密码表中存在相同的字符时就不必插入密码表了,应该直接跳出对密码表(二维数组)的遍历jud = true;break;}}if (jud) {break;}}}else {//正常插入for(int j=0; j<=(num/5); j++){boolean jud = false;for(int k=0; k<5; k++){//注意空字符的判断 ch=='\0';if (chars2[j][k]=='\0') {//遍历到空,说明密码表中的密码遍历完了没有找到相同的,那么就应该执行插入操作,并且跳出对密码表(二维数组)的遍历chars2[j][k] = chars1[i];jud = true;num++;break;} else if(chars1[i]==chars2[j][k]){//遍历到密码表中存在相同的字符时就不必插入密码表了,应该直接跳出对密码表(二维数组)的遍历jud = true;break;}}if(jud){break;}}}}return chars2;}//将上面没完成的密码表填满,最后返回编制好的密码表public char[][] playk2(char[][] ch){char[] chgoal = {'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};for(int i=0; i<chgoal.length; i++){//字母表遍历for(int j=0; j<5; j++){//密码表遍历boolean jud = false;for(int k=0; k<5; k++){if(chgoal[i]==ch[j][k]){//字母已存在密码表中,,直接跳出对密码表的遍历jud = true;break;}else if(ch[j][k]=='\0'){//如果该字母不在密码表中ch[j][k] = chgoal[i];jud = true;break;}}if(jud){break;}}}return ch;}public void show(char[][] chars){//展示最终编制的密码表for(char[] ele: chars){for(char ch: ele){System.out.print(ch);}System.out.println();}}//整理明文,返回字符数组public char[] splitstr(String str) {String strgoal = str.replaceAll(" ","").replaceAll("j","i");//去除字符串中的空格char[] ch = new char[strgoal.length()*2];//以字符串两倍的长度创建字符数组for(int i=0; i<strgoal.length(); i++){//将字符串中的单个字母添加到字符数组中ch[i] = strgoal.charAt(i);}int index = strgoal.length();//index标识第一个空字符for(int i=0; i<ch.length;i=i+2){//整理明文,相同则插入X,如果最后只剩一个字母则加X,注意循环条件i<ch.length而不是i<strgoal.length()if(ch[i]!='\0'&&ch[i+1]!='\0'){//如果是正常情况:俩个位置都有值if(ch[i]==ch[i+1]){//判断是否字母相同,如果相等的话(不相等则不用执行操作)for(int j=index; j>=i+2; j--){//执行插入X的操纵,从后往前覆盖ch[j] = ch[j-1];}index++;ch[i+1] = 'x';}}else if(ch[i]!='\0'&&ch[i+1]=='\0'){//第二种情况:前面一个有值,后一个未赋值,将X赋给后一个,此时也意味着ch中的有效字母已经遍历完了,跳出循环即可ch[i+1] = 'x';break;}else{//第三种情况,前后都为空,不执行操作,直接跳出循环即可break;}}//此时的字符数组就是整理好的明文return ch;}//最后一步(此时的密码表和整理后的明文已经编制好了,最后一步根据密码表将整理好的明文编译成密文,然后输出)public String encryp(char[][] cht, char[] chb){//char[] ch = new char[chb.length];//和chb等长的字符数组,用来装密文String str = "密文:";for(int i=0; i<chb.length; i+=2){//对chb进行遍历,一次遍历相邻的两个if(chb[i]!='\0'){//用于存放下标int x1 = 0;int x2 = 0;int y1 = 0;int y2 = 0;for(int j=0; j<5; j++){//对密码表进行遍历,确定明文字母在密码表中的坐标for(int k=0; k<5; k++){if(chb[i]==cht[j][k]){x1 = j;y1 = k;}if(chb[i+1]==cht[j][k]){x2 = j;y2 = k;}}}System.out.println(cht[x1][y1]+"(" + x1 + "," + y1 + ")" + cht[x2][y2]+"(" + x2 + "," + y2 + ")");//获取到两个下标后进行判断,一共有三种情况if(x1==x2){//两个字母在同一行if(y1>y2){//第一个字母在第二个字母右边str += ""+cht[x1][y1]+cht[x1][(y1+1)%5];}else{//第一个字母在第二个字母在左边(不可能相等,在整理明文的时候已经处理了)str += ""+cht[x1][y2]+cht[x1][(y2+1)%5];}}else if(y1==y2) {//两个字母在同一列if(x1<x2){//第一个字母b在第二个a上面str += ""+cht[x2][y2]+cht[(x2+1)%5][y2];}else{str += ""+cht[(x1+1)%5][y1]+cht[x1][y1];}}else{//对角,横着取值str += ""+cht[x1][y2]+cht[x2][y1];}}}return str;}public static void main(String[] args) {Test t = new Test();System.out.println(t.enk());//playk()将给出的密码字符串加入到密码表中,返回二维字符数组//playk2(char[][] ch)将上面没完成的密码表填满,最后返回编制好的密码表的二维字符数组//show(char[][] ch)展示最终编制好的密码表//spliterstr(String str)整理明文,返回字符数组//encryp(char[][] cht, char[] chb)加密操作,返回密文字符串
//        char[][] ch1 = t.playk2(t.playk());
//        char[] ch2 = t.splitstr("i have a balloon");
//        System.out.println(ch2);
//
//        System.out.println(t.encryp(ch1,ch2));}
}

总结

凯撒密码数据古典密码学的经典案例,而playfair密码则属于替代密码的一种。
它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。英语中z使用最少,可以去掉它。


加密原理:


编制密码表
第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。
同时字母I和J会被当成一个字母。
如密钥crazy dog,可编制成
CDFMT
ROHNU
AGI PV
ZBKQW
YELSX
整理明文
第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X(或者Q)。
如,communist,应成为co,mx,mu,ni,st。
编写密文
最后编写密文。对明文加密规则如下:
1 :若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应dc
2 :若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
3 :若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应ku或uk。
如,依照上表,明文where there is life,there is hope.
可先整理为:WH ER ET HE RE IS LI FE TH ER EI SH OP EX
然后密文为:KU YO XD OL OY PL FK DL FU YO LG LN NG LY
将密文变成大写,然后几个字母一组排列。
如5个一组就是KUYOX DOLOY PLFKD LFUYO LGLNN GLY

playfair密码和凯撒密码加密算法的Java实现相关推荐

  1. 有趣的密码学介绍~古典密码之凯撒密码来咯~

    游说万乘苦不早,著鞭跨马涉远道.仰天大笑出门去,我辈岂是蓬蒿人! 文章目录 前言 正文 古典密码 一.古典密码概述介绍 1.置换密码 2.代换密码 二.古典密码分类介绍 1.置换密码 2.编辑本段代换 ...

  2. 历史著名密码(凯撒密码、简单替换密码、Enigma)

    凯撒密码 公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数. 如原文是ABCDEFG,密钥为3,加密后就是DEFGHIJ. 以密钥的数字向后平移了三位,如果密钥 ...

  3. python凯撒密码实现_密码:凯撒密码及其Python实现

    python凯撒密码实现 Before we start let's some basic terminology... 在开始之前,让我们先介绍一些基本术语... The art and scien ...

  4. python凯撒密码e_凯撒密码python实现

    写在前面的话 凯撒密码原理比较简单. 原理 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文 ...

  5. java实现凯撒密码_凯撒密码--java实现

    关于凯撒密码的介绍我就不多说了,感兴趣的可以看什么是凯撒密码?,我主要说的是java如何实现. 我发现网上有写java加密解密的,写的时候发现只需要一个转换函数就可以了,可以作为加密用,也可以用作解密 ...

  6. 单表代换密码(凯撒密码)

    单表代换密码概述 对所有的明文字母都用一个固定的代换进行加密 ,因而称为 单表代换密码.加密过程中是从明文字母表到密文字母表的一一映射.例: 恺撒(Caesar)密码. 缺点:不能抗击字母频度分析,容 ...

  7. python密码学凯撒密码_凯撒密码在Python

    python密码学凯撒密码 Hello everyone, in this tutorial you'll learn about Caesar cipher in Python. If you ha ...

  8. 古典密码算法(凯撒密码,矩阵换位密码) python实现

    古典密码算法 python实现 通过编程实现替代密码和置换密码算法,在这里通过python实现了对凯撒密码的加密与解密,以及对矩阵换位密码的加密与解密. 凯撒密码的相关算法是O(n)O(n)O(n)的 ...

  9. Caesar密码(凯撒密码)

    凯撒密码(又称循环移位密码) 加密原理: 每个英文单词都用在其后面第 N 个单词代替.其中,N 就是密钥:字母 z 的后一位为 a,即 mod 26. 例如:明文 acdry,N=2,则密文就是 ce ...

最新文章

  1. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】
  2. 力扣题458:可怜的小猪
  3. Codeforces Round #657 (Div. 2)
  4. Nacos(五)之Spring集成
  5. 实现基于darknet框架实现CTPN版本自然场景文字检测 与CNN+CTCOCR文字识别的ChineseOCR搭建
  6. C#使用StreamReader类读取文件文件
  7. 领域应用 | 企业效益最大化的秘密:知识图谱
  8. linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
  9. python Django创建数据库时can't open file 'manage.py': [Errno 2] No such file or directory
  10. Jquery 触发器之treigger()方法简介
  11. html5中control,HTML5.(control-shift)
  12. cubemx spi 中断_STM32 SPI在使用中断时丢弃数据
  13. codeforces 369C Valera and Elections
  14. yarn 内存与CPU参数设置
  15. c语言试题 函数选择,(C语言函数章节选择题.doc
  16. 如何获取阿里云服务器镜像
  17. Win10开始菜单卡死解决办法
  18. Python按键精灵自动化
  19. 2019年5月9日-面试收获
  20. nvm安装使用及卸载

热门文章

  1. 双足式机器人是如何实现的?
  2. 自动生成logo的网址
  3. 用python玩转数据慕课答案第八周_中国大学MOOC慕课用Python玩转数据章节测试答案...
  4. Echarts进度条式的柱状图
  5. Shell常用命令分享
  6. android busybox 安装
  7. linux下代理设置详解
  8. 一对一网页聊天 jsp+js+ajax+servlet+tomcat+mysql
  9. java——代码块(斗地主游戏)
  10. android m支持机型,华为手机Android M适配进度(3.31日更新)