热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

实验内容:

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

大风起兮云飞扬,

威加海内兮归故乡,

安得猛士兮守四方。

《大风歌》--刘邦

 

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 (inti = 0; i <str.length(); i++){ 

            intchr1 = (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);

        returnstrBuilder

    } 

 

 

思路:将汉字范围内的整型转换为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码”我认为难度是不一样的,从这个过程中我学到了很多东西。 ---------------- 古典密码恺撒密码、双重置换密码、一次一密密码算法三种都写了,但是实验报告搞过来太麻烦,图片要一个一个贴,等这一阵考完雅思把报告打包一下传上来。
推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
今日屎汰濃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有