实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)
实验内容:
选择合适的秘钥,利用上述三个算法:熟悉恺撒密码、双重置换密码、一次一密密码算法。加密如下明文:
大风起兮云飞扬,
威加海内兮归故乡,
安得猛士兮守四方。
《大风歌》--刘邦
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编码已知,
![](/assets/blank.gif)
在“大”这个字应该为\u5927,我需要对后面的十六进制数字5927进行+3的数字运算,这里走了不少弯路。
首先对\u5927字符串直接加三,这显然是不行的。之后对String 类型的5972进行加3,发现结果变成了59273(String类型后面’+’只能进行字符串的后缀叠加)。反思后,我把String类型先parseInt变为Int型再加3,这下肯定不会出错了吧?结果发现例如”风”是\u98ce,不能进行parseInt的转换。
此刻我的内心是崩溃的,“怎么进行十六进制加法,还要忽略字符串?”这个问题纠结了很久。最后,解决方案是:在没转成16进制之前,对,就是在十进制的时候就加3,然后再转成16进制。(因为16进制的3和10进制的3是一样的)。
因此得到了运行结果:![](/assets/blank.gif)
虽然凯撒密码是本次实验中入门的古典密码,但是从“单字母表替换”到“char数组的位移替换”到“利用unicode码”我认为难度是不一样的,从这个过程中我学到了很多东西。
实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)相关推荐
- 凯撒密码C语言去掉空格字符,凯撒密码的问题C语言
满意答案 xlaijing19 推荐于 2016.04.01 采纳率:43% 等级:12 已帮助:6257人 最低0.27元开通文库会员,查看完整内容> 原发布者:耿万德 凯撒密码是一种非 ...
- 凯撒密码C语言去掉空格字符,凯撒密码C语言实现
<凯撒密码C语言实现>由会员分享,可在线阅读,更多相关<凯撒密码C语言实现(8页珍藏版)>请在人人文库网上搜索. 1.凯撒密码是一种非常古老的加密方法, 相传当年凯撒大地行军打 ...
- java密码框转字符串_实现汉字的凯撒密码(内容包括:去掉字符串中的转义字符、汉字的unicode转换)...
实验内容: 选择合适的秘钥,利用上述三个算法:熟悉恺撒密码.双重置换密码.一次一密密码算法.加密如下明文: 大风起兮云飞扬, 威加海内兮归故乡, 安得猛士兮守四方. <大风歌>--刘邦 3 ...
- 【C基础练习题】Week9:凯撒密码 | 按空格切分字符串 | 单词折半拆分
目录 第一题:凯撒密码 第二题:按空格切分字符串 第三题:单词折半拆分 第一题:凯撒密码 [百度百科]在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密.恺撒变换.变换加密,是一种 ...
- 凯撒密码c++语言程序,C++中的凯撒密码程序
我想用C++编写凯撒密码程序.我使用了四个函数,一个用于选择Shift键,两个用于加密和解密,最后一个用于实现凯撒密码,使用输入文件读取文本并将加密或解密文本输出到输出文件中.我试图运行代码,它正在崩 ...
- c语言凯撒密码例题解题过程,C语言:凯撒密码的实现
凯撒密码的实现(10分) 题目内容: 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令.它将字母表中的字母移动一定位置而实现加密. ...
- C语言:凯撒密码的实现
凯撒密码的实现(10分) 题目内容: 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令.它将字母表中的字母移动一定位置而实现加密. ...
- php实现凯撒密码加密算法,Python实现的凯撒密码算法示例
本文实例讲述了Python实现的凯撒密码算法.分享给大家供大家参考,具体如下: 一 介绍 凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方 ...
- java实现凯撒密码_凯撒密码--java实现
关于凯撒密码的介绍我就不多说了,感兴趣的可以看什么是凯撒密码?,我主要说的是java如何实现. 我发现网上有写java加密解密的,写的时候发现只需要一个转换函数就可以了,可以作为加密用,也可以用作解密 ...
- 凯撒密码c语言公式原理,凯撒密码 C语言实现.pdf
凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不 被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全.他的原理很简单, 说到底就是字母于字母之间的替换.下面 ...
最新文章
- Rushcrm:客户关系管理适合的才是好的
- 三十八、网络通信Socket模块实现文件传输
- 课时71.后代选择器(掌握)
- 用python可以解决什么问题_学 Python 能帮你解决什么问题 ?
- Javascript基础 对象与方法的识别
- 宣布降低Windows Azure 存储和计算的价格
- posix and system V IPC
- QA:mongoose中设置virtual后不工作问题
- 约束规划问题与凸二次规划
- 测度论与概率论基础(程士宏)学习笔记(二)
- 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
- 编写一个 SQL 查询来实现分数排名
- Type A卡和Type B卡的主要区别
- Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
- 南昌工学院计算机挂科率,南昌工学院一年预科心声
- 考研数据结构(2)笔记
- 机器学习:决策树(Decision Tree)介绍
- ArcGIS土地利用动态度与土地利用程度计算(附练习数据下载)
- 英特尔实感摄像头D415、D435、D435i、T265的差异
- 【Flutter从入门到实战】 ⑨、滚动的Widget-ListView、GridView、SliverWidget、滚动的Widget的滚动监听的方式
热门文章
- java给手机发短信_java web 项目向手机发送短信
- ue4渲染速度太慢_看虚幻引擎技术大神分享烧脑干货《克服VR眩晕之帧数:提升UE4内容实时渲染效率》...
- android流量显示插件,安卓状态栏显示网速(安卓网速显示插件)
- 华为项目管理法读后小结
- 如何搭建一套业务、数据一体化的数据指标体系
- html5做微信公众号文章代码,微信公众号文章怎么使用代码排版?
- C A+B for Input-Output Practice (II) SDUT
- 捷配送了10块板子后,决定做一个“小霸王”手柄
- 如何将图片中的表格变成Excel?这几个操作很简单
- 毫米波雷达产业链全景