含義
仿射加密法與單碼加密法沒什麼不同,因為明文的每個字母分別只映射到一個密文字母。仿射密碼的加密算法就是一個線性變換,即對任意的明文字元x,對應的密文字元為 ,其中,a,b∈Z且要求gcd(a,26)=1,函式e(x)稱為仿射加密函式。
注意事項
注1. 仿射加密函式要求gcd(a,26)=1,即要求a和26互素,否則 就不是一個單射函式。
注2. 從仿射加密函式的表達式易知,當a=1,b=3時,這種仿射密碼就是著名的凱撒密碼。
注3. 在求解仿射解密函式時,需要求a在Z上的乘法逆元 a ∈ Z這可由擴展歐幾里得算法求解,下表列出了在Z
1 | 3 | 5 | 7 | 9 | 11 | 15 | 17 | 19 | 21 | 23 | 25 |
1 | 9 | 21 | 15 | 3 | 19 | 7 | 23 | 11 | 5 | 17 | 25 |
舉例
設仿射加密函式是 ,由上表知:11 mod(26)=19,所以相應的仿射解密函式是 。
若加密明文是"sorcery",首先把明文每個字母轉換為數字18,14,17,2,4,17,24。然後對明文進行加密,得密文為"welcylk"。
程式
#include<iostream>//仿射加密,sorcery --> welcylk
using namespace std;
#include<string.h>
int FsJiami(char s[])
{
int i=0;
int a[99];
char *p=s;
while(*p!="\0")
{
a[i]=s[i]-'a'; // 字元轉換為數字
a[i]=(11*a[i]+6)%26;// 仿射加密函式
s[i]=a[i]+'a'; // 數字轉換為字元
i++;
p++;
}
return 1;
}
int FsJiemi(char s[])
{
int i=0;
int a[99];
char *p=s;
while(*p!="\0")
{
a[i]=s[i]-'a'; // 字元轉換為數字
a[i]=(19*a[i]+16)%26;// 仿射解密函式
s[i]=a[i]+'a'; // 數字轉換為字元
i++;
p++;
}
return 1;
}
void main()
{
char s[99];int i;
gets(s);
FsJiami(s);
cout<<"加密後為:";
for(i=0;i<7;i++)
{
cout<<s[i];
if((i+1)%7==0) cout<<endl;
}
FsJiemi(s);
cout<<"解密後為:";
for(i=0;i<7;i++)
{
cout<<s[i];
if((i+1)%7==0) cout<<endl;
}
}
運行結果: