含義
仿射加密法與單碼加密法沒什麼不同,因為明文的每個字母分別只映射到一個密文字母。仿射密碼的加密算法就是一個線性變換,即對任意的明文字元x,對應的密文字元為
,其中,a,b∈Z
26,且要求gcd(a,26)=1,函式e(x)稱為仿射加密函式。
注意事項
注1. 仿射加密函式要求gcd(a,26)=1,即要求a和26互素,否則
就不是一個單射函式。
注2. 從仿射加密函式的表達式易知,當a=1,b=3時,這種仿射密碼就是著名的凱撒密碼。
注3. 在求解仿射解密函式時,需要求a在Z
26上的乘法逆元
a-1∈
Z26,這可由
擴展歐幾里得算法求解,下表列出了在Z
26上所有與26互素元素的乘法逆元:1-1 | 3-1 | 5-1 | 7-1
| 9-1 | 11-1 | 15-1 | 17-1 | 19-1 | 21-1 | 23-1 | 25-1 |
1 | 9 | 21 | 15 | 3 | 19 | 7 | 23 | 11 | 5 | 17 | 25 |
舉例
設仿射加密函式是
,由上表知:11
-1mod(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;
}
}
運行結果: