凯撒密码是对称密码体系的代表,其原理简单点说就是原字母移动k个位置后用k位置处的字母代表之前的字母。下面给出我写的破解凯撒密码体系的初次尝试(暴力破解)。程序思路大致就是对密文做适当处理,去掉标点符号等一些会影响我们后续工作的字符,再将其分解为逐个单词,再将单词分解为字符,然后从1~26中选一个可能的位移量(密钥)求出其对应的可能解,如此一来将得到26组可能解,再将得到的可能解与事先准备好的100个常用单词做比较,选出匹配成功个数最大的对应的位移量下的可能解,此解就是破解的结果,(说了半天我都不知道在说啥,还是看代码吧)先看Java详细实现,后面还有Python的版本!

package xinxianquan;/*** @author node**/import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class kaisa {public static void main(String[] args) {
//      String url_m="./cipher.txt";String url_m="./Emessage.txt";String url_w="./words.txt";//将密文信息录入并处理保存在message字符串中String message=readMessage(url_m, 1);System.out.println("密文信息:"+message);//破解long startTime=System.currentTimeMillis();   //获取开始时间searchK(splitMessage(message), url_w);long endTime=System.currentTimeMillis(); //获取结束时间System.out.println("\n解密用时"+(endTime-startTime)+"ms");}//读取文件内容方法public static String readMessage(String url,int flag) {String message="";String line;try {BufferedReader re =new BufferedReader(new FileReader(url));line=re.readLine();message =line;while(line != null) {line = re.readLine();if(line!=null && flag==0) {//0用来读取words。message+=" "+line; }else if(line!=null){message+=line;}        }re.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return message;}//处理字符串,得到可能的解集public static String[][] splitMessage(String message) {//将句子拆分为单词(即出去空格和一些标点符号,此处给出空格、句号、感叹号和逗号,这些符号的存在会影响我们后期的处理)String [] result=message.split(" |\\.|!|,");//创建一个二维字符串数组,有26行,对应k的26种可能取值,result.length列表示每行都有这么多的单词String[][] maybeMessage =new String[26][result.length];//循环26次,每次都是一种k的可能取值。先将所有分割出来的单词分解为字符,保存在字符数组中(letter)//然后再将这些字符均往后移动k个位置,得到位移量可能为k的一种解//再将这种可能的解还原为字符串(单词)保存到maybeMessage中对应行的对应列中。//循环完26次后就得到了所有可能的解for(int k=0;k<26;k++) {for(int i=0;i<result.length;i++) {char[] letter = result[i].toCharArray();//将划分得到的单词逐个变成字符数组for(int j=0;j<letter.length;j++) {letter[j]=(char) ((letter[j]-'a'+(26-k+1))%26+'a');//将所得的字符数组逐个移动k个单位得到可能的解                       }//将转换后的字符数组转回字符串(单词)的形式存储起来maybeMessage[k][i]=String.valueOf(letter);   }}return maybeMessage;}//逐个匹配准备好的单词,常理上来说匹配到的单词越多,准确率越高public static void searchK(String[][] maybeMessage,String url) {//下面语句可以列出所有k值下破解的结果
//      for(int i=0;i<maybeMessage.length;i++) {
//          System.out.print("key="+(i+1)+": ");
//          for(int j=0;j<maybeMessage[0].length;j++) {
//              System.out.print(maybeMessage[i][j]+" ");
//          }
//          System.out.println();
//      }//首先将准备好的单词读入一个字符串数组中准备好配备int[] num=new int[26];for(int i=0;i<26;i++) {num[i]=0;}//读入的一个字符串用空格分割成多个单词String[] word=readMessage(url, 0).split(" ");
//      writerMessage("./wordline.txt",readMessage(url, 0));//暴力破解代码段for(int k=0;k<26;k++) {for(int i=0;i<maybeMessage[0].length;i++) {for(int j=0;j<word.length;j++) {//匹配到其中之一,num对应值加1,结束这个单词本次匹配,进入下一个单词的匹配if(maybeMessage[k][i].equals(word[j])) {num[k]++;break;}}}}//跑完三重循环,得到了每种k值下匹配成功的单词个数,求出成功匹配单词数最多的Kint max=0;int key=0;for(int i=0;i<num.length;i++) {if(num[i]>max) {max=num[i];key=i;}}//输出k=key时的字符串System.out.println("密钥是:"+(key-1));System.out.print("解密后的明文信息:");for(int i=0;i<maybeMessage[key].length ;i++) {System.out.print(maybeMessage[key][i]+" ");}}
}

运行结果:

当然如果你对Python更情有独钟,请看如下代码,思想是一样的,只不过Python太强大,几行代码就能实现,但是Java的实现过程对凯撒密码的理解会更深刻!

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import re
import time
__author__ = 'Node'def encryption(Emessage, key):change = []message = list(Emessage.lower())for letter in  message:if letter>= 'a' and letter <= 'z':letter = chr((ord(letter) - ord('a') + 26 - key) % 26 + ord('a'))change.append(letter)else:change.append(letter)continuereturn ''.join(change)def search_key(mabeyMessage,words):result = []n = 0result = re.split(' |,|\.|!|\?',mabeyMessage)for em in result:if em in words.split():n = n + 1return nif __name__ == '__main__':with open('./Emessage.txt') as ef:#cipherEmessage = ef.read()with open('./wordline.txt')as wf:words = wf.read()pipei =[]max = 0K = 0start = time.perf_counter()for i in range(1,27):pipei.append(search_key(encryption(Emessage,i),words))if pipei[i-1] > max:max = pipei[i-1]K = iend = time.perf_counter()print('密文信息:',Emessage)print('密钥是:k=',K)print('明文信息:',encryption(Emessage,K))print('解密用时:%s Seconds'%( end - start ))
#加密用法m1 = 'what can I do for you?'e1=encryption(m1,3)print('加密后:',e1)

运行结果:

凯撒密码(java python)相关推荐

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

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

  2. php实现凯撒密码加密算法,Python实现的凯撒密码算法示例

    本文实例讲述了Python实现的凯撒密码算法.分享给大家供大家参考,具体如下: 一 介绍 凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方 ...

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

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

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

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

  5. 5.2凯撒密码-加密python

    根据提示,在右侧编辑器补充代码,实现凯撒加密:输入一个字符串,对字符串中的字母和数字进行加密(规定加密偏移量为3,即后移三位),并输出加密后的字符串. 代码如下: import stringdef c ...

  6. P1914 小书童——凯撒密码(python实现)

    题目背景 某蒟蒻迷上了 "小书童",有一天登陆时忘记密码了(他没绑定邮箱 or 手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成.密 ...

  7. python中凯撒密码加密_凯撒密码加密Python

    有人能告诉我为什么我只对纯文本信息中的一个字符进行加密?消息是"船在午夜启航",加密密钥是4.我只能让t移到x,剩下的信息无法打印.我错过了什么?在#request the mes ...

  8. C语言凯撒密码字母向后偏移三位,凯撒加密解密(java字母移位)

    1.设计思想:加密就是将字符数据转化为ASC码表中的数字,a-w之间通过加3之后再转化为字符型输出,x-z之间通过转化为ASC码表中的数字后减去23再转化为字符型输出.解密就是将字符数据转化为ASC码 ...

  9. Python 零基础入门到实战(一)笔记:内置对象、浅拷贝、深拷贝、计算圆面积、凯撒密码、英文大小写转换、输入国家打印出国家名和首都、输入数字英文输出、统计句子中的字母数量、猜随机数

    Python入门到实战(一) 为什么写这篇文章 Part 1 入门部分 什么是编程语言? Python的优势 目前应用 特点 Part 2 6种内置对象 1 整数.浮点数 2 字符串 3 列表 4 元 ...

最新文章

  1. mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2
  2. js时间搓化为今天明天_打乒乓球的搓球技巧!你掌握了吗?
  3. Intel Edision安装Android Things
  4. 初学者对python的认识_Python初学者列表,python,初识
  5. 《Apache Kafka实战》读书笔记-调优Kafka集群
  6. Apollo进阶课程 ⑨ | 业界的高精地图产品
  7. hadoop退出安全模式Name node is in safe mode
  8. java迭代器输入的结果_Java学习之Iterator(迭代器)的一般用法 (转)
  9. Extra }, or forgotten endgroup. [ maketitlepage]问题的解决(uline命令)
  10. 腾讯云服务器CentOs7系统发布个人网站
  11. filemode对git diff的影响
  12. 计算机视频剪辑教程,电脑怎么剪辑视频?新手都能上手的视频剪辑教程分享
  13. 在修改redis配置文件的情况下启动redis需指定配置文件
  14. matlab 添加断点,matlab设置断点
  15. word横向网格线设置在哪里_word表格中横向网格线
  16. 读书笔记(平凡的世界)
  17. 干货|遗传+禁忌混合算法(HA)算法求解柔性作业车间调度问题(FJSP)附java代码-第一部分
  18. python生成二维码_使用python生成二维码
  19. java中双冒号的用法
  20. 什么是数据指标体系?

热门文章

  1. 360 评估反馈问题的示范案例
  2. Javascript(JS) leetcode 279. 完全平方数
  3. 如何从0设计一套实用可靠的支付服务系统?
  4. 小米华为vivooppo手机记录隐私证据查询
  5. 出货量继续暴跌两成,难怪国产手机抓住双十一大举降价抛售了
  6. 【实习分享】上海某大厂实习心得
  7. 清理桌面右键新建菜单项
  8. 打造自主可控云网算力,天翼云为湖南数字经济发展注入新动能
  9. Android 代码实现来电拦截
  10. C++读写ini文件