Skip to content

Commit

Permalink
Merge pull request #39 from decipherhub/symmetric-encryption
Browse files Browse the repository at this point in the history
Add symmetric encryption docs
  • Loading branch information
yijun-lee authored Jul 30, 2024
2 parents fd6db6f + 785ecf3 commit 9b6dc4d
Show file tree
Hide file tree
Showing 21 changed files with 250 additions and 2 deletions.
67 changes: 67 additions & 0 deletions content/Basic Cryptography/AES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
## Intro
AES (Advanced Encryption Standard) is the most common [[Symmetric key encryption]] algorithm, which utilizes a block cipher. Unlike [[DES]], the AES algorithm does not use a [[Feistel network]], enabling more parallelization. The length of the key used in AES can be 128 bits, 192 bits, or 256 bits, and can be represented as AES-128, AES-192, and AES-256. Each version also has a different number of rounds, which are 10, 12, and 14 rounds, respectively. In addition, every version of AES uses the same block size, which is 128 bits. AES works on a $4 \times 4$ block array, where each $b_a$ represents 1 byte of the block.

$$
\left[
\begin{matrix}
b_0 & b_1 & b_2 & b_3 \\
b_4 & b_5 & b_6 & b_7 \\
b_8 & b_9 & b_{10} & b_{11} \\
b_{12} & b_{13} & b_{14} & b_{15} \\
\end{matrix}
\right]
$$

## Design
High-level description of AES is as following:
1. KeyExpansion
2. For the initial round
- AddRoundKey
3. For the other rounds(9, 11, 13 rounds)
- SubBytes
- ShiftRows
- MixColumns
- AddRoundKey
4. For the final round
- SubBytes
- ShiftRows
- AddRoundKey

### KeyExpansion
The KeyExpansion step generates round keys to be used in each round. In the case of AES-128, KeyExpansion takes a 128-bit key as input and expands it into a 44-word array, with each word being 32 bits. Every 4 words(128 bits) are used as a round key in each round, which means that AES-128 uses 11 round keys. AES-192 and AES-256 uses 13 and 15 round keys respectively. Every round keys are also represented as below.
$$
\left[
\begin{matrix}
k_0 & k_1 & k_2 & k_3 \\
k_4 & k_5 & k_6 & k_7 \\
k_8 & k_9 & k_{10} & k_{11} \\
k_{12} & k_{13} & k_{14} & k_{15} \\
\end{matrix}
\right]
$$


### AddRoundKey
The AddRoundKey step is a simple bitwise XOR operation between the state array and a round key. The state array is a $4 \times 4$ plaintext array at the first round, which is manipulated during the encryption process. Each round key is derived from the original encryption key through the KeyExpansion process. This step is important because adding the key to the state provides the security of encryption.

### SubBytes
The SubBytes step substitutes each byte with another byte according to a 8-bit substitution box(Sbox). The S-box provides non-linearity properties, leveraging multiplicative inverse over [[Finite Field|GF]]($2^8$).
![[Pasted image 20240730214809.png]]

### ShiftRows
The ShiftRows step is a transposition step where the rows of the state array are shifted in certain offset cyclically to the left. The first row is left unchanged, the second row is shifted one byte to the left, the third row is shifted two bytes to the left, and the fourth row is shifted three bytes to the left. This step helps in **diffusion** by mixing the positions of the bytes in each row.
![[Pasted image 20240730214817.png]]

### MixColumns
The MixColumns step is a mixing operation that operates on the columns of the state array. Each column is treated as a four-term polynomial and multiplied by a fixed polynomial
$c(z)={03}_{16}\cdot z^{3}+{01}_{16}\cdot z^{2}+{01}_{16}\cdot z+{02}_{16}$ modulo $x^4 + 1$. More generally, this step can be represented as below.

![[Pasted image 20240730220004.png]]

This step provides **diffusion** by mixing the bytes within each column, ensuring that the output bytes are influenced by multiple input bytes.

![[Pasted image 20240730214827.png]]
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,7 @@
4. [[Elliptic Curves#Elliptic Curve Cryptography]]

ECC(타원 곡선 암호)는 이산 로그 문제 중 타원 곡선에 기반한 [[ECDLP]](Elliptic Curve Discrete Logarithm Problem)을 기반으로 하는 시스템이다. 다른 프로토콜에 비해 비교적 작은 길이의 키를 사용하면서 높은 수준의 보안성을 제공하기 때문에 제한된 자원을 가진 모바일이나 블록체인과 같은 환경에서 널리 사용된다.

## Comparison with [[Symmetric key encryption]]
Refer to [[Symmetric key encryption#Comparison with Asymmetric key encryption]]

7 changes: 5 additions & 2 deletions content/Basic Cryptography/Basic Cryptography.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
> [[Basic Cryptography]] introduces the fundamental principles and techniques of cryptography. This includes basic encryption and decryption methods, and the principles behind key cryptographic algorithms such as symmetric and asymmetric encryption.

- [[Public key cryptography]]
- [[Symmetric key cryptography]]
- [[Asymmetric key encryption]]
- [[Symmetric key encryption]]
- [[AES]]
- [[Block cipher]]
- [[Stream cipher]]
- [[Diffie-Hellman]]
- [[RSA]]
- [[ElGamal]]
Expand Down
34 changes: 34 additions & 0 deletions content/Basic Cryptography/Block cipher.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## Intro
A block cipher is an encryption algorithm used in symmetric key encryption that encrypts plaintext in fixed-size blocks. The block size depends on the algorithm, but the length of the plaintext can be variable because block ciphers utilize modes of operation, which will be explained below. A block cipher can also be abstracted as a [[Pseudo-random Function]] where the message space is n bits and the key space is k bits.

![[Pasted image 20240730165247.png]]

## Design
![[Pasted image 20240730172248.png]]
The basic flow of block cipher encryption is as follows:

1. Expand the key into $r$ round keys via key expansion.
2. Apply each round key sequentially using the round function.
3. Output the ciphertext $c$.

The implementation of the round function and key expansion depends on the specific algorithm. Typically, in the round function, building blocks such as substitution, transposition, shift, and swap are used to satisfy [[Confusion and Diffusion]].

## Mode of Operation
If the length of the plaintext to be encrypted is longer than the block size, a mode of operation can be used. The mode of operation defines the methods to securely use a single key multiple times. There are two types of modes of operation:

| Confidentiality only | Authenticated Encryption with Additional Data(AEAD) |
| ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| - ECB(Electric Codebook)<br>- CBC(Cipher-block Chaining)<br>- CFB(Cipher Feedback)<br>- OFB(Output Feedback)<br>- CTR(Counter) | - GCM(Galois counter)<br>- CCM(Counter with cipher block chaining message authentication code)<br>- SIV(Synthetic initialization vector)<br>- AES-GCM-SIV |

## Comparison with [[Stream cipher]]
| | [[Stream Cipher]] | Block Cipher |
| ---------------- | ------------------------------------- | ----------------------------------------------------- |
| Processing Unit | Bit/Byte | Block of data |
| Key type | Generated for each bit/byte | Single key used for multiple rounds |
| Implementation | Simpler, often used in hardware | More complex, often used in software |
| Use Case | Real-time applications, low latency | File encryption, data at rest |
| Speed | Typically faster | Typically slower |
| Padding Required | Not required | Required if data does not fit block size |
| Security | Key reuse can lead to vulnerabilities | More secure with proper padding and mode of operation |
| Example | RC4, Salsa20, ChaCha20 | AES, DES, Blowfish |

18 changes: 18 additions & 0 deletions content/Basic Cryptography/Stream cipher.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## Intro
Stream cipher is a method of encrypting data where each bit or byte of the plaintext is encrypted sequentially, one at a time, using a corresponding bit or byte from a key stream. This approach differs from block ciphers, which encrypt fixed-size blocks of data. Stream ciphers are often used in scenarios requiring high-speed encryption and where data is transmitted in a continuous stream.

## Design
![[Pasted image 20240730173718.png]]
TODO(yuki)

## Types of stream ciphers
### Synchronous Stream Ciphers
In synchronous stream ciphers, the key stream is generated independently of the plaintext and ciphertext. An internal state to generate the pseudorandom sequence(key stream) is maintained and used to generate new internal states.
To decrypt the plaintext correctly, the sender and receiver must be synchronized to ensure the key streams match during encryption and decryption. If a bit is lost or an erroneous bit is added due to transmission errors, decryption will fail from that point onward and re-synchronization will be needed.

### Asynchronous Stream Ciphers
In synchronous stream ciphers, the key stream is generated based on the previous ciphertext bits, not on the previous internal state. Thus, if a bit is changed or lost during transmission, only a portion of the decryption will fail.


## Comparison with [[Block cipher]]
Refer to [[Block cipher#Comparison with Stream cipher]]
32 changes: 32 additions & 0 deletions content/Basic Cryptography/Symmetric key encryption.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## Intro
Symmetric encryption is a method of encryption that uses the same key for both encryption and decryption. Since encryption and decryption are performed with a single key, it is crucial that this key is not exposed to anyone outside. For this reason, it is also known as secret key encryption.
An important aspect of symmetric encryption is key management. This includes generating keys securely, distributing them safely, and ensuring they are stored in a manner that prevents unauthorized access.

## Types
Symmetric encryption can be divided into block cipher and stream cipher.
- [[Block cipher]]: Encrypts plaintext in fixed-size blocks.
- [[Stream cipher]]: Encrypts plaintext bit by bit or byte by byte.

## Examples
The most well-known example of symmetric encryption is [[AES]](Advanced Encryption Standard). There are also methods like DES(Data Encryption Standard), which has known vulnerabilities.

## Use cases
Symmetric encryption is used in various real-world applications such as TLS/SSL for secure web communication, file encryption, and database encryption. For example, in TLS 4.0, symmetric encryption schemes such as [[ChaCha20]] or AES256 are used for encryption.

## Comparison with [[Asymmetric key encryption]]
| | Symmetric key encryption | [[Asymmetric key encryption]] |
| ---------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Key type | Single key for both encryption and decryption | Public key for encryption, private key for decryption |
| Speed | Faster | Slower |
| Key distribution | Requires secure channel | No need for secure channel (Public key can be shared openly, secret key remains private) |
| Non-repudiation | X | O |
| Example | [[AES]], DES | [[RSA]], [[ElGamal]], [[ECDSA]] |
| # of keys | $N\choose 2$ for $N$ people | $2N$ for $N$ people |








Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
---
excalidraw-plugin: parsed
tags:
- excalidraw
draft: "true"
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'


# Excalidraw Data
## Text Elements
Plaintext ^mkMzafMa

Ciphertext ^95yWyj8l

Key ^CSoABc2j

Encryption & Decryption
Algorithm ^gcXyAA3t

## Embedded Files
fc8551656b13d3cdb8f5eee8412edf270a2592b8: $$\{0, 1\}^n
$$
ead043ca1b10a95228a9dcb2b4b7a6fa28f62d6c: $$\{0, 1\}^n
$$
28180c1dd2d4cfb3f81e69ce361ccc651b112248: $$\{0, 1\}^k
$$
%%
## Drawing
```compressed-json
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
```
%%
Binary file added content/Pasted image 20240730163028.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730165247.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730172248.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730173718.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730214809.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730214817.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730214827.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/Pasted image 20240730220004.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 9b6dc4d

Please sign in to comment.