密码学之恺撒加密(03)

2021-08-23 16:30:47 浏览数 (1)

恺撒加密


文章目录

  • 恺撒加密
  • 一、中国古代加密
  • 二、外国加密
  • 三、凯撒位移加密
  • 四、凯撒加密和解密
  • 五、频度分析法破解恺撒加密
    • 密码棒
    • 频率分析解密法
    • 英文字母频率统计表:

以下是本篇文章正文内容

一、中国古代加密

看一个小故事 , 看看古人如何加密和解密:

公元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位

代码语言:javascript复制
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());
    }
}

运行结果:

四、凯撒加密和解密

代码语言:javascript复制
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();
    }
}

五、频度分析法破解恺撒加密

密码棒

公元前5世纪的时候,斯巴达人利用一根木棒,缠绕上皮革或者羊皮纸,在上面横向写下信息,解下这条皮带。展开来看,这长串字母没有任何意义。

比如这样:

信差可以将这条皮带当成腰带,系在腰上。

比如这样:

然后收件人将这条皮带缠绕在相同的木棒上,就能恢复信息了。

前404年,一位遍体鳞伤的信差来到斯巴达将领利桑德面前,这趟波斯之旅只有他和四位同伴幸存,利桑德接下腰带,缠绕到他的密码棒上,得知波斯的发那巴祖斯准备侵袭他,多亏密码棒利桑德才能够预先防范,击退敌军。

频率分析解密法

密码棒是不是太简单了些?

加密者选择将组成信息的字母替代成别的字母,比如说将a写成1,这样就不能被解密者直接拿到信息了。

这难不倒解密者,以英文字母为例,为了确定每个英文字母的出现频率,分析一篇或者数篇普通的英文文章,英文字母出现频率最高的是e,接下来是t,然后是a……,然后检查要破解的密文,也将每个字母出现的频率整理出来,假设密文中出现频率最高的字母是j,那么就可能是e的替身,如果密码文中出现频率次高的但是P,那么可能是t的替身,以此类推便就能解开加密信息的内容。这就是频率分析法。

在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言写的任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母E出现的频率很高,而X出现的较少。类似地,ST、NG、TH以及QU等双字母组合出现的频率非常高,NZ、QJ组合则极少。英语中出现频率最高的12个字母可以简记为“ETAOIN SHRDLU”。

简单替换密码的频率分析,在一个简单的替换密码中,明文中的每一个字母都被另一个字母替换,而且明文中相同的字母在转换为密文时总是被同一个字母所替换。比如,所有的e都会被替换成x,一个含有大量x的密文消息会向密码破译者暗示x替换e。

  • 将明文字母的出现频率与密文字母的频率相比较的过程
  • 通过分析每个符号出现的频率而轻易地破译代换式密码
  • 在每种语言中,冗长的文章中的字母表现出一种可对之进行分辨的频率。
  • e是英语中最常用的字母,其出现频率为八分之一

英文字母频率统计表:

下面是人们从大量的英文文章中统计出的字母频率。

第一列的是字母,第二列是每个字母出现的频率,第三列是以最少使用的字母q为1计算得出的倍数表。

E

11.1607%

56.88

M

3.0129%

15.36

A

8.4966%

43.31

H

3.0034%

15.31

R

7.5809%

38.64

G

2.4705%

12.59

I

7.5448%

38.45

B

2.0720%

10.56

O

7.1635%

36.51

F

1.8121%

9.24

T

6.9509%

35.43

Y

1.7779%

9.06

N

6.6544%

33.92

W

1.2899%

6.57

S

5.7351%

29.23

K

1.1016%

5.61

L

5.4893%

27.98

V

1.0074%

5.13

C

4.5388%

23.13

X

0.2902%

1.48

U

3.6308%

18.51

Z

0.2722%

1.39

D

3.3844%

17.25

J

0.1965%

1.00

P

3.1671%

16.14

Q

0.1962%

(1)


未完待续…

0 人点赞