一、中国古代加密
看一个小故事 , 看看古人如何加密和解密:
公元683年,唐中宗即位。随后,武则天废唐中宗,立第四子李旦为皇帝,但朝政大事均由她自己专断。
裴炎、徐敬业和骆宾王等人对此非常不满。徐敬业聚兵十万,在江苏扬州起兵。裴炎做内应,欲以拆字手段为其传递秘密信息。后因有人告密,裴炎被捕,未发出的密信落到武则天手中。这封密信上只有“青鵝”二字,群臣对此大惑不解。
武则天破解了“青鵝”的秘密:“青”字拆开来就是“十二月”,而“鵝”字拆开来就是“我自与”。密信的意思是让徐敬业、骆宾王等率兵于十二月进发,裴炎在内部接应。“青鵝”破译后,裴炎被杀。接着,武则天派兵击败了徐敬业和骆宾王。
二、外国加密
在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。
凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码。这是一种位移加密方式,只对26个字母进行位移替换加密,规则简单,容易破解。下面是位移1次的对比:
将明文字母表向后移动1位,A变成了B,B变成了C……,Z变成了A。同理,若将明文字母表向后移动3位:
则A变成了D,B变成了E……,Z变成了C。
字母表最多可以移动25位。凯撒密码的明文字母表向后或向前移动都是可以的,通常表述为向后移动,如果要向前移动1位,则等同于向后移动25位,位移选择为25即可。
它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。
简单来说就是当秘钥为n,其中一个待加密字符ch,加密之后的字符为ch+n,当ch+n超过’z’时,回到’a’计数。
三、凯撒位移加密
创建类 KaiserDemo,把 hello world 往右边移动3位
package com.atguigu.kaiser; /** * KaiserDemo * * @Author: Json hao * @CreateTime: 2020-09-03 * @Description: */ public class KaiserDemo { public static void main(String[] args) { String input = "Hello world"; // 往右边移动3位 int key = 3; // 用来拼接 StringBuilder sb = new StringBuilder(); // 字符串转换成字节数组 char[] chars = input.toCharArray(); for (char c : chars) { int asciiCode = c; // 移动3位 asciiCode = asciiCode + key; char newChar = (char) asciiCode; sb.append(newChar); } System.out.println(sb.toString()); } }
运行结果:
四、凯撒加密和解密
package com.atguigu.kaiser; /** * KaiserDemo * * @Author: Json hao * @CreateTime: 2020-09-03 * @Description: */ public class KaiserDemo { public static void main(String[] args) { String orignal = "Hello world"; // 往右边偏移三位 int key = 3; // 选中我即将抽取的代码,按快捷键Ctrl + Alt + M String encryptKaiser = encryptKaiser(orignal,key); System.out.println("加密:" + encryptKaiser); String decryptKaiser = decryptKaiser(encryptKaiser,key); System.out.println("解密:" + decryptKaiser); } /** * 使用凯撒加密方式解密数据 * * @param encryptedData :密文 * @param key :密钥 * @return : 源数据 */ public static String decryptKaiser(String encryptedData, int key) { // 将字符串转为字符数组 char[] chars = encryptedData.toCharArray(); StringBuilder sb = new StringBuilder(); for (char aChar : chars) { // 获取字符的ASCII编码 int asciiCode = aChar; // 偏移数据 asciiCode -= key; // 将偏移后的数据转为字符 char result = (char) asciiCode; // 拼接数据 sb.append(result); } return sb.toString(); } /** * 使用凯撒加密方式加密数据 * * @param orignal :原文 * @param key :密钥 * @return :加密后的数据 */ public static String encryptKaiser(String orignal, int key) { // 将字符串转为字符数组 char[] chars = orignal.toCharArray(); StringBuilder sb = new StringBuilder(); for (char aChar : chars) { // 获取字符的ascii编码 int asciiCode = aChar; // 偏移数据 asciiCode += key; // 将偏移后的数据转为字符 char result = (char) asciiCode; // 拼接数据 sb.append(result); } return sb.toString(); } }