实验内容:

选择合适的秘钥,利用上述三个算法:熟悉恺撒密码、双重置换密码、一次一密密码算法。加密如下明文:

大风起兮云飞扬,

威加海内兮归故乡,

安得猛士兮守四方。

《大风歌》--刘邦

3.1.1凯撒密码

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。

我对“怎么用凯撒密码加密一句中文”产生了疑问,实际上解决方法可以有很多种,例如用数组中不断地“大、风、方……”这些词的简单位移,事实上经过搜索,我选择了使用unicode的变换来完成。

即,可以用汉字对应的字符码来进行变换操作,这样出来的还是汉字。比如汉字“一”的unicode是0x4e00,凯撒移位为1的话0x4e00+1=0x4e01,对应的汉字是“丁”,如果移位为三,就是0x4e03,对应汉字是“七”。

主要算法:

//凯撒加密算法(简单替换密码),传入明文字符串,返回一个密文字符串

public static StringBuilder chineseToUnicodeAddThree(String str){  //static类方法

String result="";

for (int i = 0; i < str.length(); i++){

int chr1 = (char) str.charAt(i);

if(chr1>=19968&&chr1<=171941){//汉字范围 \u4e00-\u9fa5 (中文)

chr1 += 3;

String hexLastUnicode = Integer.toHexString(chr1);

result += "\\u" + hexLastUnicode;

}

else{  //非汉字范围(直接打印出来吧,例如:句号,感叹号。此处不再做unicode的转变)

result+=str.charAt(i);

}

}

StringBuilder strBuilder = new StringBuilder(result);

return strBuilder;

}

思路:将汉字范围内的整型转换为16进制字符串作为后缀,前面加入\u,形成对应的unicode值。

这段代码并不复杂,遇到的问题在于:

当我在main函数调用时,注释掉的该行(如下)不能够实现我把转义字符\去掉,即最后输出的是\u593a这种形式,而非unicode值对应的“太”。

//System.out.println(stringResult.replace("\\","\");

苦思冥想了很久,在这篇博文中得到了启发:《java中如何忽略字符串中的转义字符》,(http://www.cnblogs.com/davidwang456/p/4580786.html)他与我遇到了相似的问题:只要把得到的报文中的“\”换成“\”,我想就能正常地将Unicode输出成中文了,首先想到的是使用字符串的replaceAll()方法。使用replaceAll(“\\“,“\“),但是发现输出结果没有任何变化。

解决方法是:查了下API文档,replaceAll()方法的定义是:public String replaceAll( String regex,String replacement)  ;也就是第一个参数指的是正则表达式,所以“\\”用正则表达式的方式来看,匹配的是字符串中的两个\字符,而不是java中的‘\’转义符。换句话说,就是regex参数作为正则表达式查找的源字符串是已经转义过的“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,而不是转义前的“\\u79fb\\u52a8\\u4e92\\u8054\\u7f51\\u5e94\\u7528”,所以replaceAll(“\\“,“\“)自然没效果了。后来在StackOverFlow上找到一个忽略转义的工具类, org.apache.commons.lang.StringEscapeUtils ,里面有忽略各种语言的转义符号的方法,既好用也便于理解,就直接拿来用了。 其中unescapeJava(String s)方法是来处理java转义字符的,可以将字符串中的 “\”转换为 “\”,“'”转换为“'”等。通过这个方法处理以上字符串,刚好能够满足我的需求。

于是我下载了工具包并导入,这还是我第一次导入eclipse工具包的体验。对我的main函数进行了修改,最后得以运行。

public static void main(String[] args) {

String str = new String("大风起兮云飞扬,威加海内兮归故乡,安得猛士兮守四方!——《大风歌》刘邦");

StringBuilder result = experiOne.chineseToUnicodeAddThree(str); //调用加密方法进行加密

String stringResult = new String(result);

//System.out.println(stringResult.replace("\\","\");

String r = StringEscapeUtils.unescapeJava(stringResult);

System.out.println(str);

System.out.println(r);

}

值得注意的是,除了上述错误耽误了较久的时间,在十六进制加3的时候也遇到了问题。根据unicode编码已知,

在“大”这个字应该为\u5927,我需要对后面的十六进制数字5927进行+3的数字运算,这里走了不少弯路。

首先对\u5927字符串直接加三,这显然是不行的。之后对String 类型的5972进行加3,发现结果变成了59273(String类型后面’+’只能进行字符串的后缀叠加)。反思后,我把String类型先parseInt变为Int型再加3,这下肯定不会出错了吧?结果发现例如”风”是\u98ce,不能进行parseInt的转换。

此刻我的内心是崩溃的,“怎么进行十六进制加法,还要忽略字符串?”这个问题纠结了很久。最后,解决方案是:在没转成16进制之前,对,就是在十进制的时候就加3,然后再转成16进制。(因为16进制的3和10进制的3是一样的)。

因此得到了运行结果:

虽然凯撒密码是本次实验中入门的古典密码,但是从“单字母表替换”到“char数组的位移替换”到“利用unicode码”我认为难度是不一样的,从这个过程中我学到了很多东西。

----------------
古典密码恺撒密码、双重置换密码、一次一密密码算法三种都写了,但是实验报告搞过来太麻烦,图片要一个一个贴,等这一阵考完雅思把报告打包一下传上来。

实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)相关推荐

  1. 凯撒密码C语言去掉空格字符,凯撒密码的问题C语言

    满意答案 xlaijing19 推荐于 2016.04.01 采纳率:43%    等级:12 已帮助:6257人 最低0.27元开通文库会员,查看完整内容> 原发布者:耿万德 凯撒密码是一种非 ...

  2. 凯撒密码C语言去掉空格字符,凯撒密码C语言实现

    <凯撒密码C语言实现>由会员分享,可在线阅读,更多相关<凯撒密码C语言实现(8页珍藏版)>请在人人文库网上搜索. 1.凯撒密码是一种非常古老的加密方法, 相传当年凯撒大地行军打 ...

  3. java密码框转字符串_实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)...

    实验内容: 选择合适的秘钥,利用上述三个算法:熟悉恺撒密码.双重置换密码.一次一密密码算法.加密如下明文: 大风起兮云飞扬, 威加海内兮归故乡, 安得猛士兮守四方. <大风歌>--刘邦 3 ...

  4. 【C基础练习题】Week9:凯撒密码 | 按空格切分字符串 | 单词折半拆分

    目录 第一题:凯撒密码 第二题:按空格切分字符串 第三题:单词折半拆分 第一题:凯撒密码 [百度百科]在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种 ...

  5. 凯撒密码c++语言程序,C++中的凯撒密码程序

    我想用C++编写凯撒密码程序.我使用了四个函数,一个用于选择Shift键,两个用于加密和解密,最后一个用于实现凯撒密码,使用输入文件读取文本并将加密或解密文本输出到输出文件中.我试图运行代码,它正在崩 ...

  6. c语言凯撒密码例题解题过程,C语言:凯撒密码的实现

    凯撒密码的实现(10分) 题目内容: 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令.它将字母表中的字母移动一定位置而实现加密. ...

  7. C语言:凯撒密码的实现

    凯撒密码的实现(10分) 题目内容: 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令.它将字母表中的字母移动一定位置而实现加密. ...

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

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

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

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

  10. 凯撒密码c语言公式原理,凯撒密码 C语言实现.pdf

    凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全.他的原理很简单, 说到底就是字母于字母之间的替换.下面 ...

最新文章

  1. Rushcrm:客户关系管理适合的才是好的
  2. 三十八、网络通信Socket模块实现文件传输
  3. 课时71.后代选择器(掌握)
  4. 用python可以解决什么问题_学 Python 能帮你解决什么问题 ?
  5. Javascript基础 对象与方法的识别
  6. 宣布降低Windows Azure 存储和计算的价格
  7. posix and system V IPC
  8. QA:mongoose中设置virtual后不工作问题
  9. 约束规划问题与凸二次规划
  10. 测度论与概率论基础(程士宏)学习笔记(二)
  11. 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
  12. 编写一个 SQL 查询来实现分数排名
  13. Type A卡和Type B卡的主要区别
  14. Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
  15. 南昌工学院计算机挂科率,南昌工学院一年预科心声
  16. 考研数据结构(2)笔记
  17. 机器学习:决策树(Decision Tree)介绍
  18. ArcGIS土地利用动态度与土地利用程度计算(附练习数据下载)
  19. 英特尔实感摄像头D415、D435、D435i、T265的差异
  20. 【Flutter从入门到实战】 ⑨、滚动的Widget-ListView、GridView、SliverWidget、滚动的Widget的滚动监听的方式

热门文章

  1. java给手机发短信_java web 项目向手机发送短信
  2. ue4渲染速度太慢_看虚幻引擎技术大神分享烧脑干货《克服VR眩晕之帧数:提升UE4内容实时渲染效率》...
  3. android流量显示插件,安卓状态栏显示网速(安卓网速显示插件)
  4. 华为项目管理法读后小结
  5. 如何搭建一套业务、数据一体化的数据指标体系
  6. html5做微信公众号文章代码,微信公众号文章怎么使用代码排版?
  7. C A+B for Input-Output Practice (II) SDUT
  8. 捷配送了10块板子后,决定做一个“小霸王”手柄
  9. 如何将图片中的表格变成Excel?这几个操作很简单
  10. 毫米波雷达产业链全景