替換加密解密算法方案的起源可以追溯到凱撒(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 退出程序!