前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >古典密码加密解密之多表代换

古典密码加密解密之多表代换

作者头像
张泽旭
发布2018-12-10 16:41:02
1.3K0
发布2018-12-10 16:41:02
举报
文章被收录于专栏:张泽旭的专栏张泽旭的专栏

多表代换密码首先将明文M 分为由n 个字母组成的分组, , … ,对每个分组的加密为 ≡ + ( ), = , , … 其中,(A,B)是密钥,A 是 × 的可逆矩阵,满足gcd(|A|,N)=1,( |A|是A 的行列式), = (, , … ), = (, , … ), = (, , … ),对密文的解密为 ≡ −( − )( ), = , , …

java实现多表代换加密

代码语言:javascript
复制
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实现多表代换解密

代码语言:javascript
复制
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));
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档