【凯撒密码】

1. 介绍

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行了,它的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如当偏移量是3的时候,所有的字母A将被替换成D,B变成E,由此可见,位数就是凯撒密码加密和解密的密钥。

例如:字符串"ABC"的每个字符都右移3位则变成了“DEF”,解密的时候“DEF”的每个字符左移3位即能还原,如下图所示:
在这里插入图片描述

2. Java实现

/**
 * @description: 凯撒密码
 * @author: WangYX
 * @create: 2022-03-09 10:29
 * @Version: 1.0.0
 **/

public class CaesarCipher {

    /**
     * 加密
     *
     * @param input 数据源(需要加密的数据)
     * @param key   秘钥,即偏移量
     * @return 返回加密后的数据
     */
    public static String encrypt(String input, int key) {

        char[] chars = input.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            int ascii = chars[i];
            ascii = (ascii - '!' + key) % 94 + '!';
            char newChar = (char) ascii;
            chars[i] = newChar;
        }
        return new String(chars);
    }

    /**
     * 解密
     *
     * @param input 数据源(被加密后的数据)
     * @param key   秘钥,即偏移量
     * @return 返回解密后的数据
     */
    public static String decrypt(String input, int key) {
        //得到字符串里的每一个字符
        char[] array = input.toCharArray();

        for (int i = 0; i < array.length; ++i) {
            //字符转换成ASCII 码值
            int ascii = array[i];
            //恢复字符偏移,例如b->a
            ascii = (ascii - '~' - key) % 94 + '~';
            //ASCII 码值转换为char
            char newChar = (char) ascii;
            //替换原有字符
            array[i] = newChar;
            //以上4 行代码可以简写为一行
            //array[i] = (char) (array[i] - key);
        }
        //字符数组转换成String
        return new String(array);
    }


}

上面的代码可以将ACSII码中的可显示字符进行加密解密处理。

public class psvm {

    public static void main(String[] args) {
        String str = "123%^%*87982|}{>>!!!~~~";
        String encrypt = CaesarCipher.encrypt(str, 456);
        System.out.println(encrypt);

        String decrypt = CaesarCipher.decrypt(encrypt, 456);
        System.out.println(decrypt);
    }
}

测试结果:
在这里插入图片描述

3. 凯撒密码的破解

凯撒密码是比较简单的密码,只是进行单表代换,实现起来也比较容易,破解起来也不难,是很不安全的密码。

3.1 暴力破解

在凯撒密码中,密钥就是字母平移的数字。由于字母表只有26个字母,因此加密用的密钥只有0到25共26种。(平移0个字母或者平移26个字母实际相当于没有加密)。
使用暴力破解就是将这25种可能性每种都检测一遍,其中就肯定存在正确的结果。

3.2 频率分析法

在任何一种的书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言书写的任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母E出现的频率很高,而X出现的频率很低。

英语文本中典型的字母分布情况如下图所示:
在这里插入图片描述
破解流程
1,统计密文里出现次数最多的字符,例如出现次数最多的字符是是’h’。
2,计算字符’h’到’e’的偏移量,值为3,则表示原文偏移了3 个位置。
3,将密文所有字符恢复偏移3 个位置。

注意点:统计密文里出现次数最多的字符时,需多统计几个备选,因为最多的可能是空格或者其他字符,例如下图出现次数最多的字符’#’是空格加密后的字符,’h’才是’e’偏移后的值。

在这里插入图片描述
解密时要多几次尝试,因为不一定出现次数最多的字符就是我们想要的目标字符,如下图,第二次解密的结果才是正确的。
在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值