# 二.內文 ## Affine cipher原理 Affine cipher(仿射密碼)是一種<font color=#FF0000>**替換式密碼**</font>,每種字母各自替換成其所對應的字母。 ### 加密 字母位置$x$先經由一次函式運算,再除以字母的數量取餘數,找出對應的字母。 $E(x)=(ax+b)$ mod $m$ *($m$為字母數量,$a$與$m$互質)* 以 $(5x+8)$ mod $26$ 為例: | 原始字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | |:------------:| - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | $x$ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 20| 21| 22| 23| 24| 25| |$(5x+8)$ mod $26$| 8 | 13| 18| 23| 2 | 7 | 12| 17| 22| 1 | 6 | 11| 16| 21| 0 | 5 | 10| 15| 20| 25| 4 | 9 | 14| 19| 24| 3 | | 加密字母 | I | N | S | X | C | H | M | R | W | B | G | L | Q | V | A | F | K | P | U | Z | E | J | O | T | Y | D | ### 解密 $D(x)=a^{-1}(x-b)$ mod $m$ 其中 $aa^{-1}$ mod $m=1$ 同樣使用上述例子(此處 $a^{-1}=21$): | 加密字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | |:------------:| - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | | $x$ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 20| 21| 22| 23| 24| 25| |$21(x-8)$ mod $26$| 14| 9 | 4 | 25| 20| 15| 10| 5 | 0 | 21| 16| 11| 6 | 1 | 22| 17| 12| 7 | 2 | 23| 18| 13| 8 | 3 | 24| 19| | 原始字母 | O | J | E | Z | U | P | K | F | A | V | Q | L | G | B | W | R | M | H | C | X | S | N | I | D | Y | T | ## C++程式碼 ```cpp= #include<iostream> using namespace std; int main(){ int a,b,i,n,j,a1; bool en; string z; cout<<"加密請輸入1,解密請輸入0:"; cin>>en; cout<<"輸入一段文字:"; getline(cin,z); getline(cin,z); cout<<"輸入兩整數a和b (a與26互質):"; cin>>a>>b; for(i=1;i<26;i++) if(a*i%26==1) a1=i; //找出解密用的a^-1 for(i=0;i<z.size();i++){ if(z[i]>='a'&&z[i]<='z'){ //第i-1個字元是小寫字母 n=z[i]-'a'; if(en) n=(a*n+b)%26; //加密 else{ n=(n-b)*a1%26; //解密 if(n<0) n+=26; } z[i]=n+'a'; } else if(z[i]>='A'&&z[i]<='Z'){ //第i-1個字元是大寫字母 n=z[i]-'A'; if(en) n=(a*n+b)%26; //加密 else{ n=(n-b)*a1%26; //解密 if(n<0) n+=26; } z[i]=n+'A'; } } if(en) cout<<"密文="; else cout<<"原文="; cout<<z<<endl; return 0; }
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up