替換加密、解密算法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM