ヴィジュネル暗号
ソースを転載してください
シフトパスワードでも置換パスワードでも、秘密鍵を選択すると、各文字に対応する番号が暗号化され、対応する一意の番号に変換されます。これを単一テーブルの置換パスワードと呼びます。この記事では、複数テーブルの置換パスワードについて説明します。
定義
mは正の整数とする、P = C = K =(Z定義26)mは、と定義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());
}
}