換位加密、解密算法


換位密碼算法方案,又稱為置換加密方案,其根據一定的規則重新安排明文字母,使之成為密文。換位密碼是最簡單的密碼學算法。

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
退出程序!

 


免責聲明!

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



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