repkironca
I was born again because of love, but died of the same reason.
密碼學講師自己找
看!活的小丑!
實際上好像也沒什麼好寫的.jpg
-蘇昱亘,最後那個字是ㄒㄩㄢ
-Repkironca、RE、小丑、自動打 WA 機
- 講話不知道在快幾點的,記得打斷我
-華鯊公約擁護者,整份簡報都在廚
-不管你是要問問題,或單純無聊都可以來 OWO
https://hackmd.io/@Repkironca/Hkg2geC5q
前言
古典密碼
計算機概論
編碼
對稱式加密
非對稱式加密
密鑰交換
密碼學應用
希望講師今天不要過勞死
總之我們開始吧:)
你有想過...密碼學到底是什麼嗎?
202207220149
27ckefgisc28
27CkeFGisC28
21tsTo0WeaK7
2@CkeFGisc@8
~2CkeFGisc8~
但我還是要傳教
Nice meme, 30 days ban
其實匿名者不是駭客組織
- 跟一大堆數學
-竊聽,Eavesdrop
-竄改,Falsification
-電子欺騙,Spoofing
-抵賴,Repudiation
for (int i = 0; i < 4; i++){
girlfrernds_of_ginger.push_back(element[i]);
}
-竊聽,Eavesdrop
-竄改,Falsification
-電子欺騙,Spoofing
-抵賴,Repudiation
-竊聽,Eavesdrop
-竄改,Falsification
-電子欺騙,Spoofing
-抵賴,Repudiation
-竊聽,Eavesdrop
-竄改,Falsification
-電子欺騙,Spoofing
-抵賴,Repudiation
-不需要金鑰
-cuz 資料傳輸方便
-只要Google就能翻譯
-單向不可逆
-無法被破譯
-輸出長度固定
-不同的 output 配對不同 input
-一定配有密鑰
-得知密文也無用
-得知演算法也無用
-可能被暴力破解
-應用最廣泛
沒用小知識:那三個 icon 與主題一點關係都沒有
"The enemy knows the system"
– Claude Shannon
The concept that a Cryptographic system should be designed to be secure, even if all its details, except for the key, are publicly known.
柯克霍夫原則
Kerckhoffs's principle
讓你知道古人究竟有多突發奇想
-Yap,羅馬共和時期的那個凱薩大帝
"如果需要保密,信中便用暗號,也即是改變字母順序,使局外人無法組成一個單詞。如果想要讀懂和理解它們的意思,得用第4個字母置換第一個字母,即以D代A,余此類推。"
-使用字母偏移替換的方式,e.g. 偏移量3
A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|
D | E | F | G | H | I | J | K | L | M |
cat -> edw
AawIsSoDianOrz ->DdzLvVrGldqRuc
-凱薩密碼有資格被稱為加密嗎?
> 可以,但是這演算法超級爛
-我可以怎麼破解它 :hacker_thonk: ?
這是一個替換式密碼
但我不知道它是凱薩
這個絕對是凱薩密碼
但我不知道它的金鑰
> 別擔心,羅馬共和時期的識字人口超級低
這是一個替換式密碼
但我不知道它是凱薩
這個絕對是凱薩密碼
但我不知道它的金鑰
窮舉 26 種偏移量
透過頻率分析
一字對一字實在太明顯
透過單詞分析
1st | e |
2nd | t |
3rd | a |
1st | th |
---|
1st | the |
---|
#include <bits/stdc++.h>
using namespace std;
int main (){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout << "想不到吧,我會在密碼學中置入C++語法題";
}
題目這種東西就是好刷一直刷
只要寫不停就會變超級強喔
:)
-凱薩密碼的基礎下,但更難了一咪咪
> 真的只有一咪咪
-窮舉凱薩密碼的26種偏移並列表
明文 | G | A | W | R | G | U | R | A |
密鑰 | W | A | S | T | O | N | W | A |
密文 | C | A | O | K | U | H | N | A |
e.g. 密鑰 = waston
密鑰:小於或等於明文長度的字串
不足者複製自己補齊
如右圖,用明文、密鑰來對照表格
-還是很容易被破解,why?
-頻率分析不能用了 ... 你確定?
明文 | G | A | W | R | G | U | R | A |
密鑰 | W | A | S | T | O | N | W | A |
密文 | C | A | O | K | U | H | N | A |
e.g. 密鑰 = waston
What if
密鑰的長度 n 被我們得知了?
假設歸假設
我們還是不知道密鑰長度 n 啊
阿蘇你當我們會通靈?
-信不信由你,通靈真的也是一招
> 你以為敵人很有創意嗎
-窮舉啦,哪次不窮舉
> 其實去年暑訓也是教我們窮舉
觀察出來的結果是否有意義
有意義的長文中,隨機 2 字母相同的機率為 0.068 %
重複字串 | 字串首字index | 間隔 |
---|---|---|
ZVRAO | 102, 134, 390, 402, 426 |
32, 256, 12, 24 |
MBDBMVS | 143, 155, 307, 411, 439 |
12, 152, 104, 28 |
23. Feb. 1918
Arthur Scherbius
亞瑟 謝爾比烏斯
不是莫比烏斯反演
11. Nov. 1918
就叫你不要亂惹中立仔喔
"ㄟ墨西哥陪我一起去扁美國好不好"
1923,邱吉爾:
"其實我們早就破解德軍密碼了啦 ㄏㄏ"
Arthur Scherbius
亞瑟 謝爾比烏斯
好啊我就看你要塑膠我多久
輪盤插槽 * 4
輪盤 * 8
連接線 * 6
輪盤插槽 * 4
輪盤 * 8
連接線 * 6
密鑰:輪盤8選4、輪盤初始狀態、連結線位置
Feb. 1926
英:"德國那邊在講什麼鬼話"
法:"不知道,我破譯不出來"
美:"沒事啦,非常好凡爾賽條約"
:"好耶好耶那就算了"
波蘭 be like:
6 years later...
增加輪盤數量
增加接線數量
我懶得改設計
boobah
01. Sep. 1939
波蘭 -> 法國
22. Jun. 1940
法國 -> 英國
布來切利莊園
> btw, 可以去看模仿遊戲,非常好電影
計算機科學與人工智慧之父
Alan Turing, 艾倫 圖靈
> 名字真的可以再沒創意一點
Bomba 的進化版,Bombe
其實我只教基礎,詳細的留給硬體
特別親民,正常人使用
使用 0 ~ 9
要表達"9 + 1"時進位
給電腦看的,密碼學會用到
使用 0 ~ 1
要表達"1 + 1"時進位
不算少見,一些奇怪地方會用到
使用 0 ~ 9 + A ~ F
要表達"F + 1"時進位
十進制 | 二進制 | 十六進制 |
11 | 1011 | B |
17 | 10001 | 11 |
38 | 100110 | 26 |
令從右往左數的第一個數字為第一位,依此類推
如果要把 n 進制的數字轉成十進制
當第 a 位的數字為 x 時
它在十進制的值會是 a * na-1
第四位 | 第三位 | 第二位 | 第一位 | |
---|---|---|---|---|
十進制 | ||||
二進制 | ||||
十六進制 |
100 = 1
20 = 1
160 = 1
101 = 10
21 = 2
161 = 16
102 = 100
22 = 4
162 = 256
103 = 1000
23 = 8
163 = 4096
e.g.
二進位 to 十進位
1010000101 = 29 + 27 + 22 + 20 = 512 + 128 + 4 + 1 = 645
#include <bits/stdc++.h>
using namespace std;
int main (){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout << "早上好密碼學,現在我非常喜歡C++\n";
cout << "請實作出十進制轉二進制\n";
}
#include <bits/stdc++.h>
#define gura ios_base::sync_with_stdio(false), cin.tie(0);
#define ll long long int
using namespace std;
ll BIEX_(ll a, ll b){
if(b == 0) return 1;
if(b&1){
return a * BIEX_(a, b-1);
} else{
int tmp = BIEX_(a, b/2);
return tmp * tmp;
}
}
int main (){
//其實還能再套倍增優化,但我好懶ㄛ
gura
ll num;
while (cin >> num){
int pow = 0;
while (BIEX_(2, pow) < num) pow++;
bool judge = false; //確認不會有多餘的0輸出
while (pow >= 0){
if (num - BIEX_(2, pow) >= 0){
num -= BIEX_(2, pow);
cout << '1';
judge = true;
}else if(judge){
cout << '0';
}
pow--;
}
cout << '\n';
}
}
附上小丑阿蘇無聊毒瘤解
優化還做半套
看不懂正常 因為我用快速冪
如果你能理解...
考慮上台當講師ㄇ,我好愛你
你問我正常解答?
自己想啊,我才不跟你講咧:)
-aka 位元,電腦的基本儲存單位
-儲存一個二進位數字
-由 n 個 bit 組成的組合,共有 2n 種可能
1 Byte = 8 bit 1 TiB = 1024 GiB
1 KiB = 1024 Byte 1 PiB = 1024 TiB
1 MiB = 1024 KiB 1 EiB = 1024 PiB
1 GiB = 1024 MiB 1 ZiB = 1024 EiB
> 其實 TiB 以上,你這輩子都用不太到
> 如果你跟我一樣懶,可以全部都用 1000 算,那’i’就不用加了
-"邏輯互斥或",中文並沒有比較好理解
-具有交換律、結合律
-對自己做 ⊕ -> 一堆 0
-和一堆 0 做 ⊕ -> 什麼都不會改變
∧ | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
這是 and
∨ | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 1 |
這是 or
6 | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
這是 xor
把本來就很難理解的東西變成更難理解的東西
不需要金鑰
資料傳輸方便
Google 即可翻譯
> 這隻 Gura 看起來快解體了
: ASCII_thonk :
Dec = 十進制,Hx = 十六進制,Oct = 八進制
American Standard Code for Information Interchange
> 其實不會有人講全名但看起來比較帥
十進制編號 | 白話文 |
2 | 標題開始 |
9 | Tab |
27 | Esc |
127 | Delete |
"英文跟其他符號是解決了,那其他語言呢?"
-UCS-2: U+0000~U+FFFF
占用 2 bytes,aka 16 bits
可表示164 = 216= 65536個字元
-UCS-4: U+00000000~U+7FFFFFFF
占用 4 bytes,aka 32 bits
可表示168 = 232= 2147483648 個字元
-用 U+ 前綴,後面接十六進制數字
-把所有你想得到的字元編碼!
> 對,包含那些奇怪的古文字
I:01001001
a:01100001
m:01101101
a:01100001
C:01000011
l:01101100
o:01101111
w:01110111
n:01101110
I am a Clown
雖然我不是星爆家
但這聽起來不夠快
對吧?
010010010110000101101101011001010100001101101100011011110111011101101110
by the way,因為好玩, 我故意打錯了一個數字
找出來沒有獎勵
-它是編碼,顯然不能加密 ==
-64:以 6 bits(26 = 64)為一單位
A | 0 | I | 8 | Q | 16 | Y | 24 |
B | 1 | J | 9 | R | 17 | Z | 25 |
C | 2 | K | 10 | S | 18 | a | 26 |
D | 3 | L | 11 | T | 19 | b | 27 |
E | 4 | M | 12 | U | 20 | c | 28 |
F | 5 | N | 13 | V | 21 | d | 39 |
G | 6 | O | 14 | W | 22 | e | 30 |
H | 7 | P | 15 | X | 23 | f | 31 |
g | 32 | o | 40 | w | 48 | 4 | 56 |
h | 33 | p | 41 | x | 49 | 5 | 57 |
i | 34 | q | 42 | y | 50 | 6 | 58 |
j | 35 | r | 43 | z | 51 | 7 | 59 |
k | 36 | s | 44 | 0 | 52 | 8 | 60 |
l | 37 | t | 45 | 1 | 53 | 9 | 61 |
m | 38 | u | 46 | 2 | 54 | + | 62 |
n | 39 | v | 47 | 3 | 55 | / | 63 |
-其實不一定要 ASCII,任何二進位編碼都可用
A | 0 | I | 8 | Q | 16 | Y | 24 |
B | 1 | J | 9 | R | 17 | Z | 25 |
C | 2 | K | 10 | S | 18 | a | 26 |
D | 3 | L | 11 | T | 19 | b | 27 |
E | 4 | M | 12 | U | 20 | c | 28 |
F | 5 | N | 13 | V | 21 | d | 39 |
G | 6 | O | 14 | W | 22 | e | 30 |
H | 7 | P | 15 | X | 23 | f | 31 |
g | 32 | o | 40 | w | 48 | 4 | 56 |
h | 33 | p | 41 | x | 49 | 5 | 57 |
i | 34 | q | 42 | y | 50 | 6 | 58 |
j | 35 | r | 43 | z | 51 | 7 | 59 |
k | 36 | s | 44 | 0 | 52 | 8 | 60 |
l | 37 | t | 45 | 1 | 53 | 9 | 61 |
m | 38 | u | 46 | 2 | 54 | + | 62 |
n | 39 | v | 47 | 3 | 55 | / | 63 |
-YouTube 連結!
> 我覺得有人光看網址就知道這是什麼了
aka 共用密鑰加密系統
text:"John-Ray-Gigi got a new girlfriend again"
text ':"sTaR-TsJ-GpyM 5d1 9 W_@ leMoNilEmo nDinG"
(神秘的函式運算)
text:"John-Ray-Gigi got a new girlfriend again"
密鑰x
密鑰x
(神秘的函式運算)
> gif太佔空間放不下
-加密 && 解密都使用同一把金鑰!
> 我知道你要說什麼,可不可以統一說"金鑰"或"密鑰",但我偏不要:)
-凱薩密碼其實就是一種
加密 && 解密金鑰:字母偏移量
-當然,維吉尼亞密碼也是
加密 && 解密金鑰:小於等於明文長度的字串
-答對了!下一個是恩尼格瑪密碼
加密 && 解密金鑰:轉盤、初始格數、接線
> 畢竟古人還想不到非對稱式這種複雜方式
讓我們再複習一下 XOR 的性質...
⊕ | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
這是 xor
A ⊕ B ⊕ A = (A ⊕ A)⊕ B = null ⊕ B = B
A ⊕ B ⊕ A = (A ⊕ A)⊕ B
A ⊕ B ⊕ A = (A ⊕ A)⊕ B
A ⊕ A = null
A ⊕ null = A
A ⊕ B ⊕ A = (A ⊕ A)⊕ B = null ⊕ B = B
A⊕B | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
A | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
A⊕B⊕A | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
A:0110010
B:1010011
A | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
B | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
A⊕B | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
-拿一串跟明文一樣長的 01 字串對明文 XOR!
Q:為什麼一定要跟明文一樣長?
A:如果金鑰長度小於明文,那就只是變種的維吉尼亞
還記得我怎麼破解它的嗎?這會使此演算法不安全
而且如果遇到一長串 null,金鑰會直接被印出來
Q:一次性密碼本的優缺點?
A:優點部分,由於所有明文產生出相同密文的機率都相同, 此演算法是被證實安全的,完全無法被破解。
至於缺點,除了密鑰長到哭以外,它不能預防竄改。
就算駭客不知道金鑰,還是能在不被發現的前提更改內容
Q:為何叫"一次性"密碼本?
A:此演算法的金鑰,只能被使用一次,且通常是隨機產生
如果重複使用,駭客只需把兩份密文 XOR
此時金鑰的保護已消失,就可以透過分析還原出原文了
(A ⊕ K)⊕(B ⊕ K)= A ⊕ B
-它是一種區塊加密!
一次加密整坨 bits
用於已知訊息長度的狀況
-金鑰:64 bits 的 01 字串,實際會用 56 bits
-每個區塊:64 bits
-進行 16 次的費斯妥網路
!燒腦警告!
這塊超級硬,講師被揍爛
請注意自己的大腦,隨時可能停機
明文(64 bits)
L0(32 bits)
R0(32 bits)
L1(32 bits)
R1(32 bits)
好吧,這是你自找的
Shift
Shift
Compress
(56 bits)
(56 bits)
(28 bits)
(28 bits)
(48 bits)
expand,擴張
32 bits -> 48 bits
S-box,我也不會翻
48 bits
P-box,我也不會翻
32 bits
S-box,我也不會翻
48 bits
柯克霍夫原則
Kerckhoffs's principle
Shift
Shift
Compress
expand,擴張
32 bits -> 48 bits
P-box,我也不會翻
32 bits
110101
11 -> 3
1010 -> 10
OUTPUT:
0011
-1970s,NBS 與 NSA 的陰謀論(128 bits -> 56 bits)
-就算是現代攻擊手段,仍無法破解 S-box 之保護
-2008年,在一天內被暴力破解
256 = 7 2057 5940 3792 7940
-3 DES
-AES,Advanced Encryption Standard
aka 公開金鑰密碼系統
"有沒有姜姜假打UNO真汁妹的卦"
P
5pyJ5rKS5pyJ5aec5aec5YGH5omTVU5P55yf5rGB5aa555qE5Y2m
> 我絕對不會說這串"亂碼"只是我拿 base-64 蒙混的
5pyJ5rKS5pyJ5aec5aec5YGH5omTVU5P55yf5rGB5aa555qE5Y2m
S
"有沒有姜姜假打UNO真汁妹的卦"
(神秘的函式運算)
(神秘的函式運算 again)
> BTW,真的有ㄛ,有興趣歡迎私訊講師
-公開金鑰只能拿來加密,私密金鑰只能拿來解密
-適合多對一的傳輸的單向傳輸
S
P
Gigi_girlfriend[0]
Gigi_girlfriend[1]
Gigi_girlfriend[2]
Gigi_girlfriend[3]
Gigi_girlfriend[4]
Gigi_girlfriend[5]
Gigi_girlfriend[6]
Gigi_girlfriend[7]
-速度慢,對金鑰的需求很大
!離散數學警告、數論警告!
因為這些東西又難又噁,現在也講不完
是故我沒辦法告訴你具體的原因證明
-選擇兩個超級大的質數,大約落在 1020 左右,並相乘兩者
\(p\),which is a prime
\(q\),which is a prime
\(N = pq\)
-計算剛剛兩個質數各 - 1 後的乘積
\(r = (p-1)\times(q-1)\)
-找出一個與 r 互質的數字 e
-找出 e 在模 r 下的模反元素 d
如果你聽不懂,就是找出一個數字 d
使得 \((e \times d) \%\, r = 1\)
\(ed ≡ 1 (mod\;r)\)
\(p、q\):超級大的質數 \(N: p\,\times\,q\)
\(r:(p - 1)(q - 1)\)
\(e:\)與 \(r\) 互質的數
P
S
e
d
N
-加密:先把密文分成若干區段,每個區段分開算(區塊加密)
令其中一區塊為 \(m\) ,化成 \( m^e\; \% \;N\)
密文 ≡ me (mod N)
-解密:計算 密文\(^d\;\%N\),就能回推出明文
密文d ≡ 明文 (mod N)
-破解:成功做出 N 的因數分解,還原出\(p、q\)
那兩個質數實在太大,一般電腦做不到
> : 量子電腦thonk :
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
ll turn_ (ll a, ll mod){
return (a % mod + mod) % mod;
}
ll plus_ (ll a, ll b, ll mod){
return turn_(a%mod + b%mod, mod);
}
ll minus_ (ll a, ll b, ll mod){
return turn_(a%mod - b%mod, mod);
}
ll multiply_(ll a, ll b, ll mod){
return turn_((a%mod) * (b%mod), mod);
}
ll Binary_Exponentiation(ll a, ll b, ll mod){
if(b == 0) return 1;
if(b&1){
return multiply_(a, Binary_Exponentiation(a, b-1, mod), mod);
} else{
int tmp = Binary_Exponentiation(a, b/2, mod);
return multiply_(tmp, tmp, mod);
}
}
int gcd(int a, int b){
if (b == 0) return a;
return gcd(b, a % b);
}
long long Exgcd(ll a, ll b, ll &x, ll &y){
if (a < b){
return Exgcd(b, a, y, x);
}
if(b == 0){
x = 1;
y = 0;
return a;
}
long long ret = Exgcd(b, a % b, x, y);
int tmp = x;
x = y;
y = tmp - (a / b) * y;
return ret;
}
ll Exgcd_Ma(ll input, ll mod){ //求模反元素用的
ll a = input, b = mod;
ll x = 0, y = 0;
Exgcd(a, b, x, y);
while (x < 1) x += b;
return x;
}
int main (){
ll p = 43; //第一個質數放這邊,放太大會爛掉
ll q = 59; //第二個質數放這邊,放太大會爛掉
const ll N = p * q;
const ll r = (p-1) * (q-1);
cout << "N = " << N << '\n';
cout << "r = " << r << '\n';
const ll e = 13; //我預設是選 17
cout << "e = " << e << '\n';
const ll d = Exgcd_Ma(e, r);
cout << "d = " << d << '\n';
ll mes = 2022; //模擬訊息,太大也會爛掉
cout << "原明文 = " << mes << '\n';
ll incode = Binary_Exponentiation(mes, e, N);
cout << "密文 = " << incode << '\n';
ll decode = Binary_Exponentiation(incode, d, N);
cout << "解碼的密文 = " << decode << '\n';
}
如果你不想永遠都用傳紙條的方式
!離散數學警告、數論警告!
因為這些東西又難又噁,現在也講不完
所以我不會把等等的函式攤開,更不會證明
Function M
-可以把兩把金鑰合而為一
-即使得到 A 、A-B、仍無法從 A-B 中提取 B
-順序不會影響合成的金鑰,即 A-B = B-A
input:兩把金鑰 A、B
output:合成後的金鑰 A-B
-把同樣兩把金鑰合成會得出新的金鑰,即 A != A-A
P
A
B
P
P
P
A
P
A
P
B
P
B
P
A
P
A
B
P
B
A
哭啊
你們是不是沒有人
記得我的名字
P
B
(1)A、B決定兩個數字P,Q,P是一個超大的質數,Q為其之原根
(2)A、B 各決定一個私密數字 X、Y
(3)A 計算 QX mod P,B 計算 QY mod P,把計算結果傳給對方
(4)雙方再計算QXY mod P 或 QYX mod P,此即為共同金鑰
假設你跟歐拉定理很熟,而且知道生成元是什麼,其實可以直接啃
-對稱性密碼系統:計算快速,但密鑰交換麻煩
非對稱性密碼系統:無須交換密鑰,但計算很慢
[我已經懶得請猴子與花心鬼出場了]
(1)B 製作公鑰與私鑰,把公鑰傳給 A
(2)A 利用該公鑰,來加密對稱性的金鑰
(3)A 把加密後的對稱性金鑰傳給 B
(4)B 用私鑰解密對稱性金鑰
(4)對,真的就只有這樣,不要懷疑
唬爛了半天,密碼學到底有什麼用
input:< 某長度之字串
output:長度固定的亂碼
-從 hash 值無法回推出原文
-抗碰撞性:幾乎無法找到兩個 input,產生出一樣的 output
雜湊碰撞 Hash Collision
MD5 -> 1.47 * 10-29
SHA-1 -> 1.00 * 10-45
SHA-256 -> 4.30 * 10-60
-改動任何一個 bit,都會對 hash 值產生極大影響
MD5:128 bits,抗碰撞性已被攻破
MD5:128 bits,抗碰撞性已被攻破
SHA-1:160 bits,兼容性高,但抗碰撞性已被攻破
SHA-2:跟 MD5 還是類似,不過目前沒被攻破
> 我只說目前喔,幾年後我不知道
SHA-3:結構整個被翻新,且支援無上限 input
以往針對 MD 結構的攻擊已無效
RIPEMD-160:160 bits,由歐盟提出,被比特幣採用
> 其實好像沒很安全,但因為它特別短就被用了
-預防軟體被修改
> 這就是為何你亂裝掛會被抓到
-儲存密碼
> 密碼直接存明文跟裸奔有 87% 像
加鹽(絕對不是這樣翻):
在密碼後插入一段隨機數據(salt)再儲存
-密碼學安全偽亂數生成器
隨機性 | 不可預測性 | 不可重複性 | |
---|---|---|---|
偽隨機數產生器 | O | X | X |
密碼學安全偽亂數生成器 | O | O | X |
硬體亂數生成器 | O | O | O |
-預防訊息遭到竄改!
-在訊息後多送一個 tag 過去
-input:一把新的金鑰、密文
output:tag
Text:我放棄跟蘇玉亙溝通
陳亮延你來
Text ' Tag
T
+ Text ' = Tag : al4k
M
Text:我放棄跟蘇玉亙溝通
陳亮延你來
+ Text ' = Tag : al4k
T
Text ':UIboihhfysOHfpodhSD
M
m [0]
m [1]
m [2]
f(m[0], k1)
f(m[1] ' , k1)
f(m[2] ' , k1)
f(m , k2)
Tag
-把訊息分成若干區塊
-區塊用金鑰 k1 加密後,與下個區塊做XOR
-最後結束時,再用一把新金鑰 k2 加密
This is why 製造 tag 需要用新的一把金鑰
在沒有金鑰的情形下,創造不出合理的 tag
-反過來的非對稱性加密系統:
拿私鑰加密,公鑰解密
-instead of 直接對密文簽名
一般會對明文的 hash 簽名
Text:雲端是裝飾用的嗎
連上傳都不會
Text -> Hash Function -> H
S
+ H -> Sign
Text ':UIbewoinvisbeoinf
Sign
+ Sign -> H
P
Text -> Hash Function -> H
+ Text ' -> Text
Q:為什麼一串加密過的密文,可以當成簽名用?
A:由於公鑰與私鑰是成對的,如果一個人發出來的密文
有辦法被公鑰解密,則代表該訊息絕對是由本人發出
也因為私鑰只有自己知道,能防止抵賴的發生
Q:如果是用公開金鑰解密,那數位簽章不就沒機密性了?
A:沒錯,但使用數位簽章的目的本來就不是為了機密性。
當然還是要用安全的算法來加密明文,數位簽章僅能 保證其完整性與防止抵賴。
Q:數位簽章不是很容易被駭客任意複製嗎?
A:首先,簽名本來就是簽給別人看的,複製數位簽章沒
有意義。同時針對不同消息,給出的數位簽章也會不 同,所以不用擔心濫用的問題
-aka 叫第三方幫你背書
-CA,Certificate Authority
-丟一堆資料給 CA
他們認證完後會幫你做數位簽名
Sign G
個人資訊
SR
Sign R
PG
憑證
Sign R
Sign G
Text '
...
Text
Text '
SG
Sign G
憑證
Sign R
Sign G
Text '
...
Q:如果駭客偽裝成 CA呢?誰要來認證 CA 的簽名?
A:一般會找另一家 CA 來背書,來證明此間 CA 不是由駭
客假扮的。而位於最頂端的那間就真的無法認證,換 言之,對所有憑證的信任都是來自於這家母公司
CA
CA
CA
CA
CA
CA
CA
CA
這次是認真要下課了 :partying_face:
針對資料傳遞的攻擊 | 電腦儲存空間單位 | Hash Function |
密碼學三大分類 | XOR 與他的性質 | 一點點偽亂數生成器 |
柯克霍夫原則 | 對稱式加密系統 | 訊息鑑別碼 |
凱薩密碼 | 一次性密碼本 | CBC MAC |
維吉尼亞密碼 | DES | 數位簽章 |
卡西斯基試驗 | 非對稱式加密系統 | 數位憑證 |
恩尼格瑪密碼與歷史 | 迪菲-赫爾曼金鑰交換 | 猴子與花心鬼好吵 |
進位系統 | 混成密碼系統 | 數論是個垃圾東西 |
石田寶輝, & 宮崎修一. (2017). 演算法圖鑑 (謝孫源, Ed.; 陳彩華, Trans.). 城邦文化. https://webpac.tphcc.gov.tw/webpac/content.cfm?mid=788600&m=ss
Chou, A. (2018). 應用密碼學入門. https://hitcon.org/2018/CMT/slide-files/d1_s2_r4.pdf
Starpt. (2021). 密碼學基本概念. HackMD. https://hackmd.io/@DIuvbu1vRU2C5FwWIMzZ_w/ByUf1sdRr#%E5%AF%86%E7%A2%BC%E5%AD%B8%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5
舒靜雯. (2021, May 13). 密碼學簡介. https://drive.google.com/drive/folders/1tk3exZ-RkdDTHtlcalBrMGf16xdgp8NC?usp=sharing
Gibson, T. (2020, April 1). Kasiski Test. YouTube. https://www.youtube.com/watch?v=asRbswE2hFY
梗你看電影 X. (2022, January 16). 【H&M 365 EP. 16】齊默爾曼電報 - 咦?皇帝隨便說說的話,你外交部長竟然當真? /《金牌特務:金士曼起源》The King’s Man, 2022 | PODCAST.YouTube. https://www.youtube.com/watch?v=tR-DH9cIz64
森纳映画. (2022, July 1). 【不止遊戲】二戰德軍號稱「謎」的密碼機,究竟是如何使用的?. YouTube.
Unknown. (2022, June 13). Unicode. Wikipedia. https://zh.wikipedia.org/wiki/Unicode#%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F
Shin-ming , C. (2016, August 9). 2-9 資料加密標準(DES). Youtube.
洪âng春男chhun-lâm. (2020, May 18). RSA公開金鑰的加密與解密方法. YouTube.
對不起我真的找不到其他了
By repkironca