仿射密碼(加法密碼+乘法密碼)

仿射密碼技術:

(加法密碼+乘法密碼)

(可先參見加法密碼與乘法密碼原理)


C= Ek(m)=(k1 m+k2) mod n , K1,K2∈Zn ,gcd(k1,n)=1
M= Dk(c)=k3(c- k2) mod n(其中k3爲k1逆元)
(1)0<k1<n
(2)k1與n互素,即要滿足gcd(k1, n)=1,否則不存在模逆元,不能正確解密
所以即滿足乘法密碼技術的要求,又滿足加法密碼的要求,如複合函數一般
K1 K2爲密鑰。當K1=0時,仿射密碼即爲乘法密碼技術,當K1=1時,即爲移位替換密碼(加法密碼)



乘法密碼的密碼空間大小是φ(n),φ(n)是歐拉函數。
當n爲26字母,則與26互素的數是1、3、5、7、9、11、15、17、19、21、23、25,即φ(n)=12 因此乘法密碼的密鑰空間爲12。
注意:K1=1時 加密變換爲恆等變換(即無變化)


測試案例如下:


import java.util.ArrayList;
import java.util.Scanner;


public class 仿射密碼技術 {


public static int x=0,y=0;
public static ArrayList<Integer> SecretPlace=new ArrayList();
public static int gcd(int a,int b){
return b>0?gcd(b,a%b):a;
}
public static int ex_gcd(int a,int b){
if(b==0)
   {
       x=1;y=0;
       return a;
   }
   int q=ex_gcd(b,a%b);
   int t=x;x=y;y=t-a/b*y;
   return q;
}
public static void CountSecretPlace(int n){
SecretPlace.add(1);
for(int i=2;i<n;i++){
if(gcd(i, n)==1)
SecretPlace.add(i);
}
}
public static void main(String[] args) {
int k1,k2=0;
Scanner scan=new Scanner(System.in);
System.out.println("第一行輸入密碼錶總數n\n"
+ "第二行輸入各明文字符\n"
+ "第三行輸入待加密明文");
int n=scan.nextInt();
char CharArrays[]=new char[n];
CharArrays=scan.next().toCharArray();
scan.nextLine();
String normalStr=scan.nextLine();
CountSecretPlace(n);
System.out.println("密鑰空間如下,您可選擇其中一個值作爲乘法密鑰K1");
System.out.println(SecretPlace);
k1=scan.nextInt();
while(!SecretPlace.contains(k1)){
System.out.println("只能選擇密鑰空間中的密鑰值!請重新選擇");
k1=scan.nextInt();
}
System.out.println("請選擇加法密鑰K2,0=<k2<n");
k2=scan.nextInt();
while(k2<0||k2>=n){
System.out.println("請重新選擇加法密鑰K2,0=<k2<n");
k2=scan.nextInt();
}
ex_gcd(k1, n);
int out=(x+n)%n;
System.out.println("您選擇的乘法密鑰模逆元爲:"+out);
String splitStrs[]=normalStr.split(" ");
ArrayList<Character> templist=new ArrayList<>();
System.out.println("加密後如下:");
for (int j = 0; j < splitStrs.length; j++) {
char normalChars[]=splitStrs[j].toCharArray();
for (int p = 0; p < normalChars.length; p++) {
int t=((normalChars[p]-'a')*k1+k2)%n;
normalChars[p]=CharArrays[t];//加密
System.out.print(normalChars[p]);
int tt=(t+n-k2)%n;
normalChars[p]=CharArrays[tt*out%n];//解密
templist.add(normalChars[p]);
}
System.out.print(" ");
templist.add(' ');
}
System.out.println("\n解密後如下:");
for(Character o:templist){
System.out.print(o);
}
}
}
運行結果如下:


第一行輸入密碼錶總數n
第二行輸入各明文字符
第三行輸入待加密明文
26
abcdefghijklmnopqrstuvwxyz
a man liberal in his views
密鑰空間如下,您可選擇其中一個值作爲乘法密鑰K1
[1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
1
請選擇加法密鑰K2,0=<k2<n
3
您選擇的乘法密鑰模逆元爲:1
加密後如下:
d pdq olehudo lq klv ylhzv 
解密後如下:
a man liberal in his views 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章