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

文章目录

  • 【算法】Java凯撒密码实现方法
    • 1、凯撒密码介绍
    • 2、凯撒密码的实现
      • 2.1、基于ASCII码实现凯撒密码
      • 2.2、基于字母表实现的凯撒密码

【算法】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);
}

本文到此完毕

你可能感兴趣的:(算法,Java,密码学,java,算法,安全,网络安全)