zoukankan      html  css  js  c++  java
  • 信息安全--维吉利亚密码

    说明:

    这个可以直接看这个解释: 

    如果你要对自己的男(女)神用维密(不是维多利亚的秘密)表白,先写好明文:

    I LOVE YOU

    然后自己设定一个密钥,比如:KISS。
    这样密钥与明文对应就是

    K ISSK ISS
    I LOVE YOU

    对第一个字母 “I” 加密过程如下:
    先找到最左侧密钥 K 所在的一行和最上方明文 I 所在列,找到他们的相交字母 S ,这样 I 就被加密成了 S 。
    同理,这句话通过每一个对应密钥的加密后就变成如下

    密钥:KISSKISS
    明文:ILOVEYOU
    密文:STGNOGGM

    【原文链接】:
    知乎-维吉利亚密码原理是什么

    还有我们老师的 ppt 解释(真心简单):

    是一种多表移位替换密码:
    设d为一固定的正整数,d个移位替换表π=(π1,π2,…πd)由密钥序列K=(k1,k2,…,kd)给定;
    第 i+td 个明文字母由表 πi 决定,即密钥 ki 决定;
    ek(xi+td)= (xi+td+ki) mod q =y 
    dk(yi+td)= (yi+td-ki) mod q =x

    java 代码实现:

    package com.jiangbiao.firsthomework;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    /**
     * 维吉尼亚密码
     */
    public class VigenerePassword {
    
        public static final char[][] basicTable = new char[26][26];
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
    
            init();
            System.out.println("请输入密钥:");
            String key = input.nextLine();
            System.out.println("请输入明文:");
            String express = input.nextLine();
    
            String ciphertext = new String();
            ciphertext = encryptionOperation(express, key);
            System.out.println("加密结果如下:" + ciphertext);
        }
    
        /**
         * 维吉利亚字母表的初始化
         */
        public static void init(){
            System.out.println("维吉尼亚码表如下:");
            for (int i = 0; i < 26; i++){
                for (int j = 0; j < 26; j++){
                    basicTable[i][j] = (char)(((j + i) % 26 + 65));//65 = A
                    //打印
                    System.out.print(basicTable[i][j]);
                }
                System.out.println();
            }
        }
    
        /**
         * 加密过程
         * @param express
         * @param key
         * @return
         */
        public static String encryptionOperation(String express, String key){
            //对明文进行去除空格,转小写操作  |注:trim()只是去掉首位空格
            String express2 = express.toLowerCase().replaceAll(" ", "");
            System.out.println("express2 : " + express2);
            //若密钥长度小于明文长度,重复密钥
            StringBuffer keys = new StringBuffer("");
            String keyDouble = new String();
            if (key.length() < express2.length()){
               for (int i=0; i<express2.length() / key.length() + express2.length() % key.length(); i++){
                   keys = keys.append(key);
               }
               //重复操作处理后的密钥,并进行切分,使长度与明文长度一致
               keyDouble = keys.toString().substring(0, express2.length());
            }
        System.out.println("处理后的密钥:" + keyDouble);
            int i = 0;
            int j = 0;
            char[] keyDoubleChar = keyDouble.toCharArray();
            char[] express2Char = express2.toUpperCase().toCharArray();
            List<Character> ciphertextL = new ArrayList<>();
            for (int m = 0; m < express2.length(); m++){
                for (int n = 0; n < 26; n++){
                    if (express2Char[m] == basicTable[0][n]){
                        i = n;
                        System.out.print("  " + "i:" + i + " " + basicTable[0][n]);
                    }
                    if (keyDoubleChar[m] == basicTable[n][0]){
                        j = n;
                        System.out.print("  " + "j:" + j + " " + basicTable[n][0]);
                    }
                }
                System.out.println();
                ciphertextL.add(basicTable[i][j]);
                i = 0;
                j = 0;
            }
    
            return ciphertextL.toString()
                    .substring(1, ciphertextL.toString().length()-1)
                    .replaceAll(", ", "");
        }
    
    }
    /**
         * 示例1:
         请输入密钥:
         RADIO
         请输入明文:
         p olyal p ha betic cipher
         express2 : polyalphabeticcipher
         处理后的密钥:RADIORADIORADIORADIO
         i:15 P  j:17 R
         j:0 A  i:14 O
         j:3 D  i:11 L
         j:8 I  i:24 Y
         i:0 A  j:14 O
         i:11 L  j:17 R
         j:0 A  i:15 P
         j:3 D  i:7 H
         i:0 A  j:8 I
         i:1 B  j:14 O
         i:4 E  j:17 R
         j:0 A  i:19 T
         j:3 D  i:8 I
         i:2 C  j:8 I
         i:2 C  j:14 O
         i:8 I  j:17 R
         j:0 A  i:15 P
         j:3 D  i:7 H
         i:4 E  j:8 I
         j:14 O  i:17 R
         加密结果如下:GOOGOCPKIPVTLKQZPKMF
         */
    
        /**
         * 示例2:
         请输入密钥:
         KISS
         请输入明文:
         I LOVE YOU
         express2 : iloveyou
         处理后的密钥:KISSKISS
         i:8 I  j:10 K
         j:8 I  i:11 L
         i:14 O  j:18 S
         j:18 S  i:21 V
         i:4 E  j:10 K
         j:8 I  i:24 Y
         i:14 O  j:18 S
         j:18 S  i:20 U
         加密结果如下:STGNOGGM
         */
  • 相关阅读:
    28.注解2.md
    29.Junit测试框架.md
    WCF学习笔记(2)-WCF的通讯过程
    WCF学习笔记(1)-一个完整的例子
    Sql2008事务日志已满处理
    面向对象六大原则
    计算机基础(1)-原码、反码、补码
    Spring.Net学习笔记(7)-事务
    Spring.Net学习笔记(6)-方法注入
    Spring.Net学习笔记(5)-集合注入
  • 原文地址:https://www.cnblogs.com/zishu/p/8650202.html
Copyright © 2011-2022 走看看