---
# System prepended metadata

title: 二.內文

---

# 二.內文

## 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;
} 