仿射加密法

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

含義

仿射加密法 仿射加密法

仿射加密法與單碼加密法沒什麼不同,因為明文的每個字母分別只映射到一個密文字母。仿射密碼的加密算法就是一個線性變換,即對任意的明文字元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上的乘法逆元 aZ這可由擴展歐幾里得算法求解,下表列出了在Z

1357
911151719212325
1921153197231151725

舉例

仿射加密法 仿射加密法
仿射加密法 仿射加密法

設仿射加密函式是 ,由上表知: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;

}

}

運行結果:

仿射加密法 仿射加密法

相關詞條

熱門詞條

聯絡我們