古典密碼加密解密之多表代換


 

多表代換密碼首先將明文M 分為由n 個字母組成的分組, , … ,對每個分組的加密為
≡ + ( ), = , , …
其中,(A,B)是密鑰,A 是 × 的可逆矩陣,滿足gcd(|A|,N)=1,( |A|是A 的行列式), = (, , … ), =
(, , … ), = (, , … ),對密文的解密為
≡ −( − )( ), = , , …

java實現多表代換加密

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Mangboot {
    private static Map<Integer, String> maps = new HashMap<Integer,String>();
    public static int getKey(Map map,String value){
        int key = 0;
        Iterator it  = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry entry = (Entry) it.next();
            Object obj = entry.getValue();
            if(obj!=null&&obj.equals(value)){
                key=(int)entry.getKey();
            }
        }
        return key;
    }
    /**
     * 對字符和數字進行一一映射
     */
    public static void fuzhi(){
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        for(int i=0;i<str.length();i++){
            maps.put(i, str.substring(i,i+1));
        }
        
    }
    /**
     * 加密的主要算法
     * @param a  輸入的A矩陣(密鑰)
     * @param d  需要加密的密文轉換后的矩陣
     * @param c  保存加密后的結果
     * @param b  矩陣B(密鑰)
     * @param n  矩陣的維數
     */
    public static void addmatrixMultiply(int[][]a,int [][]d,int [][]c,int b[][],int n){
        for(int i=0;i<n;i++)
            for(int j = 0;j <1;j++){
                int sum = a[i][0]*d[0][j];
                for(int k = 1;k<n;k++)
                    sum +=a[i][k]*d[k][j];
                c[i][j] = sum+b[i][j];
            }
    }
         public static void main(String[] args) {
        fuzhi();
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入你要加密的明文:");
        String str = scanner.nextLine();
        System.out.println("請輸入密鑰");
        System.out.println("請輸入A矩陣的維數:");
        int n = scanner.nextInt();
        System.out.println("開始創建A矩陣:");
        int a[][] = new int[n][n];
        for(int i =0;i<n;i++){
            for(int j= 0;j<n;j++){
                a[i][j] = scanner.nextInt();
            }
        }
        System.out.println("開始創建B矩陣:");
        int b[][] = new int[n][1];
        int c[][] = new int[n][1];
        int d[][] = new int[n][1];
        for(int j= 0;j<n;j++){
            b[j][0] = scanner.nextInt();
        }
        System.out.println("獲得的密文為:");
        for(int i = 0;i<str.length()/n;i++){
            String sub = str.substring(i*n, (i+1)*n);
            for(int j= 0;j<n;j++){
                d[j][0] = getKey(maps, sub.substring(j, j+1));
            }
            addmatrixMultiply(a, d, c,b, n);
            for(int j= 0;j<n;j++){
                System.out.print(maps.get(c[j][0]%26));
            }    
        }        
    }

}

 

java實現多表代換解密

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Mangbootjiemi {
    private static Map<Integer, String> maps = new HashMap<Integer, String>();
    public static int getKey(Map map, String value) {
        int key = 0;
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Entry) it.next();
            Object obj = entry.getValue();
            if (obj != null && obj.equals(value)) {
                key = (int) entry.getKey();
            }
        }
        return key;
    }
    public static void fuzhi() {
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        for (int i = 0; i < str.length(); i++) {
            maps.put(i, str.substring(i, i + 1));
        }

    }
    public static void addmatrixMultiply(int[][] a, int[][] d, int[][] c, int b[][], int n) {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < 1; j++) {
                int sum = a[i][0] * d[0][j];
                for (int k = 1; k < n; k++)
                    sum += a[i][k] * d[k][j];
                c[i][j] = sum;
            }

    }
    public static void main(String[] args) {
        fuzhi();
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入你要解密的密文:");
        String str = scanner.nextLine();
        System.out.println("請輸入密鑰");
        System.out.println("請輸入A-1矩陣的維數:");
        int n = scanner.nextInt();
        System.out.println("開始創建A-1矩陣:");
        int a[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                a[i][j] = scanner.nextInt();
            }
        }
        System.out.println("開始創建B矩陣:");
        int b[][] = new int[n][1];
        int c[][] = new int[n][1];
        int d[][] = new int[n][1];
        for (int j = 0; j < n; j++) {
            b[j][0] = scanner.nextInt();
        }
        System.out.println("獲得的明文為:");
        for (int i = 0; i < str.length() / n; i++) {
            String sub = str.substring(i * n, (i + 1) * n);
            for (int j = 0; j < n; j++) {
                d[j][0] = getKey(maps, sub.substring(j, j + 1)) - b[j][0];
            }
            addmatrixMultiply(a, d, c, b, n);
            for (int j = 0; j < n; j++) {
            
                if (c[j][0]%26 < 0) {
                    System.out.print(   maps.get(( c[j][0]% 26) + 26));
                    
                }else
                
                System.out.print(maps.get(c[j][0] % 26));
            }
        }
    }
}


免責聲明!

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



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