您的位置:首页 > 其它

换位加密、解密算法

2015-05-20 16:30 288 查看
换位密码算法方案,又称为置换加密方案,其根据一定的规则重新安排明文字母,使之成为密文。换位密码是最简单的密码学算法。

1. 换位加密、解密算法

换位加密解密的算法有很多种,这里介绍基于二维数组移位的换位加密、解密算法。二维数组移位的换位加密、解密算法即将明文字符串按照一个给定的顺序保存在二维数组中,然后按照另外一个顺序读出,便的到密文。执行相反的过程便可以恢复出明文。

1)换位加密算法

基于二维数组移位的加密算法的操作步骤如下:

(1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数。

(2)将明文字符串按行依次排列到该二维数组中。

(3)按列读出该二维数组中的字符,这样便得到密文。

可以根据此思路来编写相应的加密算法,代码示例如下:

/**
* 加密算法
* @param str 明文
* @param n    指定的二维数组的列数
* @return
*/
static char[] jiami(char[] str,int n){
int len,d,i,j,m;
char[] temp,miwen;
len=str.length;
if((d=len%n)!=0){
len = len + n-d;
}
temp = new char[len];
m=len/n;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i*n+j<str.length){
temp[i+m*j]=str[i*n+j];
}else{
temp[i+m*j]=' ';
}
}
}
while(temp[len-1]==' '){
len--;
}
miwen = new char[len];
for(i=0;i<len;i++){
miwen[i]=temp[i];
}
return miwen;
}


2)换位解密算法

基于二维数组移位的解密算法的操作步骤如下:

(1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数。这个数应该和加密算法中的一致。

(2)将密文字符串按列一次排列到该二维数组中。

(3)按行读出该二维数组中的字符,这样便得到明文。

可以根据此思路来编写相应的解密算法,代码示例如下:

/**
* 解密算法
* @param miwen 密文
* @param n    指定的二维数组的列数(与加密算法相同)
* @return
*/
static char[] jiemi(char[] miwen,int n){
int len,d,i,j,m;
char[] temp,str;
len=miwen.length;
if((d=len%n)!=0){
len = len + n-d;
}
temp = new char[len];
m=len/n;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(i*m+j<miwen.length){
temp[i+j*n]=miwen[i*m+j];
}else{
temp[i+n*j]=' ';
}
}
}
while(temp[len-1]==' '){
len--;
}
str = new char[len];
for(i=0;i<len;i++){
str[i]=temp[i];
}
return str;
}


2. 换位加密、解密算法实例

完整的程序代码示例如下:

package com.cn.mimaxue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class JiaMiJieMi {
/**
* 加密算法
* @param str 明文
* @param n    指定的二维数组的列数
* @return
*/
static char[] jiami(char[] str,int n){
int len,d,i,j,m;
char[] temp,miwen;
len=str.length;
if((d=len%n)!=0){
len = len + n-d;
}
temp = new char[len];
m=len/n;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i*n+j<str.length){
temp[i+m*j]=str[i*n+j];
}else{
temp[i+m*j]=' ';
}
}
}
while(temp[len-1]==' '){
len--;
}
miwen = new char[len];
for(i=0;i<len;i++){
miwen[i]=temp[i];
}
return miwen;
}
/**
* 解密算法
* @param miwen 密文
* @param n    指定的二维数组的列数(与加密算法相同)
* @return
*/
static char[] jiemi(char[] miwen,int n){
int len,d,i,j,m;
char[] temp,str;
len=miwen.length;
if((d=len%n)!=0){
len = len + n-d;
}
temp = new char[len];
m=len/n;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(i*m+j<miwen.length){
temp[i+j*n]=miwen[i*m+j];
}else{
temp[i+n*j]=' ';
}
}
}
while(temp[len-1]==' '){
len--;
}
str = new char[len];
for(i=0;i<len;i++){
str[i]=temp[i];
}
return str;
}

public static void main(String[] args) throws IOException{
char[] str,miwen,jiemi;
int n,i;
String go;
Scanner input = new Scanner(System.in);
do{
System.out.print("请输入指定的二维数组的列数:");
n = input.nextInt();
System.out.print("请输入明文:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strtemp=br.readLine();
str=strtemp.toCharArray();
System.out.print("明文为:");
for(i=0;i<str.length;i++){
System.out.print(str[i]);
}
System.out.println();
miwen=jiami(str,n);
System.out.print("密文为:");
for(i=0;i<miwen.length;i++){
System.out.print(miwen[i]);
}
System.out.println();
jiemi=jiemi(miwen,n);
System.out.print("解密为:");
for(i=0;i<jiemi.length;i++){
System.out.print(jiemi[i]);
}
System.out.println();
System.out.print("是否继续(y/n):");
go = input.next();
}while(go.equalsIgnoreCase("y"));
System.out.println("退出程序!");
}
}


程序运行结果如下:

请输入指定的二维数组的列数:4
请输入明文:Hello everyone!
明文为:Hello everyone!
密文为:Hoene reley!lvo
解密为:Hello everyone!
是否继续(y/n):y
请输入指定的二维数组的列数:5
请输入明文:You are very good!
明文为:You are very good!
密文为:Yrrooeydu  ! vg aeo
解密为:You are very good!
是否继续(y/n):n
退出程序!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: