古典密碼加密解密之多表代換 -开发者知识库

古典密碼加密解密之多表代換 -开发者知识库,第1张

 

多表代換密碼首先將明文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]&));
            }    
        }        
    }

}

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复