替换加密解密算法方案的起源可以追溯到凯撒(Caesar)时代,据说凯撒为了保障情报的可靠性而发明了凯撒密码。凯撒密码是一种简单的置换密码,在加密时,字母表中的每个字母都用其后的第三个字母表示,例如,a用d表示,b用e表示,......。在解密时,只需要执行逆过程即可。
1. 替换加密、解密算法
随这历史的发展,替换密码算法方案已具有很多种形式,主要有以下几种:
- 单表代替密码算法方案
- 同音代替密码算法方案
- 多表代替密码算法方案
- 多字母组代替密码算法方案
下面以单表代替密码算法方案为例进行介绍。
1)替换加密算法
替换加密算法的基本方法是首先给定一个密钥n,对应明文中的每一个字符的ASCII码都向后移动n而得到相应的密文。
按照此思路来编写相应的加密算法,代码示例如下:
/** * 加密算法 * @param str 明文字符串 * @param n 明文中每个ASCII码向后移动的位数,即密钥 * @return */ static char[] jiami(char[] str,int n){ int i,len; char[] miwen; len=str.length; miwen=new char[len]; //申请内存 for(i=0;i<len;i++){ miwen[i]=(char)(str[i]+n); } return miwen; }
2)替换解密算法
替换解密算法的基本方法是首先给定一个密钥n,这个密钥必须和加密时的密钥一致,对应密文中的每一个字符的ASCII码都向前移动n而得到相应的明文。
按照此思路来编写相应的加密算法,代码示例如下:
/** * 解密算法 * @param miwen 密文字符串 * @param n 密文中每个ASCII码向前移动的位数,应与加密算法向后移动位数相同 * @return */ static char[] jiemi(char[] miwen,int n){ int i,len; char[] str; len=miwen.length; str=new char[len]; //申请内存 for(i=0;i<len;i++){ str[i]=(char)(miwen[i]-n); } 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 THJMJM { /** * 加密算法 * @param str 明文字符串 * @param n 明文中每个ASCII码向后移动的位数,即密钥 * @return */ static char[] jiami(char[] str,int n){ int i,len; char[] miwen; len=str.length; miwen=new char[len]; //申请内存 for(i=0;i<len;i++){ miwen[i]=(char)(str[i]+n); } return miwen; } /** * 解密算法 * @param miwen 密文字符串 * @param n 密文中每个ASCII码向前移动的位数,应与加密算法向后移动位数相同 * @return */ static char[] jiemi(char[] miwen,int n){ int i,len; char[] str; len=miwen.length; str=new char[len]; //申请内存 for(i=0;i<len;i++){ str[i]=(char)(miwen[i]-n); } return str; } public static void main(String[] args) throws IOException { char[] str,miwen,jiemi; int n,i; String go; System.out.println("替换加密解密算法演示!"); 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! 密文为:Lipps$iziv}sri% 解密为:Hello everyone! 是否继续(y/n):y 请输入替换加密解密算法的密钥:3 请输入明文:One world, One dream! 明文为:One world, One dream! 密文为:Rqh#zruog/#Rqh#guhdp$ 解密为:One world, One dream! 是否继续(y/n):n 退出程序!