語言 : python
-
利用RSA公開金匙系統傳遞key : 把key當成明文,讓解密組用RSA生成公、私鑰,利用公鑰把key加密,傳遞給解密組,解密組使用私鑰把key的內容解開。
-
明文長度 : 8的倍數byte(不夠就padding)
-
group長度 : 8-byte一組
-
Key長度 : 8-byte(不限長度)
-
Round Key產生:sha256(key) => 32bytes
$[K_{R0}, K_{R1}, K_{R2}, K_{R3}]$ -
因為N=8且運算單位為一個byte,所以沃爾什轉換運算的模數必須小於256且和8互質,這樣才能取得8的modular inverse。
-
加解密方法
- 加密 : {代換(沃爾什轉換)->加上Round Key->換位(Binary tree in-order -> pre-order)->代換(S-Box)} * 4 round
- 解密 : {代換(inverse-S-Box)->換位(Binary tree pre-order -> in-order)->減掉 Round Key->代換(沃爾什反轉換)} * 4 round
- tree
- S-Box:
s_box
6b 35 f2 73 03 f8 ec 95 26 bf dd 50 a4 98 f0 92
93 b8 87 90 01 ca 1c ba 82 45 5a 52 72 cf 85 b9
a8 8f 28 13 d0 14 2c 83 b5 a0 60 4a c6 e6 66 c7
f1 1d de 0d b1 d1 89 0c cc 5e e1 7c aa 64 3a d7
a3 6c 25 e0 79 5b ad d4 e9 4c 63 06 5d bd 71 d5
ea da 37 75 9d 2d a2 df 11 67 47 7d 8c 97 0e 8e
9f b4 61 1b 08 94 86 9e 6a ce d6 09 a1 21 4d 69
57 5f eb e8 e4 9c 8a f3 4f 54 e3 81 0a c1 c3 0f
7a 18 22 f9 f5 24 7e bc db 39 0b d3 19 15 6d 3b
e2 f6 29 be c8 f4 53 7f 68 12 38 17 9b 41 fa 48
2e ac 80 ef d2 16 8b 07 a9 05 27 74 49 c2 bb 91
ab 6e 2a dc 70 b6 96 9a 62 56 40 65 58 cd 4b 84
5c 02 78 3e 99 04 51 43 c4 d9 e7 b2 4e 36 34 ae
55 00 32 44 59 b0 a7 2b ee 20 46 cb e5 d8 b3 42
33 10 b7 76 1f 1a c9 7b 6f 8d ed a6 1e 31 77 f7
c0 c5 2f 88 30 3c 3f 3d af a5 23 00 00 00 00 00
[107, 53, 242, 115, 3, 248, 236, 149, 38, 191, 221, 80, 164, 152, 240, 146, 147, 184, 135, 144, 1, 202, 28, 186, 130, 69, 90, 82, 114, 207, 133, 185, 168, 143, 40, 19, 208, 20, 44, 131, 181, 160, 96, 74, 198, 230, 102, 199, 241, 29, 222, 13, 177, 209, 137, 12, 204, 94, 225, 124, 170, 100, 58, 215, 163, 108, 37, 224, 121, 91, 173, 212, 233, 76, 99, 6, 93, 189, 113, 213, 234, 218, 55, 117, 157, 45, 162, 223, 17, 103, 71, 125, 140, 151, 14, 142, 159, 180, 97, 27, 8, 148, 134, 158, 106, 206, 214, 9, 161, 33, 77, 105, 87, 95, 235, 232, 228, 156, 138, 243, 79, 84, 227, 129, 10, 193, 195, 15, 122, 24, 34, 249, 245, 36, 126, 188, 219, 57, 11, 211, 25, 21, 109, 59, 226, 246, 41, 190, 200, 244, 83, 127, 104, 18, 56, 23, 155, 65, 250, 72, 46, 172, 128, 239, 210, 22, 139, 7, 169, 5, 39, 116, 73, 194, 187, 145, 171, 110, 42, 220, 112, 182, 150, 154, 98, 86, 64, 101, 88, 205, 75, 132, 92, 2, 120, 62, 153, 4, 81, 67, 196, 217, 231, 178, 78, 54, 52, 174, 85, 0, 50, 68, 89, 176, 167, 43, 238, 32, 70, 203, 229, 216, 179, 66, 51, 16, 183, 118, 31, 26, 201, 123, 111, 141, 237, 166, 30, 49, 119, 247, 192, 197, 47, 136, 48, 60, 63, 61, 175, 165, 35]
inverse s_box
d1 14 c1 04 c5 a9 4b a7 64 6b 7c 8a 37 33 5e 7f
e1 58 99 23 25 8d a5 9b 81 8c e5 63 16 31 ec e4
d9 6d 82 fa 85 42 08 aa 22 92 b2 d7 26 55 a0 f2
f4 ed d2 e0 ce 01 cd 52 9a 89 3e 8f f5 f7 c3 f6
ba 9d df c7 d3 19 da 5a 9f ac 2b be 49 6e cc 78
0b c6 1b 96 79 d0 b9 70 bc d4 1a 45 c0 4c 39 71
2a 62 b8 4a 3d bb 2e 59 98 6f 68 00 41 8e b1 e8
b4 4e 1c 03 ab 53 e3 ee c2 44 80 e7 3b 5b 86 97
a2 7b 18 27 bf 1e 66 12 f3 36 76 a6 5c e9 5f 21
13 af 0f 10 65 07 b6 5d 0d c4 b7 9c 75 54 67 60
29 6c 56 40 0c f9 eb d6 20 a8 3c b0 a1 46 cf f8
d5 34 cb de 61 28 b5 e2 11 1f 17 ae 87 4d 93 09
f0 7d ad 7e c8 f1 2c 2f 94 e6 15 db 38 bd 69 1d
24 35 a4 8b 47 4f 6a 3f dd c9 51 88 b3 0a 32 57
43 3a 90 7a 74 dc 2d ca 73 48 50 72 06 ea d8 a3
0e 30 02 77 95 84 91 ef 05 83 9e 00 00 00 00 00
[209, 20, 193, 4, 197, 169, 75, 167, 100, 107, 124, 138, 55, 51, 94, 127, 225, 88, 153, 35, 37, 141, 165, 155, 129, 140, 229, 99, 22, 49, 236, 228, 217, 109, 130, 250, 133, 66, 8, 170, 34, 146, 178, 215, 38, 85, 160, 242, 244, 237, 210, 224, 206, 1, 205, 82, 154, 137, 62, 143, 245, 247, 195, 246, 186, 157, 223, 199, 211, 25, 218, 90, 159, 172, 43, 190, 73, 110, 204, 120, 11, 198, 27, 150, 121, 208, 185, 112, 188, 212, 26, 69, 192, 76, 57, 113, 42, 98, 184, 74, 61, 187, 46, 89, 152, 111, 104, 0, 65, 142, 177, 232, 180, 78, 28, 3, 171, 83, 227, 238, 194, 68, 128, 231, 59, 91, 134, 151, 162, 123, 24, 39, 191, 30, 102, 18, 243, 54, 118, 166, 92, 233, 95, 33, 19, 175, 15, 16, 101, 7, 182, 93, 13, 196, 183, 156, 117, 84, 103, 96, 41, 108, 86, 64, 12, 249, 235, 214, 32, 168, 60, 176, 161, 70, 207, 248, 213, 52, 203, 222, 97, 40, 181, 226, 17, 31, 23, 174, 135, 77, 147, 9, 240, 125, 173, 126, 200, 241, 44, 47, 148, 230, 21, 219, 56, 189, 105, 29, 36, 53, 164, 139, 71, 79, 106, 63, 221, 201, 81, 136, 179, 10, 50, 87, 67, 58, 144, 122, 116, 220, 45, 202, 115, 72, 80, 114, 6, 234, 216, 163, 14, 48, 2, 119, 149, 132, 145, 239, 5, 131, 158]
if y < 0 :
y mod 251 = -z |-z| = z z mod 251 = a 251-a = ans
-503 -> |-503| = 503 503 % 251 = 1 (251 - 1)
| 姚淨云 | 紀乃傑 | 林韋棣 | 許雅萍 | 胡詠翔 | |
|---|---|---|---|---|---|
| 資料收集 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 架構討論 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 程式設計 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 程式測試 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 報告撰寫 | ✓ | ✓ | ✓ | ✓ | ✓ |
| PPT製作 | ✓ | ✓ | ✓ | ✓ | ✓ |
- 分組(splite)
- 先paddind成8的倍數長度
- 每8byte切成一個block
- block 加密
- 先經過walsh_function
- 加上round_key
- 經過tree_exchange
- 再透過S_box代換
- 把block拼接起來產生密文
- 任意長度
- 經過SHA256會產生32byte的hash
- 每8byte切成一個round_key,共有4個round
-
p 、 q 之生成
- Step 1 : p和q利用亂數生成,範圍為512bits的數,並乘上30再加上1
- Step 2 : p和q進行miller_rabin質數檢測演算法,如果結果為不是質數,則將原本帶入演算法且輸出不是質數的p或q再重新做Step1,直到他們都是質數為止
- miller_rabin質數檢測演算法
-
N = p * q
-
φ(n) = ( p - 1) * ( q - 1 )
-
e之選擇
- 利用線性方式,從2開始找與φ(n)互質的數,找到後,將e等於此數
-
d之求法
- 利用擴展歐幾里德算法
- 給予二整數a與b,必存在有整數x與y使得ax + by = gcd(a,b)
- x = e,y = φ(n)
- 在rsa中d必須是一個正整數,因此當d < 0,需要翻轉,即加上φ(n)
- 利用擴展歐幾里德算法
-
建立publicKey = [e, N],privateKey = [d, N]
-
加密 m^e ≡ c (mod N)
- Step 1 : 先將m(明文,即加解密系統傳過來的Key)做UTF-8 encode
- Step 2 : 將m每個字元利用快速冪取餘數執行出 m^e^ mod N的結果
- Step 3 : 回傳 c
-
解密 c^d ≡ m (mod N)
- 網站架構 : Django
- 目的 : 在網站內輸入明文以及金鑰並產生QR code,內含密文跟加密後的金鑰,並使用手機掃描QR code進入解密網站取得明文。
- Encrypt.html
- Encrypt the plaintext!
- Encrypt the key!
- Generate the QR code!
- Decrypt.html
- Decrypt the plaintext!
- 沃爾什轉換法
- 由於我們想使用數學原理進行加解密,原本我們想使用傅立葉轉換,但傅立葉轉換出的數字會是浮點數,在處理的時候會出現誤差,導致加密後解不回來的情況,最後我們選擇了沃爾什轉換,它是將時域轉至頻率的方法,跟傅立葉的概念很像,但它是整數版本,正好符合我們的需求。
- SHA-256
- Binary tree換位法
- 在想換位的方法時,我們想到可以利用資料結構的Binary tree處理換位,利用獨一無二的Binary tree,將每組明文在加密時以in-order和pre-order方式順序放進去。
- S-Box
- 加強安全性,若沒有S-Box之存在安全性會大幅降低





























