owned this note
owned this note
Published
Linked with GitHub
# 古典密碼學
## 簡介
密碼學是一門研究如何保護信息安全的學科,主要包含加密技術、解密技術、訊息驗證及金鑰管理等領域。密碼學的目標是確保機密性、完整性、身份驗證和不可否認性。
## 凱薩密碼
* 將字母一固定為依加密
* 優點
* 簡單易實作:只需固定位移量即可加密
* 運算速度快:加密和解密只需進行位移計算
* 缺點
* 極易破解:僅有 25 種可能的密鑰,可以暴力破解。
* 易受頻率分析攻擊:由於字母的相對順序不變,攻擊者可以透過常見字母頻率
### Code
加密
```cpp=
#include<bits/stdc++.h>
using namespace std;
string casar(string text,int shift,int dir){
if(dir<0) shift=26-shift;
string ans="";
for(char c : text){
if(isalpha(c)){
char base=isupper(c)? 'A' : 'a';
ans+=(c-base+shift)%26+base;
}
else ans+=c;
}
return ans;
}
```
解密
```cpp=
#include<bits/stdc++.h>
using namespace std;
string key(string text,int shift,int dir){
if(dir>0)return casar(text,26-shift,-dir);
else return casar(text,shift,-dir)
}
```
## 維吉尼亞密碼
* 利用關鍵字進行多表替換,加強安全性
* 優點
* 適用於較長文本:使用關鍵字來變化加密方式,增強安全性
* 缺點
* 如果關鍵字過短,仍然容易被破解 : 透過卡西斯基檢驗找到重複模式後可以破解。
* 需要記住關鍵字:比起單一位移,需記住更長的密鑰
### Code
加密
```cpp=
#include<bits/stdc++.h>
using namespace std;
string extend(string text,string key){
string extendkey="";
int keylen=key.size();
for(int i=0; i<text.size(); i++)
extendkey+=key[i%keylen];
return extendkey;
}
string encrypt(string text,string key){
string ans="";
key=extend(text,key);
for(int i=0; i<text.size(); i++){
if(isalpha(text[i])){
char base=isupper(text[i])? 'A' : 'a';
ans+=(text[i]-base+(key[i]-base))%26+base;
}
else ans+=text[i];
}
}
```
解密
```cpp=
#include<bits/stdc++.h>
using namespace std;
string decrypt(string text, string key){
string ans="";
key=extend(text, key);
for(int i=0;i<text.size();i++){
if(isalpha(text[i])){
char base=isupper(text[i])? 'A' : 'a';
ans+=(text[i]-base-(key[i]-base)+26)%26+base;
}
else ans+=text[i];
}
return ans;
}
```
### 補充-卡西斯基檢驗
#### 破解原理
1.尋找密文中重複的字母序列
* 例如密文:RIJVS UYVJN RIJVS,發現 RIJVS 重複出現。
2.記錄這些重複字串的間距
* 例如,RIJVS 出現在密文的第 1 和 11 個位置,間距為 10。
* 假設還有其他重複字串,間距可能是 5, 10, 15...。
3.找出這些間距的 最大公因數 (GCD)
* 如果這些間距的最大公因數為 5,那麼關鍵字長度很可能是 5。
4.將密文拆分為多組單獨的凱撒密碼進行破解
* 一旦知道關鍵字長度,將密文分成 5 組,然後對每組單獨執行**頻率分析攻擊**,破解凱撒密碼。
## 單表代換密碼
* 單表代換密碼是固定對應關係的替換密碼,每個字母都被唯一對應到另一個字母。不同於凱撒密碼的固定位移,單表代換的對應關係可以是任意排列,因此比凱撒密碼更難破解。
* 優點
* 增加混淆性:攻擊者無法輕易知道加密規則。
* 缺點
* 仍然受頻率分析攻擊影響:每個字母的對應關係固定,因此可以根據字母出現頻率進行破解。
* 密鑰需要儲存與管理:如果對應表洩漏,加密內容將不再安全。
### Code
創建映射表
```cpp=
#include<bits/stdc++.h>
using namespace std;
unordered_map<char, char> graph(string src, string target){
unordered_map<char, char> mapping;
for(int i=0; i<src.size(); i++){
mapping[src[i]]=target[i];
mapping[tolower(src[i])]=tolower(target[i]);
}
return mapping;
}
```
加密
```cpp=
string encrypt(string text,unordered_map<char, char> &encryptmap){
string ans="";
for(char c : text)
ans+=encryptmap.count(c)? encryptmap[c] : c;
return ans;
}
```
解密
```cpp=
string decrypt(string text,unoudered_map<char,char> &decryptmap){
string ans="";
for(char c : text)
ans+=decryptmap.count(c)? decryptmap[c] : c;
return ans;
}
```
### 結論
古典密碼學已不再安全,但它是現代密碼學的起點,為今日的資訊安全技術奠定了堅實的基礎。