Các tác giả thiết kế thuật toán này hướng tới việc tuân thủ dựa trên các thiết kế đã có và coi trọng tính an toàn của thuật toán hơn là tính mới lạ và tốc độ của thuật toán.. Trong m
Trang 1ĐỒ ÁN MÔN HỌC LẬP TRÌNH DOTNET
Đề tài: THUẬT TOÁN SERPENT
Giáo viên hướng dẫn
Sinh viên thực hiện
: :
Thầy Phan Việt Anh Nguyễn Huy Linh (MSV: 10150320, Lớp Tin học 9A)
HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN
- O 0 O
Trang 2-MỤC LỤC
Trang 31 Lịch sử thuật toán Serpent
NIST đã đề nghị một sự thay thế cho thuật toán DES – Thuật toán AES
Các thuộc tính của AES:
− Khối mã hóa 128 bit
− Khóa đối xứng
− Các biến thể của độ dài khóa: 128, 192, 256 bit
− Nhanh hơn DES 3 lần
− An toàn như 3DES
2 Giới thiệu khái chung về thuật toán Serpent
Serpent là một thuật toán mã nguồn mở mã hóa ở dạng khối, còn gọi là khóa đối xứng Về cơ bản chỉ có một khóa được sử dụng để mã hóa và giải mã thông điệp
Thuật toán được phát triển vào năm 1998 bởi 3 nhà nghiên cứu: Ross Anderson, Lars Knudsen và Eli Biham
Serpent là một trong 5 ứng viên cuối vào vị trí thuật toán AES (Advanced Encryption Standard)
Được thiết kế dựa trên mạng chuyển vị - thay thế (S-P Network)
Các tác giả thiết kế thuật toán này hướng tới việc tuân thủ dựa trên các thiết
kế đã có và coi trọng tính an toàn của thuật toán hơn là tính mới lạ và tốc độ của thuật toán
Trong mỗi vòng của thuật toán bao gồm 8 hộp S dựa trên các hộp S của mã DES, nó được thiết kế cho phép tất cả các toán tử có thể thực hiện song song
Trang 4 Sơ đồ thuật toán
Trang 5 Thuật toán bao gồm 32 vòng Các tác giả của thuật toán khẳng định rằng 16 vòng đã đảm bảo độ an toàn của thuật toán (32 vòng sẽ đảm bảo khả năng chống lại các kiểu tấn công trong tương lai)
Điều này dễ dàng tạo cho thuật toán một sự an toàn cần thiết (Serpent được nhìn nhận là thuật toán an toàn nhất trong các thuật toán chung khảo AES),
Nhưng sự trả giá của nó là hiệu suất thấp của thuật toán so với tất cả các thuật toán chung khảo AES
Tuy nhiên, vì yêu cầu ít bộ nhớ khi thực hiện, vì vậy thuật toán rất thích hợp để thực hiện trên smart card (chính điều này giúp cho Serpent chiến thắng thuật toán CAST-256, mặc dù chúng có cùng hiệu năng và
độ an toàn)
3 Quy trình mã hóa – giải mã
a KHỞI TẠO VÀ PHÂN BỔ KHÓA
Việc mã hóa của thuật toán Serpent đòi hỏi 132 từ 32 bit của toàn bộ khóa Đầu tiên, từ khóa K 256 bits người sử dụng cung cấp, ta mở rộng nó thành
33 khóa con 128 bit (K 0 , …, K 32 ) bằng cách ghi khóa K thành 8 từ 32 bit (w -8,
, w -1 ) và mở rộng các từ này thành khóa trung gian w 0 , …, w 131 bằng công thức sau:
w i =(w i- 8 ⊕ wi-5 ⊕ wi-3 ⊕ wi-1 ⊕ φ ⊕ i) <<< 11 Trong đó:
φ: là phần phân số của tỉ số vàng (sqrt(5) + 1) / 2 hoặc số hexa 0x9e3779b9
<<< : là phép vòng trái 11 bits
Những khóa thực hiện một chu kỳ được suy ra từ các khóa trước khi sử dụng các S–box Sử dụng S–box để biến đổi các khóa wi thành các từ ki của khóa chu kỳ theo cách sau:
{k 0 , k 1 , k 2 , k 3 }:= S 3 (w 0 , w 1 , w 2 , w 3)
{k 4 , k 5 , k 6 , k 7 }:= S 2 (w 4 , w 5 , w 6 , w 7)
{k 8 , k 9 , k 10 , k 11 }:= S 1 (w 8 , w 9 , w 10 , w 11)
{k 12 , k 13 , k 14 , k 15 }:= S 0 (w 12 , w 13 , w 14 , w 15)
{k 16 , k 17 , k 18 ,k 19 }:= S 7 (w 16 , w 17 , w 18 , w 19)
…
Trang 6{k 124 , k 125 , k 126 , k 127 } := S 4 (w 124 , w 125 , w 126 , w 127)
{k 128 , k 129 , k 130 , k 131 } := S 3 (w 128 , w 129 , w 130 , w 131)
Ta đánh số lại các giá trị 32 bit kj giống các subkey 128 bit Ki (cho i ∈ 0,
…, r) như sau:
K i :={k 4i , k 4i+1 , k 4i+2 , k 4i+3}
Ví dụ:
− Khóa:
133457799BBCDFFIIFDCBB997754331133457799BBCDFFIIFDCBB9
97754331 (256 bit)
− Khóa này ở dạng nhị phân là một chuỗi bít như sau:
0001001000100100010101110111100
1001101110111100110111111111000
0001111111111101110010111011100
1001011101110101010000100010000
0001001000100100010101110111100
1001101110111100110111111111000
0001111111111101110010111011100
1001011101110101010000100010000
− Tính wi
w i =(w i- 8 ⊕ wi-5 ⊕ wi-3 ⊕ wi-1 ⊕ φ ⊕ i) <<< 11
w0 =(w-8 ⊕ w-5 ⊕ w-3 ⊕ w-1 ⊕ φ ⊕ i) <<< 11
Trang 71001011101110101010000100010000
1001101110111100110111111111000
1001011101110101010000100010000
1001111000110111011110011011100
0000000000000000000000000000000
0000010110001011101001100100100
0 0101110100110010010000000010110
0 <<< 11 0101110100110010010000000010110
− Cứ như vậy lần lượt ta tính được 132 từ 32 bit
− Tính kj: sau khi tính được các wi ta tính được các khóa:
{k 0 , k 1 , k 2 , k 3 }:= S 3 (w 0 , w 1 , w 2 , w 3)
{k 4 , k 5 , k 6 , k 7 }:= S 2 (w 4 , w 5 , w 6 , w 7)
{k 8 , k 9 , k 10 , k 11 }:= S 1 (w 8 , w 9 , w 10 , w 11)
{k 12 , k 13 , k 14 , k 15 }:= S 0 (w 12 , w 13 , w 14 , w 15)
{k 16 , k 17 , k 18 ,k 19 }:= S 7 (w 16 , w 17 , w 18 , w 19)
…
{k 124 , k 125 , k 126 , k 127 } := S 4 (w 124 , w 125 , w 126 , w 127)
{k 128 , k 129 , k 130 , k 131 } := S 3 (w 128 , w 129 , w 130 , w 131)
− Ta đánh số lại các giá trị 32 bit k j:
Trang 8ki :={k 4i , k 4i+1 , k 4i+2 , k 4i+3} tương ứng ta được:
k0 ={k 0 , k 1 , k 2 , k 3 }:= S 3 (w 0 , w 1 , w 2 , w 3)
k1 ={k 4 , k 5 , k 6 , k 7 }:= S 2 (w 4 , w 5 , w 6 , w 7)
……
k31={k 128 , k 129 , k 130 , k 131 } := S 3 (w 128 , w 129 , w 130 ,w 131)
− Mô hình phát sinh khóa
-Initial
Permutation):
Trang 9 Trong thuật toán ta cần hoán vị cả khóa và bản rõ qua bảng IP để định vị các bit khóa và bit rõ vào vị trí đúng cột
Ví dụ:
− Nội dung bản rõ là:
0123456789ABCDEFFEDCBA9876543210 (128 bit)
− Đưa về dạng nhị phân:
00000001001000110100010101100111 10001001101010111100110111101111 11111110110111001011101010011000 01110110010101000011001000010000
− Ta lần lượt đánh vị trí các bít (0 -> 127) và sau đó lấy các bít có vị trí theo bảng IP: do đó sau khi qua bảng IP ta được bản rõ sau khi hoán vị là:
01100110001100110011011000110011 11000110001111000011011000111100 11000110110000110011011011000011 11000110110011000011011011001100
Bảng hoán vị cuối (FP – Final Permutation):
− Bảng hoán vị cuối FP được sử dụng sau khi qua 33 chu kì và ta thu được kết quả là bản mã
Trang 10c LINEAR TRANSFORMATION (BIẾN ĐỔI TUYẾN TÍNH)
Applied on the result of the S-Boxes, I.e on Si(Bi ⊕ Ki)
Each output bit is an exclusive or of some input bits
For Example, output bit 0 is an exclusive or of input bits: 16, 52, 56, 70, 83,
94 and bit 105
The number of input bits XORed to give one output bit is variant and not fixed to seven
d S-BOX
S–box của Serpent là phép hoán vị 4 bit S–box được phát sinh theo cách sau: sử dụng một ma trận gồm 32 dãy, mỗi dãy 16 phần tử Ma trận được khởi gán với 32 hàng của S–box DES và được biến đổi bằng cách hoán đổi các phần tử trong dãy r tùy thuộc vào giá trị của các phần tử trong dãy (r + 1)
và chuỗi ban đầu đại diện cho một khóa Nếu dãy kết quả có các đặc tính như mong muốn (vi phân và tuyến tính), ta lưu dãy này như một Serpent S– box Lặp đi lặp lại thủ tục này đến khi 8 S–box được phát sinh
S-box sử dụng khi mã hóa trong thuật toán Serpent:
Cách tra bảng S-box:
Trang 11 S-box nghịch đảo sử dụng khi giải mã trong thuật toán Serpent:
e QUY TRÌNH MÃ HÓA
Việc mã hóa bao gồm:
− B1: Phép hoán vị đầu IP (initial permutation);
− B2: 32 chu kỳ, mỗi chu kỳ bao gồm một phép trộn khóa, một lượt duyệt qua các S–box và một phép biến đổi tuyến tính (cho tất cả các chu kỳ trừ chu kỳ cuối) Ở chu kỳ cuối cùng, phép biến đổi tuyến tính này thay thế bằng một phép trộn khóa
− B3: Phép hoán vị cuối FP (final permutation)
Ta sử dụng các ký hiệu như sau: Phép hoán vị đầu IP áp dụng vào văn bản
ban đầu P cho ra dữ liệu BÂ 0 là đầu vào chu kỳ thứ nhất (các chu kỳ đánh số
từ 0 đến 31) Dữ liệu ra của chu kỳ thứ nhất là BÂ 1, dữ liệu ra của chu kỳ thứ
hai là BÂ 2 , dữ liệu ra của chu kỳ thứ i là BÂ i+1… cho đến chu kỳ cuối cùng Phép biến đổi tuyến tính ở chu kỳ cuối cùng thay thế bằng phép trộn khóa
được ký hiệu BÂ 32 Phép hoán vị cuối FP áp dụng vào BÂ 32 cho ra văn bản
mã hóa C.
Cho K i là subkey 128 bit chu kỳ thứ i và S–box S i được sử dụng ở chu kỳ
thứ i Cho L là phép biến đổi tuyến tính Khi đó hàm thực hiện một chu kỳ
được định nghĩa như sau :
− X i ← B i ⊕ Ki
− Y i ← S i (X i )
− B i-1 ←L(Y i ), i = 0, …, 30
− B i-1 ← Y i ⊕ K i-1 , i = 31
Như vậy quá trình mã hóa tương đương:
Trang 12− B0 := IP(P)
− B i+1 := R i (B i)
− C := FP(B32)
ở đây:
− Ri(X) = L(^Si(X ^Ki)), i = 0,…, 30
− Ri(X) = ^Si(X ^Ki) ^K 32 , i = 31
Ở mỗi chu kỳ vòng R i (i ∈ {0, …, 31}) chỉ sử dụng một bản sao S–box Ri
sử dụng bảng S(i mod 8) Bộ tám S–box (S 0 …S 7 ) được sử dụng 4 lần Do
đó sau khi sử dụng S 7 ở chu kỳ 7, S 0 lại tiếp tục được sử dụng ở chu kỳ 8, S 1
ở chu kỳ 9…, cuối các vòng là phép biến đổi tuyến tính và ngoại lệ là vòng
R 31, vòng này sau khi sử dụng S7 cho:
(B 31 ⊕ K31 ) kết quả thu được đem XOR với K 32
Sau đó, kết quả B 32 được hoán vị bằng FP cho ra văn bản mã hóa
Cấu trúc mã hóa:
Phép biến đổi tuyến tính L trên Yi = (y0 , y1, y2, y3) định nghĩa như sau:
y 0 ← y 0 <<< 13
Trang 13y 2 ← y 2 <<< 3
y 1 ← y 0 ⊕ y1 ⊕ y2
y 3 ← y 2 ⊕ y3 ⊕ (y0 << 3)
y 1 ← y 1 <<< 1
y 3 ← y 3 <<< 7
y 0 ← y 0 ⊕ y1 ⊕ y3
y 2 ← y 2 ⊕ y3 ⊕ (y1 << 7)
y 0 ←y 0 <<< 5
y 2 ← y 2 <<< 22
B i+1 ← (y 0 , y 1 , y 2 , y 3)
Trang 14f QUY TRÌNH GIẢI MÃ
Quy trình giải mã có khác với quy trình mã hóa Cụ thể là nghịch đảo các S–box (S–box –1) phải được sử dụng theo thứ tự ngược lại, cũng như nghịch đảo của biến đổi tuyến tính và nghịch đảo thứ tự các subkey
4 Chương trình Demo
Chúng em xin phép được báo cáo chương trình Demo trong một buổi khác
5 Kết luận
Thuật toán có độ an toàn cao hơn thuật toán AES và có tốc độ nhanh hơn thuật toán DES
Vì yêu cầu ít bộ nhớ khi thực hiện, vì vậy thuật toán rất thích hợp
để thực hiện trên smart card (chính điều này giúp cho Serpent chiến thắng thuật toán CAST-256, mặc dù chúng có cùng hiệu năng và độ an toàn)
6 Tài liệu tham khảo
http:// w ikipedia.com
Bài giảng Mã hóa thông tin – Thầy Nguyễn Hiếu Minh, HV KTQS