凯撒密码加密算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char[] messageRes = new char[messageArr.length];//存放加密后的字符
int[] index = new int[messageArr.length]; //存放原字符各个字符的位置
for (int i = 0; i < messageArr.length; i++) {
char[] messageArr = message.toUpperCase().toCharArray();//将要加密的原字符转为大写并转为字符数组
char[] messageRes = new char[messageArr.length];//存放加密后的字符
int[] index = new int[messageArr.length]; //存放原字符各个字符的位置
System.out.println("行加密后的字符串:"+res1);
System.out.println("列加密后的字符串:"+res2);
}
//构造方法初始化密码原本,对crypto赋值,offsets数组是指在初始化时每行的偏移量
public Crypto(int[] offsets) {
index = index - 26;
}
crypto[row][col] = initWord[index];
}
}*/
//输出生成的数组
//外层循环,表示数组行数
/*for (int row = 0; row < 26; row++) {
for (int col = 0; col < 26; col++) {
System.out.print(crypto[row][col]);
}
System.out.println();
}*/
}
//返回一行数据。row介于0-25之间,包括0和25
public char[] getCaesarCipher(int row) {
return crypto[row]; // crypto的每一行都是一个数组
index[i] = -1; //空格的位置用-1标出
continue;
}
if (messageArr[i] == initWord[j]) {
index[i] = j; //记录每个字符的位置
}
}
}
for (int i = 0, j = 0; i < index.length; i++, j++) {
for (int i = 0; i < messageArr.length; i++) {
for (int j = 0; j < initWord.length; j++) {
if (messageArr[i] == ' ') { //如果是空格,不做比对,继续下个字符,字符类型数据可直接用==比较,字符串类型不可以
int c = 65 + offset + col;
//如果大于90,说明超出Z的范围,应从A在开始
if (c > 90) {
c = c - 90 + 64;
}
crypto[row][col] = (char) (c);
}
}
//第二种初始化方法,利用initWord进行初始化
//外层循环,表示数组行数
int[] offsets = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
Crypto c = new Crypto(offsets);
新建任意java项目,创建packagecom.caesar,新建类Crypto.java,将上边的代码拷入即可。
package com.caesar;
public class Crypto {
//初始化一个26*26的char类型数组,存放密码原本
public char[][] crypto = new char[26][26];
//初始化crypto和计算原始message各个字符的位置的初始信息。
public char[] initWord = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
}
if (messageArr[i] == initWord[j]) {
index[i] = j; //记录每个字符的位置
}
}
}
for (int i = 0, j = 0; i < index.length; i++, j++) {
if (index[i] != -1) {
messageRes[j] = tempCaesar[index[i]]; //从对应位置中取出加密的字符
}
//返回一列数据,col介于0-25之间,包括0和25
public char[] getDoubleCaesarCipher(int col) {
char[] temp = new char[26];
for (int row = 0; row < 26; row++) {
temp[row] = crypto[row][col];
} else {
messageRes[j] = ' '; //如果是-1,表示是空格
}
}
return new String(messageRes);
}
//以列为编码原本
public String doubleEncrypt(String message, int col) {
char[] tempCaesar = getDoubleCaesarCipher(col); //作为编码原本的数组
if (index[i] != -1) {
messageRes[j] = tempCaesar[index[i]]; //从对应位置中取出加密的字符
} else {
messageRes[j] = ' '; //如果是-1,表示是空格
}
}
return new String(messageRes);
}
}
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z' };
public static void main(String[] args) {
//初始换偏移量,最大值不能大于25(可以自定义修改)
String message = "I have lots of swag";
String res1 = c.encrypt(message, 5);
String res2 = c.doubleEncrypt(message, 5);
System.out.println("加密前的字符串:"+message);
for (int j = 0; j < initWord.length; j++) {
if (messageArr[i] == ' ') { //如果是空格,不做比对,继续下个字符,字符类型数据可直接用==比较,字符串类型不可以
index[i] = -1; //空格的位置用-1标出
continue;
}
retwenku.baidu.comrn temp;
}
//以行为编码原本
public String encrypt(String message, int row) {
char[] tempCaesar = getCaesarCipher(row); //作为编码原本的数组
char[] messageArr = message.toUpperCase().toCharArray();//将要加密的原字符转为大写并转为字符数组
//第一种初始化方式,利用unicode编码转换,A-Z对应数字65-90
//外层循环,表示数组行数
for (int row = 0; row < 26; row++) {
//每一行的偏移量
int offset = offsets[row];
for (int col = 0; col < 26; col++) {
/*for (int row = 0; row < 26; row++) {
//每一行的偏移量
int offset = offsets[row];
for (int col = 0; col < 26; col++) {
int index = col + offset;
if (index >= 26) {
int[] index = new int[messageArr.length]; //存放原字符各个字符的位置
for (int i = 0; i < messageArr.length; i++) {
char[] messageArr = message.toUpperCase().toCharArray();//将要加密的原字符转为大写并转为字符数组
char[] messageRes = new char[messageArr.length];//存放加密后的字符
int[] index = new int[messageArr.length]; //存放原字符各个字符的位置
System.out.println("行加密后的字符串:"+res1);
System.out.println("列加密后的字符串:"+res2);
}
//构造方法初始化密码原本,对crypto赋值,offsets数组是指在初始化时每行的偏移量
public Crypto(int[] offsets) {
index = index - 26;
}
crypto[row][col] = initWord[index];
}
}*/
//输出生成的数组
//外层循环,表示数组行数
/*for (int row = 0; row < 26; row++) {
for (int col = 0; col < 26; col++) {
System.out.print(crypto[row][col]);
}
System.out.println();
}*/
}
//返回一行数据。row介于0-25之间,包括0和25
public char[] getCaesarCipher(int row) {
return crypto[row]; // crypto的每一行都是一个数组
index[i] = -1; //空格的位置用-1标出
continue;
}
if (messageArr[i] == initWord[j]) {
index[i] = j; //记录每个字符的位置
}
}
}
for (int i = 0, j = 0; i < index.length; i++, j++) {
for (int i = 0; i < messageArr.length; i++) {
for (int j = 0; j < initWord.length; j++) {
if (messageArr[i] == ' ') { //如果是空格,不做比对,继续下个字符,字符类型数据可直接用==比较,字符串类型不可以
int c = 65 + offset + col;
//如果大于90,说明超出Z的范围,应从A在开始
if (c > 90) {
c = c - 90 + 64;
}
crypto[row][col] = (char) (c);
}
}
//第二种初始化方法,利用initWord进行初始化
//外层循环,表示数组行数
int[] offsets = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };
Crypto c = new Crypto(offsets);
新建任意java项目,创建packagecom.caesar,新建类Crypto.java,将上边的代码拷入即可。
package com.caesar;
public class Crypto {
//初始化一个26*26的char类型数组,存放密码原本
public char[][] crypto = new char[26][26];
//初始化crypto和计算原始message各个字符的位置的初始信息。
public char[] initWord = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
}
if (messageArr[i] == initWord[j]) {
index[i] = j; //记录每个字符的位置
}
}
}
for (int i = 0, j = 0; i < index.length; i++, j++) {
if (index[i] != -1) {
messageRes[j] = tempCaesar[index[i]]; //从对应位置中取出加密的字符
}
//返回一列数据,col介于0-25之间,包括0和25
public char[] getDoubleCaesarCipher(int col) {
char[] temp = new char[26];
for (int row = 0; row < 26; row++) {
temp[row] = crypto[row][col];
} else {
messageRes[j] = ' '; //如果是-1,表示是空格
}
}
return new String(messageRes);
}
//以列为编码原本
public String doubleEncrypt(String message, int col) {
char[] tempCaesar = getDoubleCaesarCipher(col); //作为编码原本的数组
if (index[i] != -1) {
messageRes[j] = tempCaesar[index[i]]; //从对应位置中取出加密的字符
} else {
messageRes[j] = ' '; //如果是-1,表示是空格
}
}
return new String(messageRes);
}
}
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z' };
public static void main(String[] args) {
//初始换偏移量,最大值不能大于25(可以自定义修改)
String message = "I have lots of swag";
String res1 = c.encrypt(message, 5);
String res2 = c.doubleEncrypt(message, 5);
System.out.println("加密前的字符串:"+message);
for (int j = 0; j < initWord.length; j++) {
if (messageArr[i] == ' ') { //如果是空格,不做比对,继续下个字符,字符类型数据可直接用==比较,字符串类型不可以
index[i] = -1; //空格的位置用-1标出
continue;
}
retwenku.baidu.comrn temp;
}
//以行为编码原本
public String encrypt(String message, int row) {
char[] tempCaesar = getCaesarCipher(row); //作为编码原本的数组
char[] messageArr = message.toUpperCase().toCharArray();//将要加密的原字符转为大写并转为字符数组
//第一种初始化方式,利用unicode编码转换,A-Z对应数字65-90
//外层循环,表示数组行数
for (int row = 0; row < 26; row++) {
//每一行的偏移量
int offset = offsets[row];
for (int col = 0; col < 26; col++) {
/*for (int row = 0; row < 26; row++) {
//每一行的偏移量
int offset = offsets[row];
for (int col = 0; col < 26; col++) {
int index = col + offset;
if (index >= 26) {