# **CyberSecurity**
###### tags: `CyberSecurity`,`OSC`
:::success
### Table of Content
[TOC]
:::
### 基礎密碼學
#### 要件
- **機密性(Confidentiality)**
> 確保訊息只有被授權者才能取得
- **完整性(Integrity)**
> 偵測訊息是否遭受竄改
- **身分認證(Authentication)**
> 傳送方與接受方需驗證識別
- **不可否認性(Non-Reputation)**
> 提供訊息傳送方與接受方的交易證明
#### 分類
- **對稱式加密(Symmetric Encryption)**
- 傳送方與接收方的加解密皆使用同一把密鑰
> 這把密鑰同時擁有加密&解密兩種功能
- 優點:簡單、方便
- 缺點:不安全
> 密鑰在第一次傳送時,被中間人攔截且複製,再原封不動傳給接收方,那之後所有攔截到的加密訊息,都能被輕易破解

- **非對稱式加密(Asymmetric Encryption)**
- 非對稱式加密就是使用者都擁有一對密鑰:公開金鑰(Public key)及私密金鑰(Private key),加密解密過程中必須是完整一對的(pair)
> 公鑰:能被廣泛的發佈與流傳
> 密鑰:必須被妥善的保存
- 傳送方與接收方在傳送之前,先把公鑰傳給對方,當傳送方要傳送時,就用接收方的公鑰將訊息加密,接收方收到加密訊息後,再用自己的密鑰解開,因此第三方無法讀去加密後的訊息
- Double Confirm:數位簽章(Digital Signature)
> - 傳送方除了使用接收方的公鑰加密外,也使用自己的私鑰對該封加密訊息的Hash簽名
> - 類似於現實生活中的蓋手印(?
> - 這樣除了加、解密外,有確認傳送方身分的機制

#### References
- [密碼學](https://zh.wikipedia.org/wiki/密码学)
- [對稱式加密](https://zh.wikipedia.org/wiki/對稱密鑰加密)
- [非對稱式加密](https://zh.wikipedia.org/wiki/公开密钥加密)
- [數位簽章](https://zh.wikipedia.org/wiki/數位簽章)
### 編碼
#### Morse code
- 時通時斷的訊號代碼
- 組成
- 點(·):1
- 劃(-):111
- 字元內部的停頓(在點和劃之間):0
- 字元之間的停頓:000
- 單詞之間的停頓:0000000
- 對照表:
- Alphabet

- Number

- Symbol

#### ASCII
- 基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語
- 組成
- 數字(0~127)
- 分類/對照表
- 控制字元
- 代表數字:0~31、127


- 顯示字元
- 代表數字:32~126


#### Big5
- 繁體中文中最常用的電腦漢字字元集標準
- 分類

- 查碼表
- [click here](http://web.tnu.edu.tw/me/study/moodle/tutor/vb6/tutor/r05/index.htm)
#### UTF-8
- 一種針對Unicode的可變長度字元編碼,也是一種字首碼,是全球資訊網的最主要的編碼形式,因而成為XML檔案和HTML檔案的預設編碼方式
- 分類

#### References
### 演算法
#### RSA
- Design By:
- 羅納德·李維斯特(**R**on Rivest)
- 阿迪·薩莫爾(**A**di Shamir)
- 倫納德·阿德曼(**L**eonard Adleman)
- Info:
- 非對稱式加密演算法
- 在公開金鑰加密和電子商業中被廣泛使用
- 極大整數做因數分解的難度決定了 RSA 演算法的可靠性(對一極大整數做因數分解愈困難,RSA 演算法愈可靠)
- 攻與防:
- 攻:
- 短的 RSA 鑰匙
- 快速因數分解的演算法
- 量子電腦(?
- 防:
- 只要其鑰匙的長度足夠長,用RSA加密的訊息實際上是不能被破解的
- Operation
- 公/私鑰產生:
1.隨意選擇兩個大的質數 **p** 和 **q** , 計算 **N**
> - **p ≠ q**
>
> - 
2.根據歐拉函數,求得 **r**
> - 
3.選擇一個小於 **r** 的整數 **e** , 並求得 **e** 關於 **r** 的模反元素 **d** (, 模反元素存在,若且唯若 e 與 r 互質)
> - **e** 與 **r** 互質
>
> - 令 
4.將 p 和 q 的記錄銷毀
> - **( N , e )** 是公鑰 , **( N , d )** 是私鑰
>
> - 愛麗絲將她的公鑰傳給鮑伯,而將她的私鑰藏起來
- 加密訊息:
假設鮑伯想給愛麗絲送一個訊息 **m** ,他知道愛麗絲產生的 **N** 和 **e** 。他使用起先與愛麗絲約好的格式將 **m** 轉換為一個小於 **N** 的非負整數 **n** ,比如他可以將每一個字轉換為這個字的`Unicode碼`,然後將這些數字連在一起組成一個數字。假如他的訊息非常長的話,他可以將這個訊息分為幾段,然後將每一段轉換為 **n** 。

鮑伯算出 **c** 後就可以將它遞移給愛麗絲就可以傳訊息給愛麗絲了
- 解密訊息
愛麗絲得到鮑伯的訊息 **c** 後就可以利用她的私鑰 **d** 來解碼

接著將訊息 **m** 還原

已知  ,即 

- 若 **n** 與 **N** 互質,則由歐拉定理得

- 若 **n** 與 **N** 不互質,則不失一般性考慮  及 


> 得證 
- 概念圖

#### ROT13
- Info
- 一種簡易的替換式密碼 , 常被論壇用來規避系統文字檢查
- 常常被當作弱加密範例的典型
- Operations:
- 僅僅只需要檢查字元字母順序並取代它在13位之後的對應字母 , 超過時則重新繞回26英文字母開頭即可
- 對照表

- 簡單範例程式 (C++)
```cpp=
#include<bits/stdc++.h>
#define orz ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define ll long long
using namespace std;
signed main(){
orz;
string input;
ll len,x;
while(getline(cin,input)){
len=input.size();
for(x=0;x!=len;x++){
if(isalpha(input[x])){
if(input[x]>='a'&&input[x]<='z'){
cout<<char(int(input[x]-'a'-12)>0?input[x]-13:input[x]+13);
}
else{
cout<<char(int(input[x]-'A'-12)>0?input[x]-13:input[x]+13);
}
}
else{
cout<<input[x];
}
}
cout<<'\n';
}
}
```
#### Vigenère cipher
- Design by:
- 最早記錄是吉奧萬·巴蒂斯塔·貝拉索( Giovan Battista Bellaso)發明的,但被誤傳是法國外交官布萊斯·德·維吉尼亞(Blaise De Vigenère)所創造,因此命名為維吉尼亞密碼
- Info:
- 使用一系列凱撒密碼組成密碼字母表的加密算法,屬於多表密碼的一種簡單形式
- 簡單易用,有點難被破解
- Element:
- 明文:原始訊息
- 密鑰:加密元素
- 密文:加密訊息
- Operations:
- 想法1:查表對照法
1. 加密:依序將明文及密鑰依序列做對照、查表
2. 解密:步驟相反(查表後對照密鑰及明文)

- 想法2:數學邏輯法
- 用數字0-25代替字母A-Z , 以同餘的形式完成加/解密
1. 加密: 
2. 解密: 
#### References
- [RSA algorithm](https://en.wikipedia.org/wiki/RSA_(cryptosystem))
- [ROT13](https://en.wikipedia.org/wiki/ROT13)
- [Vigenère ciphe](https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher)