【算法】Java凯撒密码实现方法

21 篇文章 2 订阅
1 篇文章 0 订阅

【算法】Java凯撒密码实现方法

1、凯撒密码介绍

凯撒密码作为一种最简单的消息加密方式,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,由此可见,位数就是凯撒密码加密和解密的秘钥。

2、凯撒密码的实现

在此之前我们必须得了解一个基本概念==“移位和循环移位”==

移位和循环移位

​ 移位就是将一段数码按照规定的位数整体性地左移或右移。循环右移就是当右移时,把数码的最后的位移到数码的最前头,循环左移相反。

​ 例如,对十进制数码0123456789右移一位(十进制位)的结果为9012345678,而循环左移一位得到的结果则为1234567890。

凯撒密码就是使用的循环移位

2.1、基于ASCII码实现凯撒密码

加密方法如下:

@Test
public void test(){
    String abc = asciiCaesarEncrypt("ABC", 125);
    System.out.println(abc);
}
public String asciiCaesarEncrypt(String str,int offset){
    char[] chars = str.toCharArray();
    //循环位移算法
    for (int i = 0; i < chars.length; i++) {
        int i1 = chars[i] + offset;
        if(i1>127){
            chars[i]= (char) (i1%=128);
        }else if (i1<0){
            int abs = Math.abs(i1)%128;
            chars[i]=(char)(128-abs);
        }else {
            chars[i] += offset;
        }
    }
    return String.valueOf(chars);
}
上面的运行结果
>?@

解密方法如下:

public String asciiCaesarDecrypt(String str,int offset){
    char[] chars = str.toCharArray();
    //循环位移算法
    for (int i = 0; i < chars.length; i++) {
        int i1 = chars[i] - offset;
        if(i1>127){
            chars[i]= (char) (i1%=128);
        }else if (i1<0){
            int abs = Math.abs(i1)%128;
            chars[i]=(char)(128-abs);
        }else{
            chars[i] -= offset;
        }
    }
    return String.valueOf(chars);
}

2.2、基于字母表实现的凯撒密码

加密方法如下:

@Test
public void test(){
    String abc = lowerCaseCaesarEncrypt("zabc", 25);
    System.out.println(abc);
}
public String lowerCaseCaesarEncrypt(String str,int offset){
    char[] chars=str.toCharArray();
    char[] lowerCase=new char[26];
    for (int i = 0; i < 26; i++) {
        lowerCase[i]= (char) ('a'+i);//如果需要大写字母表这里可以填'A'
    }
    String lowerCaseStr=String.valueOf(lowerCase);
    for (int i = 0; i < chars.length; i++) {
        int i1 = lowerCaseStr.indexOf(chars[i]) + offset;
        if(i1>25){
            chars[i]=lowerCase[(i1%=26)];
        }else if (i1<0){
            int abs = Math.abs(i1)%26;
            chars[i]=lowerCase[(26-abs)];
        }else{
            chars[i] += offset;
        }
    }
    return String.valueOf(chars);
}
上面的运行结果
yzab

解密方法如下:

public String lowerCaseCaesarDecrypt(String str,int offset){
    char[] chars=str.toCharArray();
    char[] lowerCase=new char[26];
    for (int i = 0; i < 26; i++) {
        lowerCase[i]= (char) ('a'+i);//如果需要大写字母表这里可以填'A'
    }
    String lowerCaseStr=String.valueOf(lowerCase);
    for (int i = 0; i < chars.length; i++) {
        int i1 = lowerCaseStr.indexOf(chars[i]) - offset;
        if(i1>25){
            chars[i]=lowerCase[(i1%=26)];
        }else if (i1<0){
            int abs = Math.abs(i1)%26;
            chars[i]=lowerCase[(26-abs)%26];
        }else{
            chars[i] -= offset;
        }
    }
    return String.valueOf(chars);
}

本文到此完毕

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值