前言:
在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
思路:这种算法的思想是移位思想,加密过程将明文中的值与已有库(lib)做匹配,再取lib库移位后的值。解密过程反向移位,其它操作相同。
下面进入正题,使用java简单实现恺撒密码算法,走Demo:
/**
* Copyright (C), 2000-2021, XXX有限公司
* FileName: Caesar
* Author: wangyetao
* Date: 21-10-12 03:02:46
* Description: 经典密码学算法-凯撒算法简单实现
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 版本描述
*/
package simple.callback.cryptographyalgorithm;
/**
* @ClassName: Caesar
* @Description: 凯撒算法
* @Author: wangyetao
* @Date: 21-10-12 03:02:46
*/
public class Caesar {
//数字库
private int[] stuffNumsLibs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//偏移位,默认正向偏移
private int offset = 0;
public Caesar(int inputoffset) {
offset = inputoffset;
}
//加密
private int[] encryption(int[] numsArr) {
int[] encryption = new int[numsArr.length];
for (int i = 0; i < numsArr.length; i++) {
//查找
for (int j = 0; j < stuffNumsLibs.length; j++) {
if (numsArr[i] == stuffNumsLibs[j]) {
//替换为目标位的数值,测试数8起始位8,测试偏移位3,targetIndex->1
//替换为目标位的数值,测试数8起始位8,测试偏移位4,targetIndex->2
//替换为目标位的数值,测试数8起始位8,测试偏移位13=3,targetIndex->1
int matchinglibsIndex = stuffNumsLibs[j];
int libsLength = stuffNumsLibs.length;
//模位
int matrix = offset % libsLength;
int tmpIndex = matchinglibsIndex + matrix;
//计算出偏移后的目标位
int targetIndex = tmpIndex % libsLength;
//取目标位的数值
encryption[i] = stuffNumsLibs[targetIndex];
break;//查找结束
}
}
}
return encryption;
}
//解密
private int[] decrypt(int[] numsArr) {
int[] decrypt = new int[numsArr.length];
for (int i = 0; i < numsArr.length; i++) {
//查找
for (int j = 0; j < stuffNumsLibs.length; j++) {
if (numsArr[i] == stuffNumsLibs[j]) {
//替换为目标位的数值,测试数0起始位0,测试偏移位-2,targetIndex->8
//替换为目标位的数值,测试数0起始位0,测试偏移位-3,targetIndex->7
//替换为目标位的数值,测试数0起始位0,测试偏移位-13=-3,targetIndex->7
int matchinglibsIndex = stuffNumsLibs[j];
int libsLength = stuffNumsLibs.length;
//模位
int matrix = offset % libsLength;
int tmpIndex = matchinglibsIndex - matrix;
//计算出偏移后的目标位
int targetIndex = 0;
if (tmpIndex >= 0) {
targetIndex = tmpIndex;
} else {
targetIndex = libsLength - Math.abs(tmpIndex);
}
//取目标位的数值
decrypt[i] = stuffNumsLibs[targetIndex];
break;//查找结束
}
}
}
return decrypt;
}
//Test Caesar
public static void main(String[] args) {
int[] numsArr = {2, 8, 2, 7, 3, 7, 4, 4, 9, 6, 1, 8, 0, 1, 3, 8, 7};
Caesar kaiSa = new Caesar(5);
System.out.println("经典密码学算法-凯撒算法简单实现,原数组:");
for (int i = 0; i < numsArr.length; i++)
System.out.print(numsArr[i] + "\t");
System.out.println("\n经典密码学算法-凯撒算法简单实现,加密后:");
int[] numsEncryptionArr = kaiSa.encryption(numsArr);
for (int i = 0; i < numsEncryptionArr.length; i++)
System.out.print(numsEncryptionArr[i] + "\t");
System.out.println("\n经典密码学算法-凯撒算法简单实现,解密还原:");
int[] numsDecryptArr = kaiSa.decrypt(numsEncryptionArr);
for (int i = 0; i < numsDecryptArr.length; i++)
System.out.print(numsDecryptArr[i] + "\t");
}
}
DEMO输出:
经典密码学算法-凯撒算法简单实现,原数组:
2 8 2 7 3 7 4 4 9 6 1 8 0 1 3 8 7
经典密码学算法-凯撒算法简单实现,加密后:
7 3 7 2 8 2 9 9 4 1 6 3 5 6 8 3 2
经典密码学算法-凯撒算法简单实现,解密还原:
2 8 2 7 3 7 4 4 9 6 1 8 0 1 3 8 7
Process finished with exit code 0
在此记录与总结,2021年 10月 12日 星期二 05:01:17 CST。