# Cryptography Training
## Symmetric Cipher
- Mã hóa đối xứng chỉ sử dụng duy nhất 1 **khóa bí mật** (secret key) để mã hóa hoặc giải mã văn bản. Vì thế nên câu hỏi đặt ra là làm sao để chia sẻ khóa đó cho các bên một cách toàn vẹn.

- Các loại mã hóa đối xứng hiện nay đều có thể được chia ra thành 2 loại cơ bản là:
- Mã hóa dòng (Stream cipher)
- Mã hóa khối (Block cipher)
### Stream Cipher
- Mã hóa dòng là loại mã hóa/giải mã văn bản của bạn bằng một khóa có **độ dài ngang bằng** với văn bản. Khi đã mã hóa một bản rõ với một khóa nào đó, bắt buộc không được sử dụng lại khóa đó để mã hóa cho bản rõ khác. Bởi vì, hàm **XOR** ($\oplus$) có tính chất nghịch đảo $A \oplus B = C <=> A \oplus C = B$. Cho nên nếu ta sử dụng lặp lại key thì attacker hoàn toàn có thể đoán được gần đúng các bản rõ ban đầu bằng việc **XOR** các bản mã với nhau như bên dưới.

- **Ưu điểm**:
- Tốc độ mã hóa và giải mã nhanh hơn, đặc biệt là đối với các luồng dữ liệu lớn.
- Yêu cầu bộ nhớ thấp hơn.
- Phù hợp với các ứng dụng thời gian thực và thiết bị có công suất thấp.
- **Nhược điểm**:
- Mật độ của keystream phụ thuộc nhiều vào chất lượng của keystream. Nếu keystream có thể dự đoán hoặc được sử dụng lại, thì cipher có thể bị xâm phạm.
- Dễ bị tấn công bit flipping, trong đó kẻ tấn công có thể sửa đổi các bit riêng lẻ trong ciphertext mà không cần biết khóa.
- Vấn đề đồng bộ hóa: Nếu người gửi và người nhận mất đồng bộ hóa của keystream, thì giải mã sẽ thất bại.
- Không lý tưởng cho các tập dữ liệu lớn: Ít hiệu quả hơn trong việc mã hóa các tập dữ liệu lớn so với block ciphers, vì chúng yêu cầu tạo nhiều keystream hơn.
- **Ứng dụng**: Một trong những ứng dụng của stream cipher đó là **Chaos-base stream ciphers** trong đó ở công đoạn sinh keystream, người ta đã sử dụng chaotic maps vào. Đây là [list](https://en.wikipedia.org/wiki/List_of_chaotic_maps) 1 số chaotic maps hay xài
> Tuy nhiên mình không nghĩ là chaotic map sẽ ra nhưng các bạn vẫn có thể đọc để tham khảo thêm
### Block Cipher
- Mã hóa khối đúng như tên gọi của nó, sẽ chia nhỏ văn bản thành nhiều khối và thực hiện việc mã hóa/giải mã với các khối đó (tùy theo từng mode)
- **Ưu điểm**:
- Có thể cung cấp xác thực và tính toàn vẹn ngoài tính bảo mật bí mật.
- Phù hợp hơn cho các tập dữ liệu lớn.
- **Nhược điểm**:
- Tốc độ mã hóa và giải mã chậm hơn, đặc biệt là đối với các luồng dữ liệu lớn.
- Lỗi trong một khối có thể ảnh hưởng đến các khối tiếp theo.
- Yêu cầu padding khi plaintext có độ dài khác bội số của độ dài 1 block, điều này có thể tạo ra các lỗ hổng bảo mật nếu padding sai cách.
- Yêu cầu tài nguyên cao hơn, thường cần nhiều bộ nhớ và sức mạnh xử lý hơn so với stream ciphers.
#### DES
- Các bạn có thể đọc các thông tin về DES ở [link wiki này](https://en.wikipedia.org/wiki/Data_Encryption_Standard). Nhưng mình sẽ tóm tắt một vài thông tin cơ bản của DES như sau:
- DES sử dụng key 56 bits (thực tế là key 64 bits nhưng công đoạn đầu tiên trong DES là bỏ bit của key ở các vị trí là bội của 8 e.g: 8, 16, 24, ..., 64) để mã hóa bản rõ 64 bits và trả về bản mã 64 bits
- Sơ đồ hoạt động của DES như hình dưới

- Cụ thể hơn về luồng hoạt động các bạn có thể tham khảo [link sau](https://www.geeksforgeeks.org/data-encryption-standard-des-set-1/) hoặc đọc thêm trên slide Week3_4 từ slide 55


- Vì DES có key chỉ 56 bits nên vô cùng kém bảo mật do attacker có thể thực hiện bruteforce kẹp thêm các kĩ thuật khác. Nên đây là tiền đề để phát triển các loại mã hóa mạnh hơn.
#### AES
- Các bạn có thể đọc [link wiki này](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) để biết thêm thông tin về AES
- Chi tiết thuật toán của AES sẽ bao gồm:
- **substitute-bytes (sub)**: Đây là bước thay thế byte của state thành byte khác sử dụng bảng tra S-box
- **shift-rows (shr)**: hoán vị các phần tử trong hàng của state
- **mix-columns (mic)**: thay thế các cột của state thành một cột khác sử dụng phép XOR và tính toán trên trường hữu hạn GF($2^8$)
- **add-round-key (ark)**: sử dụng 128 bits key được tính toán trong bước mở rộng key để tính với state hiện tại.
- **expand-key**: sử dụng 128 bits key được cho ban đầu và mở rộng nó ra để phục vụ cho các bước trên
> state là matrix 4x4 tương đương với 16 bytes/128 bits của 1 block
- Tùy vào loại AES nào (AES-128, AES-192, AES-256) để quy định số round mã hóa cụ thể theo bảng sau:
| KEY SIZE | ROUNDS | EXPANSION KEY |
| -------- | ------ | ------------- |
| 128 | 10 | 176 |
| 192 | 12 | 208 |
| 256 | 14 | 240 |
- Ở mỗi vòng từ 1 -> N-1 đều gồm 4 bước (sub, shr, mic, ark), chỉ duy nhất vòng cuối là gồm 3 bước (sub, shr, ark)

#### Modes of Operations
- Một vài mode thông dụng như:
- ECB
- CBC
- CFB
- OFB
- CTR
- Các bạn có thể đọc thêm về phần này trong slide Week5 từ slide 41

- Ngoài ra, các mode trên chỉ cung cấp tính bảo mật(confidentiality) mà không hề cho ta biết liệu bản mã đã bị chỉnh sửa hay chưa. Để giải quyết việc này ta phải sử dụng các mode có chứa MAC (Message authentication code) để xác thực như CCM, GCM, CWC, ...
## Assymetric Cipher (mã bất đối xứng: RSA, Elgamar, ECC)
- Là hệ mã dùng 1 cặp key để mã hóa và giải mã (public key dùng để mã hóa, private key dùng để giải mã)
- Mã bất đối xứng ra đời nhằm giải quyết 2 vấn đề mà mã đối xứng không làm được:
- Key distribution (phân phối key): do mã đối xứng chỉ dùng 1 secret key => việc phân phối key là rất khó
- Digital signature (chữ kí số): để xác nhận message còn nguyên vẹn trong quá trình gửi hoặc có đến từ đúng người gửi hay không.
- Note: Mã bất đối xứng (RSA,ECC,…) không hề an toàn về mặt cryptanalysis hơn mã đối xứng (AES), điển hình nhất là quantum có thể attack RSA và ECC nhưng AES-128bits đến nay vẫn an toàn.
- Mã bất đối xứng gồm các thành phần:
- Plaintext
- Encryption algorithm
- Public key: key for encryption
- Ciphertext
- Decryption algorithm
- Private key: key for decryption

- Hệ mã bất đối xứng có 3 ứng dụng chính:
- Encryption/decryption
- Digital signature
- Key exchange

### RSA
- One way function: phân tích thừa số nguyên tố
https://en.wikipedia.org/wiki/Integer_factorization


- Độ mạnh của hệ mã RSA dựa trên việc bạn cần phân tích được n ra thừa số nguyên tố để tính d nếu muốn phá mã, và đến nay chưa có giải thuật nào hiệu quả trong thời gian đa thức giúp ta phân tích thừa số nguyên tố đối với các số lớn.
- Ví dụ:
Plaintext: M = 88
1. Key generation:
$p=11, q=17 \Rightarrow n=p.q=187$
$\phi(n)=16.10=160$
Chọn $e=7,d=e^{-1}\text{ } mod \text{ }\phi(n) = 7^{-1} \text{ } mod \text{ } 160 = 23$
$\Rightarrow \text{Private key: {d,n}, public key: {e,n}}$
2. Encryption: $C = M^e \text{ } mod \text{ }n = 11$
3. Decryption: $M = C^d \text{ } mod \text{ }n = 88$
- Trong thực tế, vì lý do bảo mật, OAEP Padding được sử dụng thay thế cho việc chỉ mã hóa plaintext M

(MGF: a hash function)
L : chiều dài message
Seed: random
Byte 0x01: ngăn cách padding với message
- Một số hạn chế của RSA:
- Để tính bảo mật được đảm bảo thì kích thước key phải lớn (thầy có bảo phải >= 3072 bit) => chi phí tính toán và lưu trữ lớn => không phù hợp khi tích hợp cho các thiết bị IOT, thiết bị nhúng, ... vì sức mạnh tính toán có hạn.
- Vì làm việc chủ yếu với hàm mũ => tính toán nặng => tốc độ chậm
- ~~Bị thầy Tự chê :<~~
### ElGamal cipher
- One way function: discrete logarithm

**Bài toán discrete logarithm được xem là một bài toán khó, tức là không có thuật toán hiệu quả nào giải quyết được bài toán này nói chung.**



=> Độ bảo mật của ElGamal cipher phụ thuộc hoàn toàn vào độ khó của bài toán DLP
- Vì loại mã hóa này sử dụng nhiều phép mũ => tốn tài nguyên và tốn thời gian chạy => không hiệu quả
### Diffie-Hellman key exchange

#### __Man in the middle attack__

### ECC





https://curves.xargs.org/
- One way function: Elliptic curve discrete logarithm problem (ECDLP)
Cho 2 điểm $G,D(=dG) \in E(F_p)$ với $dG=G+G+...+G$ (d lần), tìm d.



- __ECDHE__: ECC Diffie-Hellman





## Authentication
### Hash function
#### Ngữ cảnh
- Các thuật toán mã hóa đối xứng (Symmetric Cipher) như DES, AES,... và các thuật toán mã hóa bất đối xứng (Asymmetric Cipher) chỉ cung cấp tính bí mật (Confidentiality) và tính bảo mật (Privacy) mà không cung cấp các tính chất:
+ Tính toàn vẹn (Integrity): Không thể biết được thông tin đã bị thay đổi chưa
+ Tính xác thực (Authentication): Thông tin nhận được đến từ người gửi hay người lạ
+ Tính không chối bỏ (Nonrepudiation): sau khi trao đổi thông tin, người gửi/nhận có thể từ chối việc mình đã gửi/nhận thông tin đó
+ Tính sẵn sàng (Availability): Thông tin không phải lúc nào cũng sẵn sàng để được sử dụng khi cần (có thể bị mất đi nếu bị tấn công hoặc thời gian tính toán quá lâu nên không thể sử dụng được ngay)
- Từ đó, hàm băm và chữ kí số ra đời để giải quyết các vấn đề trên
#### Khái niệm
- Một __hàm băm (Hash Function) H__ cho phép biến đổi một message __m__ với độ dài tùy ý thành một giá trị băm __h__ với __độ dài cố định__, tức là __H(m) = h__
+ Ví dụ: H(m) = m % 2^64
#### Tính chất
- Một hàm băm tốt sẽ cho kết quả hoàn toàn ngẫu nhiên, không dự đoán được
- Các hàm băm được sử dụng trong các hệ thống mã hóa được gọi là các __hàm băm mật mã (Cryptographic Hash Function)__ với những tính chất sau:
+ __Preimage Resistant (one-way)__: Cho __h__, ta rất khó để tính được __m__ sao cho __H(m) = h__
+ __2-nd Preimage Resistant (weak collision resistant)__: Cho __m1__, ta rất khó để tìm được __m2__ sao cho __H(m1) == H(m2)__
+ __Collision Resistant (strong collision resistant)__: Ta rất khó để tìm được __m1__ và __m2__ sao cho __H(m1) == H(m2)__
#### Các hàm băm
- Các hàm băm nổi tiếng:
+ __MD5__: Giá trị băm là một chuỗi 128 bits, dễ dàng tìm được collision với hashclash (lab 6)
+ __SHA1__: Giá trị băm là một chuỗi 160 bits, dễ dàng tìm được collision với hashclash (lab 6), dễ dàng tính toán với length extension attack
+ __SHA2 (SHA224, SHA256, SHA384, SHA512)__: Giá trị băm lần lượt có độ dài là 224, 256, 384 và 512 bits. Có thể tìm được collision và dễ dàng tính toán với length extension attack
+ __SHA3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256)__:Giá trị băm lần lượt có độ dài là 224, 256, 384 và 512 bits. Đối với SHAKE, ta có thể chọn độ dài của đầu ra. Chưa có cách tìm collision hiệu quả
- Các hàm băm như MD5, SHA1, SHA2 sử dụng thuật toán [Merkle-Damgard](https://en.wikipedia.org/wiki/Merkle%E2%80%93Damg%C3%A5rd_construction) để tính toán hàm băm, và vì sử dụng thuật toán này nên chúng có thể bị tấn công bởi [__length extension attack__](https://en.wikipedia.org/wiki/Length_extension_attack) (Hashpump)
- SHA3 sử dụng thuật toán [sponge construction](https://en.wikipedia.org/wiki/Sponge_function) để tính toán hàm băm, nên không bị tấn công bởi LEA. NIST Candidate vào 2012
### Message Authenticate Code
#### Ngữ cảnh
Việc sử dụng mỗi hàm băm để xác thực nội dung có bị thay đổi hay không yêu cầu cần có một kênh truyền an toàn để trao đổi, từ đó phát sinh những vấn đề sau:
- Một kênh truyền an toàn không phải khi nào cũng tồn tại
- Nếu không có kênh truyền, bất kì ai cũng có thể truy cập vào kênh truyền, tính giá trị băm của message rồi gửi đi ( message này có thể đã được chỉnh sửa)
Vì vậy, các giải pháp được đưa ra gồm:
- Sử dụng nhiều hơn 1 hàm băm
- Có thêm Key kết hợp với hàm băm
#### Nội dung
- __Message Authentication Code (MAC)__ là một kĩ thuật để đảm bảo tính toàn vẹn của thông tin, chắc chắn rằng dữ liệu không bị chỉnh sửa
- Khi A gửi dữ liệu cho B, MAC có thể được tính bằng công thức $$MAC = C(K, M)$$ trong đó:
+ M: message
+ K: Secret Key
+ MAC: Message Authentication Code
+ C: MAC function
- Giá trị MAC được gửi kèm với thông tin
- Các thuật toán để tính MAC: BLAKE2b, BLAKE2s, GMAC (GCM), HMAC, Poly1305,...
#### Tính MAC từ Hash function
Xét hàm MAC $$MAC(K, m) = H(K||m)$$
- Nếu hàm băm được chọn là MD5, SHA1, SHA2, ta có thể thực hiện LEA để có thể chỉnh sửa nội dung thông tin đã cho
- Nếu hàm băm được chọn là SHA3, ta không làm được gì do vẫn chưa có cách tấn công hiệu quả
Ta sẽ quan tâm thuật toán [HMAC]
$$\begin{aligned}\operatorname {HMAC} (K,m)&=\operatorname {H} {\Bigl (}{\bigl (}K'\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K'\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\\K'&={\begin{cases}\operatorname {H} \left(K\right)&{\text{if}}\ K{\text{ is larger than block size}}\\K&{\text{otherwise}}\end{cases}}\end{aligned}$$
(https://en.wikipedia.org/wiki/HMAC#Definition)
#### Dictionary Attacks on Hash Function
- Giả sử ta biết được h = H(password), khi đó nếu password là các chuỗi thông dụng(như "123456", "Hello", "abcd",...) thì ta có thể sử dụng [hashkiller](https://hashkiller.io/listmanager) để tìm ra mật khẩu đó
### Digital Signature
#### Ngữ cảnh
- Để đảm bảo rằng message chưa được qua chỉnh sửa và đến từ người gửi (không phải từ một bên thứ ba nào đó), ta có thể sử dụng HMAC, tuy nhiên sẽ gặp vấn đề về thỏa thuận khóa
- Vì thế, dùng chữ kí số (Digital Signature) là lựa chọn khả thi hơn
#### Các tính chất
- Phải xác minh được tác giả (người kí), ngày và giờ của chữ kí
- Đảm bảo tính xác thực của thông tin tại thời điểm kí (tính toàn vẹn)
- Có thể xác minh từ bên thứ ba (tránh tranh chấp)
#### Yêu cầu của chữ kí số

#### Cách xây dựng thuật toán

#### Một số thuật toán phổ biến
- ElGamal Digital Signature


- Schnorr Digital Signature


#### NIST digital signature schemes

- RSASSA-PKCS, RSASSA-PSS
- **DSA**




- **ECDSA**



### Public key distribution (X.509 digital certificates)
#### Ngữ cảnh
- Chữ kí số không thể cung cấp tính xác thực của người gửi, chính vì vậy chữ kí số có thể bị làm giả trong lúc truyền đi
- Vì vậy, chứng thực số (digital certificate) ra đời để giải quyết tính xác thực của người gửi
#### Tính chất
- Bất kì ai cũng có thể đọc cert để biết tên và public key của tác giả
- Bất kì ai cũng có thể xác thực rằng cert chưa bị thay đổi
- Chỉ tác giả có thể tạo và cập nhật certificate
#### Cấu trúc của X.509 digital certificate

#### Public Key Infrastructure
- "The set of hardware, software, people, policies, and procedures needed to create, manage, store, distribute, and revoke digital certificates based on asymmetric cryptography."

#### X.509 PKI (PKIX)


### Applied Cryptography: Network Security
#### Authentication and Authorization
- Tính xác thực (Authentication): Đảm bảo danh tính của user/process/thiết bị trước khi truy cập vào tài nguyên hệ thống
- Để đảm bảo tính xác thực cần trải qua 2 bước:
+ Xác định thông tin (Identification Information)
+ Xác minh (Verification)
- Tính quyền hạn (Authorization): Xác định khả năng truy cập hệ thống, tức là xác thực xem user/process/thiết bị có được truy cập vào tài nguyên cụ thể hay không
#### Authentication
- Authentication Factors:

- Authenticate server/resources

- Authenticate user/end-devices


- Network secure protocols

Some protocols:
+ SSH


+ SSL/TLS






#### Storage on distributed system

- Mục tiêu: Xây dựng được hệ thống lưu trữ thông tin an toàn
Một số lưu ý khi xây dựng
- Sử dụng Mã Hóa Dữ Liệu:
Mã hóa dữ liệu khi nó được truyền đi giữa máy khách và máy chủ, cũng như khi lưu trữ trên đám mây. SSL/TLS có thể được sử dụng để mã hóa dữ liệu trong truyền thông.
- Quản lý Điều Khiển Truy Cập:
Sử dụng quyền truy cập cấp độ người dùng và theo dõi việc sử dụng để đảm bảo rằng chỉ những người có quyền mới có thể truy cập dữ liệu.
Kiểm Soát Nhật Ký Hệ Thống:
Bật và quản lý nhật ký hệ thống để có khả năng theo dõi và phân tích bất kỳ hoạt động nào có thể đe dọa an toàn thông tin.
- Bảo vệ Dữ Liệu Tại Nguồn Gốc:
Đảm bảo rằng dữ liệu được bảo vệ ngay từ nguồn gốc, chẳng hạn như sử dụng các phương pháp mã hóa khi dữ liệu được tạo ra.
- Quản Lý Khóa và Chứng Nhận:
Bảo vệ khóa và chứng nhận an toàn thông tin, thường xuyên cập nhật chúng và đảm bảo rằng chỉ những người có quyền mới có thể truy cập chúng.
- Xác Minh Hai Yếu Tố:
Kích thích việc sử dụng xác minh hai yếu tố để tăng cường bảo mật đối với tài khoản người dùng.
- Thực Hiện Kiểm Tra Bảo Mật Định Kỳ:
Thực hiện kiểm tra bảo mật định kỳ để xác định và giải quyết mọi lỗ hổng bảo mật có thể tồn tại.
- Sao Lưu Dữ Liệu Định Kỳ và Kiểm Tra Khôi Phục:
Tạo sao lưu định kỳ của dữ liệu và thực hiện kiểm tra khôi phục để đảm bảo khả năng phục hồi nhanh chóng khi cần thiết.
- Giáo Dục Người Dùng:
Đào tạo và giáo dục người dùng về các biện pháp bảo mật, như cách chọn mật khẩu mạnh và cách nhận diện các mối đe dọa trực tuyến.
Một số ví dụ về việc xây dựng


Tài liệu: https://giongfnef.notion.site/c-ng-Crypto-siu-c-p-vjp-pr0-3202555f57a24569a212592b5c845992?pvs=4
## Nội dung thi
