---
# System prepended metadata

title: 密碼學-古典密碼

---

# 密碼學-古典密碼

###### 報告者 : 20507 吳佑賢

## :books: 密碼學簡介
> 密碼學可以分為古典密碼與現代密碼，兩者以不同加密方式作為區分
> 相較於加密於二進為形式的現代密碼，古典密碼是直接作用在字母上 

## :books: 古典密碼分類
- 替換式密碼(Substitution cipher)
   - Caesar cipher
   - Affine cipher
   - Vigenere cipher
- 轉置式密碼(Transposition cipher)
   - Route cipher
   - Columnar transposition
   - Scytale 

## :open_book: 仿射密碼 ( Affine cipher )
原理 : 將原文做 ax+b (mod n) 的運算加密至密文
> n 為自訂字母集之長度
> a 與 n 必須互質

### 加密程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
	
    int x,y,m;
    cin >> x >> y >> m;
	
    for(int i=2;i<=x;i++)
    {
        if((x%i==0)&&(m%i==0))
        {
        	return 0; //檢查 x 與 m 是否互質 
        }
    }
    string p;
    cin >> p;    
    
    for(int i=0;i<p.size();i++)
    {
        int t = p[i] - 65;

        t *= x ;
        t += y ;
		
        while(t >= 26)
        {
            t %= 26;
        }
        cout << char(65 + t) ;    
    }
	
    return 0;
}
```
### 解密程式碼
```cpp=
#include<iostream>
using namespace std;

int main(){
	
    int x,y,m;
    cin >> x >> y >> m;
	
    for(int i=2;i<=x;i++)
    {
       if((x%i==0)&&(m%i==0))
       {
           return 0; //檢查 x 與 m 是否互質 
       }
    }
    
    char p[m] = {0};  
    for(int i=0;i<m;i++)
    {
        int t = i;
        t *= x ;
        t += y ;
		
        while(t >= 26)
        {
            t %= 26;
        }
        p[i] = t;
    } //創造一個經過仿射密碼後的字母集P 
	
    string c;
    cin >> c;    
    
    for(int i=0;i<c.size();i++)
    {
        int t = c[i] - 65;
        for(int j=0;j<m;j++)
        {
        	if(t==p[j]) //對照字母集P解讀出原文並輸出 
                {
    		    cout << char(65 + j);
                }
        }
    	
    }
    return 0;
}
```