You are on page 1of 13

BỘ THÔNG TIN VÀ TRUYỀN THÔNG

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG


------------------------------

BÁO CÁO CUỐI KỲ


MÔN CƠ SỞ MẬT MÃ HỌC

Giảng viên: Nguyễn Lan Anh


Nhóm 6: Mã DES
Sinh viên : Hà Văn Thuỳ
Lớp: D20CQDT01-N
MSSV: N20DCDT030

TP.HCM, tháng 05/2023


Giới thiệu chung về DES. Thuật toán mã khối DES (Data Encryption Standard) là một
thuật toán mã khối với kích thước khối 64 bít và kích thước khóa 56 bít, được công bố
chính thức bởi Tổ chức Tiêu chuẩn xử lý thông tin liên bang Hoa Kỳ (FIPS) vào tháng
11/1976 và được xuất bản trong tài liệu FIPS PUB 46 (01/1977). Thuật toán DES đã
trải quả nhiều lần cập nhật: năm 1988 (FIPS-46-1), 1993 (FIPS-46-2), 1998 (FIPS-46-
3). Tiền thân của thuật toán DES là thuật toán Lucifer, một thuật toán do IBM phát
triển. Cuối năm 1976, DES được chọn làm chuẩn mã hóa dữ liệu của Hoa Kỳ, sau đó
được sử dụng rộng rãi trên toàn thế giới trong lĩnh vực an toàn, bảo mật thông tin trên
môi trường số. 2. Đặc điểm của thuật toán DES. Thuật toán DES được thiết kế để mã
hóa và giải mã các khối dữ liệu 64 bít với một khóa có độ dài 64 bít. Việc giải mã phải
được thực hiện bởi một khóa tương ứng như trong quá trình mã hóa, mỗi khóa gồm 64
bít, trong đó 56 bít được sử dụng để thực hiện mã hóa/giải mã trong thuât toán. 8 bít
còn lại được dùng để kiểm tra/phát hiện lỗi.
Chuyển M=0123456789ABCDEF sang mã nhị phân M = 00000001 00100011
01000101 01100111 10001001 10101011 11001101 11101111
Ma trận ta có tương tự như thế mỗi 1 bit là 1 hàm và thực hiện hoán vị cột thành hàng
không theo thứ tự chúng ta thấy cột 2 thành hàng 1 cột 4 thành hàng 2 cột 6 thành
hàng 3 cột 8 thành hàng 4 sau đó lại tiếp tục cột 1 thành hàng 5 cột 3 thành hàng 6 cột
5 thành hàng 7 cột 7 thành hàng 8.

Kết quả hoán vị IP:


IP(M) = 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000
1010 1010
Dạng hexa như sau: = CC00CCFFF0AAF0AA
Chia thành 2 nữa và thực hiện vòn 16 vòng lặp:
Ta có bảng sau:

1
Nữa trái 32 bit và nữa phải 32 bit
Để tính vòng thứ nhất L1 = R0 bên này R1 = L0 so với hàm f của R0 và k1 tương tự
đến vòng 16
Bây giờ ta sẽ đi vào chi tiết 1 vòng lặp
1. Mở rộng nửa phải: chúng ta có hàm mở rộng sau lưu ý 4 cột giữa của ma trận
là thứ tự của nữa phải côt đầu tiên chính là thứ tự của cột 5 lấy theo dịch 1 hàng
tương tự cột 6

Chúng ta sẽ có kết quả mở rộng là đây:


R0 = 1111 0000 1010 1010 1111 0000 1010 1010 (32 bit)
E(R0) = 011110 100001 010101 010101 011110 10001 010101 010101
Viết dưới dạng hexa:
E(R0) = 7A 15 55 7A 15 55
Bước tiếp theo là:
2. XOR khóa
Như lúc trước ta tính được khóa như này rồi:

2
Chúng ta có kết quả XOR như sau:
Lưu ý phép XOR giá trị giống nhau bằng 0 còn # nhau thì =1
Kết quả dưới dạng hexa như sau:
A = E[R0]ꚛK1= 61 17 BA 86 65 27
Bước 3 là
3. Thế S-box: SB = 5C 82 B5 97
Lưu ý là có tất cả 8 cái:

Mỗi cặp 6 bit được thế vào 1 bảng :


VD bảng S1(B1) = S(011000) = 0101
Bit đầu và bít cuối ghép lại tạo thành hàng 4 bit giửa là cột

Ta được số 5 viết dưới dạng nhị phân là 0101


Ta làm hết 8 cái ta có kết quả là S(B) = 5C 82 B5 97
4. Hoán vị P:P(SB) = 23 4A A9 BB
Phép hoán vị được cho như sau:

Sau khi hoán vị nó cho kết quả sau: P(SB)= 23 4A A9 BB


Kết quả Sau khi thực hiện 16 vòng lặp:
L16 = 43423234 (= 0100 0011 0100 0010 0011 0010 0011 0100) nữa trái
R16 = 0A4CD995(= 0000 1010 0100 1100 1101 1001 1001 0101) nữa phải
Thực hiện hoán vị cuối cùng IP-1

3
Xếp theo thứ tự phải trước trái sau
Hoán vị đổi hàng thành cột:

GIẢI MÃ
Để giải mã là làm ngược lại quá trình mã hóa, thực hiện các bước như trên,
nhưng theo thứ tự ngược lại mà các con (subkey) được thực hiện.
Ưu khuyết điểm của hệ mã des và so sánh với 2 hệ mật cùng loại
Mã DES là một hệ mã hóa đối xứng khối cổ điển, có những ưu khuyết điểm như sau:
Ưu điểm của DES:
 Sử dụng khối mã hóa đối xứng đơn giản và thực hiện nhanh chóng trên phần cứng
và phần mềm.
 Hỗ trợ cho nhiều ứng dụng.
 Không thể đảo ngược mã hóa cho đến khi tìm được khóa.
Nhược điểm của DES:
 Kích thước khóa chỉ có 56 bit, là quá ngắn và có thể bị phá vỡ bởi các kỹ thuật tấn
công brute-force hoặc các kỹ thuật tấn công cryptanalytic.
 DES đã bị phát hiện các lỗ hổng và không còn được sử dụng rộng rãi như trước
đây.
 Không mang lại tính bảo mật tối ưu trong các ứng dụng mật mã quan trọng như
Internet banking và các giao dịch tài chính dựa trên web.
dịch tài chính dựa trên web đang sử dụng AES ngày nay. AES được xem là hệ mã hóa tiên tiến nhất
hiện nay và được sử dụng rộng rãi trong các ứng dụng cần bảo mật tối đa.

So sánh ưu khuyết giữa des và 3des


So sánh ưu điểm và nhược điểm giữa DES và 3DES như sau:
Ưu điểm của DES:
 DES sử dụng phương pháp mã hóa đối xứng đơn giản và thực hiện nhanh
chóng trên phần cứng và phần mềm.

4
 DES được sử dụng rộng rãi trong các ứng dụng cần độ bảo mật trung bình như
truyền dữ liệu thông qua kênh mạng công cộng.
Ưu điểm của 3DES:
 Tăng cường độ bảo mật của DES bằng cách sử dụng ba lớp mã hóa với ba khóa
khác nhau.
 3DES có độ cứng cáp và độ bảo mật cao hơn DES.
 3DES được sử dụng rộng rãi trong các ứng dụng yêu cầu độ bảo mật cao như
các ứng dụng tài chính và ngân hàng.
Nhược điểm của DES:
 Kích thước khóa chỉ có 56 bit, là quá ngắn và có thể bị phá vỡ bởi các kỹ thuật
tấn công brute-force hoặc các kỹ thuật tấn công cryptanalytic.
 DES đã bị phát hiện các lỗ hổng và không còn được sử dụng rộng rãi như trước
đây.
 Không mang lại tính bảo mật tối ưu trong các ứng dụng mật mã quan trọng như
Internet banking và các giao dịch tài chính dựa trên web.
Nhược điểm của 3DES:
 3DES yêu cầu thời gian mã hóa lâu hơn DES do việc sử dụng ba lớp mã hóa.
 3DES đòi hỏi dung lượng khóa lớn ra hơn nhiều so với DES để đạt được độ an
toàn tương đương.
 3DES đã cũ và chưa được sử dụng rộng rãi như các hệ mật mã mới hơn như
AES.
Tóm lại, 3DES có độ bảo mật cao hơn DES nhưng yêu cầu thời gian mã hóa và dung
lượng khóa cao hơn. DES và 3DES được sử dụng trong các ứng dụng bảo mật phù hợp
với tính chất của từng hệ mật mã. Tuy nhiên, AES là một hệ mật mã được sử dụng
rộng rãi hơn trong những năm gần đây do độ bảo mật cao và tốc độ xử lý nhanh hơn so
với DES và 3DES
So sánh ưu khuyết giữa des và aes
So sánh ưu điểm và nhược điểm giữa DES và AES như sau:
Ưu điểm của DES:
 DES sử dụng phương pháp mã hóa đối xứng đơn giản và thực hiện nhanh
chóng trên phần cứng và phần mềm.
 DES được sử dụng rộng rãi trong các ứng dụng cần độ bảo mật trung bình như
truyền dữ liệu thông qua kênh mạng công cộng.
Ưu điểm của AES:

5
 AES có độ bảo mật và độ cứng cáp cao hơn rất nhiều so với DES.
 AES có kích thước khóa lớn hơn so với DES (128, 192 hoặc 256 bit) và do đó
độ bảo mật của AES vượt trội.
 AES được sử dụng rộng rãi trong các ứng dụng bảo mật như truyền thông và
lưu trữ dữ liệu.
Nhược điểm của DES:
 Kích thước khóa chỉ có 56 bit, là quá ngắn và có thể bị phá vỡ bởi các kỹ thuật
tấn công brute-force hoặc các kỹ thuật tấn công cryptanalytic.
 DES đã bị phát hiện các lỗ hổng và không còn được sử dụng rộng rãi như trước
đây.
 Không mang lại tính bảo mật tối ưu trong các ứng dụng mật mã quan trọng như
Internet banking và các giao dịch tài chính dựa trên web.
Nhược điểm của AES:
 AES tốn nhiều tài nguyên tính toán hơn so với DES, đặc biệt là khi sử dụng
khóa dài hơn.
 Khác với DES, AES sử dụng phương pháp mã hóa mới hơn, nên việc triển khai
và hỗ trợ trên phần cứng có thể gặp khó khăn hơn và đòi hỏi tài nguyên máy
tính mạnh hơn.
Tóm lại, AES có độ bảo mật và độ cứng cáp cao hơn rất nhiều so với DES và đang là
hệ mật mã được sử dụng rộng rãi nhất hiện nay trong các ứng dụng bảo mật. DES chủ
yếu được sử dụng trong các ứng dụng truyền dữ liệu thông qua mạng hoặc các ứng
dụng nhỏ có độ bảo mật trung bình. Không giống như DES, AES không bị các lỗ hổng
an ninh nổi tiếng và được sử dụng rộng rãi trong các ngành công nghiệp và các tổ chức
chính phủ phải đảm bảo tính bảo mật cao.

Ví Dụ matlab:
function DES_Encryption()

% B?ng PC-1 (Permutation Choice 1)


PC1_table = [
57 49 41 33 25 17 9 1 ...
58 50 42 34 26 18 10 2 ...
59 51 43 35 27 19 11 3 ...
60 52 44 36 63 55 47 39 ...
31 23 15 7 62 54 46 38 ...
30 22 14 6 61 53 45 37 ...
29 21 13 5 28 20 12 4];

6
% B?ng PC-2 (Permutation Choice 2)
PC2_table = [
14 17 11 24 1 5 3 28 ...
15 6 21 10 23 19 12 4 ...
26 8 16 7 27 20 13 2 ...
41 52 31 37 47 55 30 40 ...
51 45 33 48 44 49 39 56 ...
34 53 46 42 50 36 29 32];

% B?ng l?ch trình (Schedule of Left Shifts)


shift_table = [
1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1];

% B?ng IP (Initial Permutation)


IP_table = [
58 50 42 34 26 18 10 2 ...
60 52 44 36 28 20 12 4 ...
62 54 46 38 30 22 14 6 ...
64 56 48 40 32 24 16 8 ...
57 49 41 33 25 17 9 1 ...
59 51 43 35 27 19 11 3 ...
61 53 45 37 29 21 13 5 ...
63 55 47 39 31 23 15 7];

% B?ng E (Expansion Permutation)


E_table = [
32 1 2 3 4 5 ...
4 5 6 7 8 9 ...
8 9 10 11 12 13 ...
12 13 14 15 16 17 ...
16 17 18 19 20 21 ...
20 21 22 23 24 25 ...
28 29 30 31 32 1];

% B?ng P (Permutation)
P_table = [
16 7 20 21 ...
29 12 28 17 ...
1 15 23 26 ...
5 18 31 10 ...
2 8 24 14 ...
32 27 3 9 ...
19 13 30 6 ...
22 11 4 25];

% B?ng S-boxes (Substitution boxes)


S_boxes = {
[
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 ...
7
0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8 ...
4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0 ...
15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
];
[
15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10 ...
3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5 ...
0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15 ...
13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
];
[
10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8 ...
13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1 ...
13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7 ...
1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
];
[
7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15 ...
13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9 ...
10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4 ...
3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
];
[
2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9 ...
14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6 ...
4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14 ...
11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
];
[
12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11 ...
10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8 ...
9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6 ...
4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
];
[
4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1 ...
13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6 ...
1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2 ...
6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
];
[
13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7 ...
1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2 ...
7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8 ...
2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
];
};

% B?ng IP inverse (Inverse Initial Permutation)


8
IP_inv_table = [
40 8 48 16 56 24 64 32 ...
39 7 47 15 55 23 63 31 ...
38 6 46 14 54 22 62 30 ...
37 5 45 13 53 21 61 29 ...
36 4 44 12 52 20 60 28 ...
35 3 43 11 51 19 59 27 ...
34 2 42 10 50 18 58 26 ...
33 1 41 9 49 17 57 25];

% Chuy?n ??i khóa t? d?ng hex sang d?ng binary


keyHex = input('Nh?p key ', 's');
% Chuy?n ??i khóa t? d?ng hex sang d?ng
binaryhexToBinaryVector
keyBin = stringToBinaryVector(keyHex);

% Sinh ra 16 khóa con t? khóa ban ??u


subKeys = generateSubKeys(keyBin, PC1_table, shift_table,
PC2_table);

% Nh?p thông ?i?p c?n mã hóa


plaintext = input('Nh?p thông ?i?p c?n mã hóa: ', 's');
plaintextBin = stringToBinaryVector(plaintext);

% B??c mã hóa DES


ciphertextBin = desEncryption(plaintextBin, subKeys,
IP_table, E_table, S_boxes, P_table, IP_inv_table);

% Chuy?n ??i k?t qu? t? d?ng binary sang d?ng hex


ciphertextHex = binaryVectorToHex(ciphertextBin);

% Hi?n th? k?t qu?


disp('K?t qu? mã hóa DES:');
disp(ciphertextHex);

end

function subKeys = generateSubKeys(key, PC1_table,


shift_table, PC2_table)
% Áp d?ng b?ng PC-1 ?? hoán v? khóa ban ??u
permutedKey = key(PC1_table);

% Chia khóa ?ã hoán v? thành 2 n?a trái và ph?i


C = permutedKey(1:28);
D = permutedKey(29:56);

subKeys = cell(1, 16);

% Sinh ra 16 khóa con


9
for i = 1:16
% D?ch trái C và D theo l?ch trình d?ch
C = circshift(C, [1, -shift_table(i)]);
D = circshift(D, [1, -shift_table(i)]);

% Ghép C và D l?i thành khóa con


CD = [C, D];

% Áp d?ng b?ng PC-2 ?? hoán v? khóa con


subKey = CD(PC2_table);

subKeys{i} = subKey;
end
end

function binaryVector = stringToBinaryVector(str)


% Chuy?n ??i t? chu?i ký t? sang d?ng binary vector
binaryVector = reshape(dec2bin(str,8).'-'0',1, []);
end
function binaryVector = hexToBinaryVector(hexStr, numBits)
% Chuy?n ??i t? chu?i hex sang d?ng binary vector
binaryVector = reshape(dec2bin(hex2dec(hexStr), 4).' -
'0', 1, []);

% ??m b?o ?? dài c?a binary vector là numBits


if length(binaryVector) < numBits
binaryVector = [zeros(1, numBits -
length(binaryVector)), binaryVector];
end
end

function hexStr = binaryVectorToHex(binaryVector)


% Chuy?n ??i t? binary vector sang d?ng chu?i hex
binaryVectorResized = [binaryVector zeros(1,
mod(numel(binaryVector), 4))];
binaryStr = num2str(binaryVectorResized, '%d');
reshapedBinaryStr = reshape(binaryStr, 4, []).';
hexStr = dec2hex(bin2dec(reshapedBinaryStr), 1);
end

function permutedMsg = permuteMessage(msg, IP_table)


% Áp d?ng b?ng IP ?? hoán v? thông ?i?p ban ??u
permutedMsg = msg(IP_table);
end

function expandedMsg = expandMessage(msg, E_table)


% M? r?ng thông ?i?p theo b?ng E
expandedMsg = msg(E_table);
end
10
function sBoxOutput = sBoxSubstitution(msg, S_boxes)
sBoxOutput = zeros(1, 32);
msg = reshape(msg, 6, []);

for i = 1:size(msg, 2)
row = bi2de([msg(1, i), msg(6, i)]);
col = bi2de(msg(2:5, i).');
sBoxVal = S_boxes{i}(row*16 + col + 1);
sBoxOutput((i-1)*4+1:i*4) = de2bi(sBoxVal, 4);
end
end

function permutedMsg = permuteOutput(msg, P_table)


% Áp d?ng b?ng P ?? hoán v? k?t qu?
permutedMsg = msg(P_table);
end

function ciphertextBin = desEncryption(plaintext, subKeys,


IP_table, E_table, S_boxes, P_table, IP_inv_table)
% Apply initial permutation (IP)
permutedMsg = permuteMessage(plaintext, IP_table);

% Split the permuted message into left and right


halves
L = permutedMsg(1:32);
R = permutedMsg(33:64);

% Perform DES encryption rounds


for i = 1:16
% Expand the right half of the message
expandedR = expandMessage(R, E_table);

% Ensure expandedR and subKeys{i}(1:48) have the


same size
subKey = subKeys{i}(1:48);
if numel(expandedR) ~= numel(subKey)
if numel(expandedR) > numel(subKey)
subKey = repmat(subKey, [1,
ceil(numel(expandedR) / numel(subKey))]);
subKey = subKey(1:numel(expandedR));
else
expandedR = repmat(expandedR, [1,
ceil(numel(subKey) / numel(expandedR))]);
expandedR = expandedR(1:numel(subKey));
end
end

% XOR expandedR with the subKey


11
xorResult = bitxor(expandedR, subKey);

% Apply S-box substitution


sBoxOutput = sBoxSubstitution(xorResult, S_boxes);

% Permute the S-box output


permutedOutput = permuteOutput(sBoxOutput,
P_table);

% XOR the permuted output with the left half of


the message
newR = xor(permutedOutput, L);

% Update the left and right halves for the next


round
L = R;
R = newR;
end

% Combine the final left and right halves


finalMsg = [R, L];

% Apply inverse initial permutation (IP^-1)


ciphertextBin = permuteMessage(finalMsg,
IP_inv_table);
end

12

You might also like