换位密码算法方案,又称为置换加密方案,其根据一定的规则重新安排明文字母,使之成为密文。换位密码是最简单的密码学算法。
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 退出程序!