仿射加密法

單碼加密法的另一種形式稱為仿射加密法(affine cipher)。在仿射加密法中,字母表的字母被賦予一個數字,例如a=0,b=1,c=2…z=25。仿射加密法的密鑰為0-25直接的數字對。

基本介紹

  • 中文名:仿射加密法
  • 外文名:affine cipher
  • 英文:affine cipher
  • 例如:a=0,b=1,c=2
含義,注意事項,舉例,程式,

含義

仿射加密法與單碼加密法沒什麼不同,因為明文的每個字母分別只映射到一個密文字母。仿射密碼的加密算法就是一個線性變換,即對任意的明文字元x,對應的密文字元為
,其中,a,b∈Z26,且要求gcd(a,26)=1,函式e(x)稱為仿射加密函式。

注意事項

注1. 仿射加密函式要求gcd(a,26)=1,即要求a和26互素,否則
就不是一個單射函式。
注2. 從仿射加密函式的表達式易知,當a=1,b=3時,這種仿射密碼就是著名的凱撒密碼。
注3. 在求解仿射解密函式時,需要求a在Z26上的乘法逆元a-1Z26,這可由擴展歐幾里得算法求解,下表列出了在Z26上所有與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;
}
}
運行結果:

相關詞條

熱門詞條

聯絡我們