Skip to content

Commit c7c6b0f

Browse files
committed
Add cipher ceasar
1 parent 68393a1 commit c7c6b0f

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Mật mã Caesar
2+
3+
Trong mật mã học, **Mật mã Caesar** hay còn được gọi là **mật mã chuyển vị** là một trong những kỹ thuật mã hóa đơn giản và phổ biến nhất. Đây là một dạng mật mã thay thế, trong đó mỗi ký tự trên văn bản thô sẽ được thay bằng một ký tự khác, có vị trí cách nó một khoảng xác định trong bảng chữ cái. Ví dụ với độ dịch chuyển là `3`, `D` sẽ trở thành `A`, `E` sẽ trở thành `B`, v.v. Tên của kỹ thuật mã hóa này được đặt theo tên của Julius Caesar, người đã sử dụng nó trong các thư từ bí mật của mình
4+
5+
![Caesar Cipher Algorithm](https://upload.wikimedia.org/wikipedia/commons/4/4a/Caesar_cipher_left_shift_of_3.svg)
6+
7+
## Ví dụ
8+
9+
Các chuyển đổi có thể biểu diễn bằng cách sắp hai bảng chữ cái trên hai hàng song song với nhau; bảng chữ cái mật mã sẽ là bảng chữ cái thô đã được dịch sang trái hoặc sang phải một số vị trí. Ví dụ, dưới đây là một bộ mật mã Caesar được thiết lập bằng phép dịch sang trái 3 vị trí, tương đương với phép dịch sang phải 23 vị trí (con số vị trí dịch này được sử dụng làm khóa mã):
10+
11+
```text
12+
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
13+
Cipher: XYZABCDEFGHIJKLMNOPQRSTUVW
14+
```
15+
Khi tiến hành mã hóa, người gửi mật mã sẽ tra cứu từng ký tự của tin nhắn gốc trên dòng "plain" và sau đó viết ra ký tự tương ứng lấy từ dòng "cipher".
16+
17+
```text
18+
Plaintext: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
19+
Ciphertext: QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD
20+
```
21+
22+
## Độ phức tạp
23+
24+
- Thời gian: `O(|n|)`
25+
- Không gian: `O(|n|)`
26+
27+
## Liên kết
28+
29+
- [Caesar cipher on Wikipedia](https://en.wikipedia.org/wiki/Caesar_cipher)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Tạo mảng chữ cái: ['a', 'b', 'c', ..., 'z'].
2+
const englishAlphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
3+
4+
/**
5+
* Tạo bản đồ mật mã từ bảng chữ cái.
6+
* Ví dụ dịch chuyển 3 vị trí : {'a': 'd', 'b': 'e', 'c': 'f', ...}
7+
*
8+
* @param {string[]} alphabet - vd: ['a', 'b', 'c', ... , 'z']
9+
* @param {number} shift - vd: 3
10+
* @return {Object} - vd: {'a': 'd', 'b': 'e', 'c': 'f', ..., 'z': 'c'}
11+
*/
12+
const getCipherMap = (alphabet, shift) => {
13+
return alphabet
14+
.reduce((charsMap, currentChar, charIndex) => {
15+
const charsMapClone = { ...charsMap };
16+
// Làm cho sự thay đổi trở thành chu kỳ
17+
// (tức là với dịch chuyển là 1 - 'z' sẽ được ánh xạ thành 'a').
18+
let encryptedCharIndex = (charIndex + shift) % alphabet.length;
19+
// Hỗ trợ dịch chuyển âm để tạo bản đồ giải mã
20+
// (tức là với dịch chuyển -1 - 'a' sẽ được ánh xạ thành 'z').
21+
if (encryptedCharIndex < 0) {
22+
encryptedCharIndex += alphabet.length;
23+
}
24+
charsMapClone[currentChar] = alphabet[encryptedCharIndex];
25+
return charsMapClone;
26+
}, {});
27+
};
28+
29+
/**
30+
* @param {string} str
31+
* @param {number} shift
32+
* @param {string[]} alphabet
33+
* @return {string}
34+
*/
35+
export const caesarCipherEncrypt = (str, shift, alphabet = englishAlphabet) => {
36+
// Tạo bản đồ mã hoá:
37+
const cipherMap = getCipherMap(alphabet, shift);
38+
return str
39+
.toLowerCase()
40+
.split('')
41+
.map((char) => cipherMap[char] || char)
42+
.join('');
43+
};
44+
45+
/**
46+
* @param {string} str
47+
* @param {number} shift
48+
* @param {string[]} alphabet
49+
* @return {string}
50+
*/
51+
export const caesarCipherDecrypt = (str, shift, alphabet = englishAlphabet) => {
52+
// Tạo bản đồ giải mã:
53+
const cipherMap = getCipherMap(alphabet, -shift);
54+
return str
55+
.toLowerCase()
56+
.split('')
57+
.map((char) => cipherMap[char] || char)
58+
.join('');
59+
};

0 commit comments

Comments
 (0)