# 密碼學-古典密碼 ###### 報告者 : 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; } ```