[暗号化の原則と実践](4)バージニア暗号のJavaコード実装

ヴィジュネル暗号

ソースを転載してください

シフトパスワードでも置換パスワードでも、秘密鍵を選択すると、各文字に対応する番号が暗号化され、対応する一意の番号に変換されます。これを単一テーブルの置換パスワードと呼びます。この記事では、複数テーブルの置換パスワードについて説明します。

定義

mは正の整数とする、P = C = K =(Z定義26mは、と定義EのK(x 1、xは2を任意の秘密鍵Kため=(K 1、K 2、K 3 ... k個のmはX .3 ... X m)=(X .1 + K .1、X .3 + K 2 ... X m + K m)、およびD K(Y .1、Y 2 ... Y K)=(Y 1。 -k 1、Y 2 - K 2 ... Y M -k M

上記のすべての計算は、Z上で実行される26

前のアルファベットに対応して、各キーKは、キーワードと呼ばれる長さmの文字列に相当します。バージニア植民地のパスワードは、一度にm個の名前の文字を暗号化します。

バージニア暗号の鍵空間のサイズは26mであるため、mの値が小さくても、網羅的な鍵を使用するには長い時間がかかります。一般的に、複数のテーブル置換パスワードは、単一のテーブル置換パスワードよりも安全です。

栗をあげる

m = 6とすると、キーワードはCIPHERであり、これは次の数字列(2,8,15,7,4,17)に対応​​し、暗号化される平文は次のとおりです。エンコードとデコード、秘密鍵はmykey
ここに写真の説明を挿入

コード

package com.slp.cryptography;

/**
 * @ClassName VigenereCipher
 * @Description 维吉尼亚密码
 * @Author sanglp
 * @Date 2020/11/30 15:55
 * @Version 1.0
 **/
public class VigenereCipher {
    
    
    static int [] arr = {
    
    12,24,10,4,24};
    public static void main(String[] args) {
    
    
        encrypt("encodeanddecode");
        decrypt("QLMSBQYXHBQAYHC");
    }

    /**
     * 加密函数
     * @param resource
     */
    public static void encrypt(String resource){
    
    
        char [] souarr = resource.toUpperCase().toCharArray();
        int len = arr.length;//密钥串的长度
        StringBuilder result = new StringBuilder();
        for(int i=0;i<souarr.length;i++){
    
    
            int temp =(souarr[i]-'A'+arr[i%len])%26<0?(souarr[i]-'A'+arr[i%len])%26+26:(souarr[i]-'A'+arr[i%len])%26;
            result.append((char)('A'+temp));
        }
        System.out.println(result.toString());
    }

    /**
     * 解密函数
     * @param resource
     */
    public static void decrypt(String resource){
    
    
        char [] souarr = resource.toUpperCase().toCharArray();
        int len = arr.length;//密钥串的长度
        StringBuilder result = new StringBuilder();
        for(int i=0;i<souarr.length;i++){
    
    
            int temp =(souarr[i]-'A'-arr[i%len])%26<0?(souarr[i]-'A'-arr[i%len])%26+26:(souarr[i]-'A'-arr[i%len])%26;
            result.append((char)('A'+temp));
        }
        System.out.println(result.toString());
    }
}

おすすめ

転載: blog.csdn.net/weixin_51656605/article/details/110390664