实验内容:

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

大风起兮云飞扬,

威加海内兮归故乡,

安得猛士兮守四方。

《大风歌》--刘邦

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码”我认为难度是不一样的,从这个过程中我学到了很多东西。

----------------

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

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

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

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

  2. Java简易实现凯撒密码——英文句子加密

    Java简易实现凯撒密码--英文句子加密 今天要讲的是凯撒密码,它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3的时候,所有 ...

  3. 关于凯撒密码加密特征值,base64加密shellcode并分离绕过杀软

    什么是shellcode? 在黑客攻击中,shellcode是一小段代码,用于利用软件漏洞作为有效载荷.它之所以被称为"shellcode",是因为它通常启动一个命令shell,攻 ...

  4. Python密码学入门:凯撒密码

    1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...

  5. 凯撒密码加密算法python_Python密码学入门:凯撒密码

    1 什么是密码学 自古以来,间谍.士兵.黑客.海盗.商人等人,大多依靠密码学来确保他们的秘密不会人尽皆知.密码学是一门使用秘密编码的学科.想要明白密码长什么样,看一看下面两段文本. nyr N.vNw ...

  6. 密码学基础(二)单表---置换密码 凯撒密码 棋盘密码 乘法密码 仿射密码 多表---vigenere方阵

    1古典密码 (1)置换密码 明文字母重新排列,字母本身不变,但是位置发生变化(倒序或者按照按照数组排列后以行或列重新组合) (2)代替密码 分为单表代替密码和多表代替密码 单表代替密码中代表性的 凯撒 ...

  7. 凯撒密码的自动化破解方法(适用于英文文本)

    凯撒密码的自动化破解方法(适用于英文文本) 凯撒密码 凯撒加密是有记载的最古老的加密方法.原始的凯撒密码没有密钥,加密方式很原始,就是通过将字母表循环右移三位进行加密:a被D替代,b被E替代,-,x被 ...

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

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

  9. 凯撒密码(java python)

    凯撒密码是对称密码体系的代表,其原理简单点说就是原字母移动k个位置后用k位置处的字母代表之前的字母.下面给出我写的破解凯撒密码体系的初次尝试(暴力破解).程序思路大致就是对密文做适当处理,去掉标点符号 ...

最新文章

  1. 云服务收入年增长28%
  2. Java服务端人脸识别实战开发优化
  3. 物联网Wi-Fi配网方式,你知道几种?
  4. 垃圾代码还能出圈?手把手教你写垃圾代码,从入门到精通!
  5. 【转】SOAR平台初探(一)
  6. 微信二维码名片生成示例【转】
  7. 图(graph)神经网络学习(四)--代码解析(Model_2)
  8. ubuntu如何查看java版本_Ubuntu 如何查看安装的 JDK
  9. FPGA之JESD204B接口——总体概要 尾片
  10. pygame游戏之旅2:创建游戏窗口界面
  11. 贴片电阻阻值识别方法
  12. 基因家族分析②:linux下blast的安装和使用
  13. solaris 安全设置
  14. 64匹马,8个赛道,找出前4名最少比赛多少场?
  15. 程序员趣图:有时候我的代码就是这样子……
  16. 图像自动去暗角算法(vegnetting
  17. Java书签 #用Java生成指定位数不重复随机数
  18. win10 VS 2015安装包丢失或损坏
  19. 【框架学习】AOP切面详解
  20. 医学有限元(Mimics、ANSYS)

热门文章

  1. HB100多普勒雷达+STM32L476VGTx测速系统的电路设计(滤波放大比较器)
  2. 洛谷 P4720 【模板】扩展卢卡斯定理/exLucas
  3. 华硕笔记本BIOS设置u盘启动图文详解
  4. 实体-关系图转换为关系模型
  5. Linux笔记之Debian 11(bullseye) 配置国内源
  6. apache 的配置文件hthp.conf里边都是什么意思?
  7. gamemaker studio socket例子
  8. [BJDCTF 2nd] 燕言燕语-y1ng
  9. 螃蟹保存方法保存时间_活螃蟹如何保存才能活得时间久(这几个方法简单实用)...
  10. 微信扫付款后,付错款,不是好友也能联系到收款方