Upload
nguyentuyen
View
215
Download
3
Embed Size (px)
Citation preview
Chương 7
MẬT MÃ KHÓA ĐỐI XỨNG
7.1 Lý thuyết cơ bản của Shannon
Nhiều người cho rằng kỷ nguyên của mật mã học hiện đại được bắt đầu với Claude
Shannon, người được coi là cha đẻ của mật mã toán học. Năm 1949 ông đã công bố bài
Lý thuyết về truyền thông trong các hệ thống bảo mật (Communication Theory of
Secrecy Systems) trên tập san Bell System Technical Journal - Tập san kỹ thuật của hệ
thống Bell - và một thời gian ngắn sau đó, trong cuốn Mathematical Theory of
Communication - Lý thuyết toán học trong truyền thông - cùng với tác giả Warren
Weaver. Những công trình này, cùng với những công trình nghiên cứu khác của ông về lý
thuyết về tin học và truyền thông (information and communication theory), đã thiết lập
một nền tảng lý thuyết cơ bản cho mật mã học và thám mã học. Với ảnh hưởng đó, mật
mã học hầu như bị thâu tóm bởi các cơ quan truyền thông mật của chính phủ, chẳng hạn
như NSA, và biến mất khỏi tầm hiểu biết của công chúng. Rất ít các công trình được tiếp
tục công bố, cho đến thời kỳ giữa thập niên 1970, khi mọi sự được thay đổi.
Claude Shannon xem xét mô hình 7.1, ở đây nguồn bản tin sinh ra bản rõ X, nguồn
khóa tạo ra khóa K, khóa K được truyền qua kênh mật từ nơi truyền đến nơi nhận.
Quá trình mã hóa biến đổi bản rõ X nhờ khóa thành bản mã Y: .
Quá trình giải mã, biến đổi bản mã nhận được Y thành bản rõ X cũng nhờ khóa K:
.
Tội phạm (hay thám mã) sẽ tìm cách nhận được bản rõ và khóa trên cơ sỡ bản mã.
Claude Shannon xem xét các câu hỏi lý thuyết và thực hành mật. Để nhận được lý
thuyết mật Shannon hình thành các câu hỏi sau:
1. Hệ thống ổn định ở mức độ nào, nếu như thám mã không giới hạn thời gian và
có tất cả các thiết bị cần thiết đối với việc phân tích bản mã?
2. Bản mã liệu có một nghiệm duy nhất hay không?
3. Với lượng thông tin bản mã bao nhiêu mà thám mã cần thu nhặt để nghiệm trở
nên duy nhất?
Để trả lời câu hỏi của Shannon chúng ta đưa vào định nghĩa “tuyệt mật” với sự hổ trợ
các điều kiện sau: Bản mã thu được không đêm đến cho thám mã bất kỳ thông tin nào.
Theo định lý Bayes
Hình 7.1. Mô hình truyền tin Shannon
Với P(X) là xác suất xuất hiện bản tin X; xác suất điều kiện, xuất hiện bản mã
Y với điều kiện bản tin X đã được chọn, có nghĩa là tổng xác suất của tất cả các khóa, mà
các khóa này chuyển bản tin X tương ứng với bản mã Y; P(Y)-xác suất nhận được bản
mã Y; là xác suất nhận được bản rõ X với điều kiện nhặt được bản mã Y. Để
“tuyệt mật” thì giá trị của và cần phải bằng nhau với tất cả giá trị của X và
Y.
Để chống lại phương pháp phân tích thống kê bản mã (đây là một cách thám mã)
Shannon đề ra hai phương pháp: khuyết tán và pha trộn.
Định nghĩa Entropy thông tin. Entropy thông tin mô tả mức độ hỗn loạn trong một
tín hiệu lấy từ một sự kiện ngẫu nhiên. Nói cách khác, entropy cũng chỉ ra có bao nhiêu
thông tin trong tín hiệu, với thông tin là các phần không hỗn loạn ngẫu nhiên của tín hiệu.
Lý thuyết về thông tin sẽ trình bày đầy đủ hơn về Entropy, ở đây chúng tôi chỉ đưa ra
cái cơ bản.
Claude E. Shannon đã xây dựng định nghĩa về entropy để thoả mãn các giả định sau:
1. Entropy phải tỷ lệ thuận liên tục với các xác suất xuất hiện của các phần tử
ngẫu nhiên trong tín hiệu. Thay đổi nhỏ trong xác suất phải dẫn đến thay đổi
nhỏ trong entropy.
2. Nếu các phần tử ngẫu nhiên đều có xác suất xuất hiện bằng nhau, việc tăng
số lượng phần tử ngẫu nhiên phải làm tăng entropy.
Nguồn khóa
Nguồn bản tin
Mã hóa Giải mã Nhận bản tin
Tội phạm
K
K’X’
XY
X
K
3. Có thể tạo các chuỗi tín hiệu theo nhiều bước, và entropy tổng cộng phải
bằng tổng có trọng số của entropy của từng bước.
Shannon cũng chỉ ra rằng bất cứ định nghĩa nào của entropy, cho một tín hiệu có thể
nhận các giá trị rời rạc, thoả mãn các giả định của ông thì đều có dạng:
Với K là một hằng số, chỉ phụ thuộc vào đơn vị đo; n là tổng số các giá trị có thể nhận
của tín hiệu; i là giá trị rời rạc thứ i; p(i) là xác suất xuất hiện của giá trị i;
Nếu một sự kiện ngẫu nhiên rời rạc x, có thể nhận các giá trị là 1..n, thì entropy của
nó là:
,
với p(i) là xác suất xảy ra của giá trị i.
Entropy thông tin trong trường hợp phần tử tín hiệu ngẫu nhiên rời rạc còn được gọi
là entropy Shannon.
7.2 Định nghĩa mật mã đối xứng
Định nghĩa. Mật mã đối xứng là hệ mật mà quá trình mã hóa và quá trình giải mã
dùng chung một khóa mật, và việc bảo mật bản tin phụ thuộc vào quá trình lưu khóa mật.
Sơ đồ tổng quát của hệ mã đối xứng được miêu tả ở hình 7.2.
Hình 7.2. Sơ đồ mật mã đối xứng
Bản tin nguồn (X)
Quá trình mã hóa
Bản mã Y truyền qua
kênh
Quá trình giải mã
(X=)
Bản tin giải mã X
Khóa mật (K) khóakhóa
Tạo ra khóa mật
ở đây bản tin nguồn X là thông tin cần mã để bảo mật, trước khi chuyển đến nơi nhận
nó phải được mã hóa bằng hàm mã hóa E, hàm mã hóa E là tổng hợp các phép biến đổi
với sự tham gia của khóa mật K; qua biến đổi của hàm E chúng ta thu được bản mã Y;
bản mã Y truyền qua kênh thông tin đến nơi người cần nhận, ở nơi nhận với sự giúp đở
của quá trình giải mã và khóa mật K, sẽ giải bản mã Y thành bản tin X ban đầu. Chú ý,
nếu như khóa K không đúng, hoặc bản mã Y bị biến đổi trong quá trình truyền thì quá
trình giải mã không thể thu được bản tin ban đầu X.
Như đã nói, mật mã đối xứng được chia ra làm hai phần, mật mã khối và mật mã
dòng. Chúng ta xem định nghĩa về chúng.
Định nghĩa mật mã khối. Mã khối là tổ hợp lệnh toán học (hoán vị, thay thế,…)
biến đổi dãy N bit thành một dãy N bit
với sự tham gia của khóa mật k từ không gian khóa K, có thể
viết dưới dạng
,
ở đây F là hàm mã hóa hay giải mã.
Định nghĩa mã dòng. Là một hệ mã đối xứng, trong đó từng ký tự của bản rõ được
biến đổi thành ký tự của bản mã phụ thuộc không chỉ vào khóa sử dụng mà còn vào vị trí
của nó trong bản rõ. Mã khối thì chia bản rõ ra các khối bằng nhau rồi thực hiện mã, nên
sẽ có một số khối giống nhau mã cùng một khóa, ở mã dòng thì không như vậy.
7.3 Các lệnh dùng để xây dựng thuật toán mật mã đối xứng
Hầu như tất cả các hệ mật đối xứng đảm bảo bảo mật thông tin thường được xây dựng
trên cơ sở các lệnh cơ sở sau:
7.3.1 Lệnh hoán đổi
Định nghĩa. Đây là phương pháp biến đổi mật mã đơn giản, là một phép hoán đổi các
vị trí của các kí tự trong bản rõ theo một quy luật nào đó. Chúng ta có thể biểu diễn
chúng bằng toán học như sau:
Hoán đổi của tập hữu hạn , với gồm n phần tử, là một đơn ánh từ tập vào tập ,
, lệnh hoán đổi có dạng sau:
,
ở đây hang đầu tiên là vị trí ký tự của bản rõ, hang thứ 2 là các vị trí mà ký tự ban đầu
cần hoán đổi tương ứng, khi ), tức là vị trí thứ đổi
cho vị trí thứ , vị trí thứ đổi cho vị trí thứ tương tự như thế. Giá trị n gọi là chiều
dài hoán đổi.
Ví dụ:
.
Tập hợp tất cả các lệnh hoán đổi ký hiệu là , và rõ ràng rằng .
Có nhiều cách biểu diễn lệnh hoán vị. Ví dụ như từ ví dụ trên ta có các cách biểu diễn
sau:
.
Chúng ta thấy lệnh hoán đổi như một hàm, tham số của nó là số nguyên, hàm này có
thể ký hiệu ,với .
Tiêu chuẩn xây dựng nên lệnh hoán đổi: Chúng ta phải xây dựng lệnh hoán đổi sao
cho đạt được độ phát tán tốt, nhằm tăng hiệu ứng thác lũ.
7.3.2 Lệnh thay thế.
Định nghĩa.Trong mật mã, lệnh thay thế có thể hiểu là một qúa trình thay một số
phần tử này bằng một số phần tử khác, hay nói cách khác là thay thế một ký tự hay một
nhóm ký tự của bản tin bằng một ký tự hay một nhóm ký tự khác. Theo toán học thì
chúng ta có thể định nghĩa như sau:
Lệnh thay thế S là một ánh xạ s: , với là tập hữu hạn và với , tồn
tại duy nhất một phần tử .
Đối với lệnh hoán đổi có dạng:
,
Với . Các giá trị không bắt buộc là khác nhau.
Ví dụ lệnh thay thế 2 bit này thành 2 bít khác:
Tuy nhiên một số phép thay thế có thể biểu diễn ở dạng khác như đồ thị, dùng hàm
số…vv.
Tiêu chí để xây dựng nên lệnh thay thế: Khi sử dụng lệnh thay thế phải có được các
tính chất: Bậc đại số cao, có độ phi tuyến tính lớn, tạo ra tính tính pha trộn bít và phát tán
bít tốt.
7.3.3 Mạng hoán vị thay thế
Kết hợp lệnh hoán vị và lệnh thay thế, có thể xây dựng nên mạng hoán vị thay thế.
Đây là cấu trúc xen kẻ nhiều lớp mỗi lớp kết hợp phép thay thế và phép hoán vị. Với
mạng thay thế hoán vị, có thể tạo cho thuật toán có độ phân tán vào xáo trộn rất tố.
Chúng ta tìm ví dụ mạng hoán vị thay thế được miêu tả ở hình 7.3, đầu vào là 32 bít
qua mạng chuyển vị 4 lớp, mỗi lớp gồm 8 bảng thay thế 4 bít cho 4 bít, các bảng này có
thể khác nhau, sau phép thế là phép hoán vị.
Hình 7.3.Mạng hoán vị thay thế S_BOX 32/22
Để tạo ra mạng hoán vị, chúng ta cần tính toán đến hiệu quả thác lũ để chọn ra cách
xây dựng như ý.
7.3.4 Lệnh Gamma dành cho mã dòng
Nguyên lý cơ bản của mã dòng là tạo ra chuỗi khóa, cũng thường hay gọi là tạo ra
khóa dòng hay khóa dịch hay gamma được cho bằng chuỗi bít … Chuỗi bít
này sẽ cộng với chuỗi bít bản rõ để nhận được chuỗi bản mã:
Ở bên nhận bản mã sẽ cộng bản mã với cùng chuỗi khóa đó để khôi phục lại bản mã
ban đầu:
Sự vững chắc của hệ mã phụ thuộc hoàn toàn vào cấu trúc bên trong sinh ra chuỗi
khóa. Nếu việc sinh ra không tạo ra chuỗi với chu kỳ lớn thì hệ sẽ không vững chắc.
Có thể biểu diễn bằng sơ đồ sau quá trình mã và giải mã tương ứng ở hình 7.4 và 7.5.
Hình 7.4. Quá trình mã hóa gamma
Hình 7.5. Quá trình giải mã gamma
Độ an toàn khi dùng lệnh gamma. Claude Shannon đã chứng minh rằng mã bằng
lệnh gamma là tuyệt đối an toàn.
Chứng minh của Shannon:
Giả sử X và Y là giá trị ngẫu nhiên rời rạc. X là giá trị ngẫu nhiên đối với bản rõ, Y là giá trị
ngẫu nhiên đối với gamma, khi đó luật phân bố X sẽ là
X 0 1
p 1-p
Luật phân bố Y là
Y 0 1
1/2 1/2
ở đây là xác suất gặp X, hoặc Y. Ở đây chúng thấy trong số gamma thì xác suất gặp 0
và 1 là như nhau. Z là giá trị ngẫu nhiên rời rạc cho bản mã. Từ hình chúng ta thấy rằng
Z=X+Y (mod 2). Chúng ta đi tính xác suất gặp 0 và 1 trong định luật phân bố Z:
Chúng ta dùng:
1) , nếu như A và B không giao nhau
2) , nếu như A và B độc lập
Chúng ta có:
P(Z=0) = P(X=0,Y=0)+P(X=1,Y=1) =
ip
ik
Bản rõ
gamma Bản mã ic
ic
ik
Bản mã
gamma Bản rõ ip
= P(X=0)*P(Y=0)+P(X=1)*P(Y=1) =p*1/2+(1-p)*1/2 = 1/2 .
Nên
P(Z=1) = 1-P(Z=0) = ½.
Điều này chúng ta thấy luật phân bố Z là đối xứng, có nghĩa là chúng ta nhận được
gamma hoặc là nhiễu (tức là Z không bao gồm một thông tin nào từ X) nên mã tuyệt
đối an toàn.
Cách chọn gamma:
1) Đối với từng trường hợp dùng gamma khác nhau;
2) Để tạo ra gamma dùng phương pháp tạo số ngẫu nhiên;
3) Gamma phải dài tương ứng với bản mã;
4) Lựa chọn gamma một cách thông minh để thám mã khó mò.
Mã dòng rất hữu ích đối với mã dòng dữ liệu liên tục, ví dụ trong mạng truyền tải dữ
liệu.
7.4 Một số sơ đồ dùng để thiết kế hệ mật
7.4.1 Mạng Feistel và các kiểu biến dạng của nó
Một trong các phương pháp thông dụng tạo ra mã khối là dựa trên cấu trúc có tên là
Feistel được Horst Feisel tạo ra. Cấu trúc một vòng của mạng Feistel biểu diễn hình 7.6.
Hình 7.6. Sơ đồ 1 vòng Feistel
Trong sơ đồ này thì hàm F là hàm cơ bản để xây nên khối mạng Feistel, nó luôn được
chọn là hàm phi tuyến tính và trong tất cả các trường hợp nó không có hàm ngược. Hàm
F có hai thám số, một là nữa khối bên phải và tham số còn lại là khóa.
R
F(R,K)
L’=R R’=F(R,K)
K
R
Giả sử X là khối bản tin, biểu diễn dưới dạng hai khối con có độ dài như nhau
. Lúc này một vòng của mạng có thể biều diễn như sau, giả sử sau i vòng ta thu
được , thì vòng thứ i+1 sẽ là:
.
Mã khối xây dựng trên cơ sở mạng Feistel có r vòng như thế, số vòng này xác định độ
an toàn của hệ mã, và vòng cuối cùng không thực hiện hoán đổi giữa khối con bên phải
và khối con bên trái, tức là
,
Việc làm này không ảnh hưởng đến độ an toàn của thuật toán mã, mà nó sẽ làm cho
quá trình mã hóa và giải mã là hai quá trình thuận nghịch nhau, tức là sau khi mã chúng
ta thu được , để giải mã, chúng ta dung đúng thuật toán mã hóa, tham số của thuật toán
bây giờ là khối dữ liệu là và thực hiện r vòng với đảo thứ tự các khóa con ngược với
quá trình mã hóa, chúng ta thu được bản tin ban đầu.
Ưu và nhược điểm khi thực hiện mã khối trên cơ sở mạng Feistel.
Ưu điểm.
1. Quá trình mã hóa và giải mã trùng nhau, chỉ khác nhau ở thứ tự khóa con,
điều này sẽ tiết kiệm được nữa tài nguyên khi thực hiện thuật toán trên phần
cứng.
2. Hàm F có thể chọn với độ khó bất kỳ, vì không phải tìm hàm nghịch.
Nhược điểm.
1. Vì mỗi vòng mã chỉ thực hiện biến đổi nữa khối dữ liệu, nên cần số vong mã
hóa lớn để đảm bảo độ an toàn của hệ mật, điều này làm giảm đáng kể tốc độ
mã.
2. Ngoài ra xây dựng trên cơ sở mạng Feistel tồn tại lớp khóa tương đương, nên
làm không gian khóa giảm đi một nữa.
Ngoài ra chúng ta thấy nếu xây dựng một mã khối có kích cở lớn thì dùng mạng
Feistel với hai nhánh ở trên không thuận lợi, lúc này chúng ta dùng mạng Feistel 4 nhánh
với các kiểu của nó biểu diễn ở hình 7.7, 7.8 và 7.9.
Hình 7.7. Cấu trúc mở rộng mạng Feistel loại 2
Hình 7.8. Cấu trúc mở rộng mạng Feistel loại 3
Hình 7.9. Cấu trúc mở rộng mạng Feistel loại 2
7.4.2 Sơ đồ cấu trúc cộng nhân
2X 3X 4X
F
K
2X 3X 4X
F
K
2X 3X 4X
F
K
Cấu trúc cộng nhân có thể xem như là một trong các kiểu hạt nhân cấu tạo nên các
hàm vòng, trong đó sử dụng các phép toán số học đơn giản và được nghiên cứu cẩn thận.
Cấu trúc này được đề xuất bởi J.L.Massey và X.Lai. Cấu trúc được cho như hình vẻ 7.10.
Hình 7.10. Sơ đồ cấu trúc cộng nhân
ở đây đây ta dùng hai phép toán số học là cộng và nhân theo modulo trong nhóm
tương ứng và là các véctơ đầu vào, là các khóa, là véc tơ đầu ra.
Ưu điểm của cấu trúc. Khi thiết kế mã khối theo cấu trúc cộng nhân, thì mã khối có
tính khuyếch tán tốt.
7.5 Các bước cơ bản để thiết kế một hệ mật
Khi thiết kế mật mã thì vấn đề đảm bảo độ vững chắc của thuật toán là một vấn đề
quan trọng nhất.Và đây cũng là vấn đề phức tạp nhất. Đánh giá độ vững chắc của thuật
toán là một trong các công đoạn lâu nhất và khó nhất. Vì chưa có một lý thuyết hoàn
chỉnh để đánh giá độ an toàn của mã khối nên phương pháp sáng tạo là một cách quan
trọng nhất để đánh giá. Thế nhưng có thể đưa ra một số yêu cầu chung để xây dựng nên
một thuật toán mật mã. Nếu như mật mã thỏa mãn nhưng yêu cầu đó thì nói rằng thuật
toán an toàn.
Cần chú ý rằng vấn đề đảm bảo độ an toàn cao chưa phải là một mục đích duy nhất,
bởi khi xây dựng thuật toán mật mã đảm cần bảo được tốc độ mã hóa và việc thực hiện
chúng trên phần cứng và phần mền có phức tạp hay không cũng là yêu cầu không kém
quan trọng. Phụ thuộc vào yêu cầu của ứng dụng mà chọn sơ đồ mật mã và các bước
đánh giá cho phù hợp tức là tầm quan trọng của ứng dụng quyết định cho chúng ta chọn
1K
1X 2X
2K
1Y 2Y
thuật toán tương ứng với tham số mật mã (như công suất, độ phức tạp thực hiện,..vv).
Quá trình xây dựng thuật toán mã khối được tiến hành theo các bước sau:
1. Nghiên cứu lĩnh vực ứng dụng. Ở bước này thực hiện chọn lựa kiểu hệ mật
và hình thành các yêu cầu ứng với tham số cơ bản của hệ mật. Mã dòng cho
phép nhận được tốc độ mã hóa cao nhất và đảm bảo khả năng độc lập biến đổi
từng bit và byte, và cho phép giảm khả năng lỗi khi truyền bản mật mã qua
kênh. Thế nhưng đối với mã dòng tỏ ra khó khoăn khi truy cập bất kỳ đến dữ
liệu mã hóa. Khuyết điểm này có thể tránh nếu sử dụng phần tử khóa gamma
phụ thuộc vào khóa mật và số thứ tự của phần tử đó. Trong các mật mã thế này
có dấu hiệu của mật mã khối. Hiện nay các mật mã khối được sử dụng rộng rãi
nhất. Mã khối đảm bảo được tính an toàn cao ở chế độ độc lập mã hóa từng
khối, và cho phép truy cập bất kỳ đến dữ liệu mã hóa. Trong số các thiết bị bảo
mật thông tin từ truy cập trai phép sử dụng các thuật toán mật mã file với tốc
độ cao ở chế độ on-line với sự kết hợp các kiểu hệ mật, tức là mã dòng và mã
khối. Ở mã dòng thực hiện biến đổi độc lập từng byte, nhưng nó thực hiện mã
phụ thuộc vào thứ tự của byte trong từng file và vào các dấu hiệu đặc biệt của
file. Căn cứ vào lĩnh vực ứng dụng mà xác định các giá trị của các phương án
thực hiện (chương trình, máy), độ phức tạp khi thực hiện trên máy và tốc độ
mã.
2. Lựa chọn chiều dài khóa mật. Cần chú rằng, bất kỳ một hệ mật với một chiều
dài khóa hữu hạn luôn luôn tồn tại khả năng tìm kiếm khóa mật bằng phương
pháp véc cạn khóa. Hiện nay đối với trường hợp tổng quát thì chiều dài khóa
được cho là an toàn nếu không nhỏ hơn 128 bit, nhưng trong một số trường
hợp riêng có thể dùng khóa với chiều dài 64 bit, có khi 56 bit, nếu như thông
tin cần bảo vệ không quá quan trọng.
3. Lựa chọn cách miêu tả khóa. Chúng ta có những cách miêu ta tả khóa khác
nhau, phần này xem cụ thể ở phần các cách miêu tả khóa.
4. Lựa chọn các phần tử mật mã cơ sở và cách xử lý hệ mật. Để hoàn thành
bước này cần am hiểu các phương pháp cơ bản để xây dựng mật mã, kiểu khối
các hệ mật, hiểu được từng lệnh sử dụng trong hệ mật, và cũng cần đánh giá về
chi phí khi thực hiện trên phần cứng cũng như thời gian trể của nó.
5. Đánh giá tài nguyên cần thiết để thực hiện thuật toán mật mã. Xem các
khả năng thực hiện trên phần cứng và phần mềm. Thực hiện các thí nghiệm
cũng như mô hình hóa chương trình cho hệ mật.
6. Đánh giá về cống suất của mật mã. Xác định tốc độ mã đối với các phương
án thực hiện khác nhau trên phần cứng và phần mềm. Nếu như trên bước 5 và
6 kết quả đánh giá nhận được không thỏa mãn giá trị mục đích của bước 1, thì
quay lại bước 4.
7. Xem độ an toàn của hệ mật đối với các kiểu tấn công mật mã khác nhau .
Xem xét các cách thám mã cơ bản, cũng như các khả năng tấn công khác với
việc sử dụng các ứng dụng đặc biệt. Dựa trên các cách tấn công đó, xác định
được độ khó tấn công và từ đó đánh giá được độ an toàn của hệ mật.
8. Biến đổi thuật toán. Cân nhắc kết qủa nhận được trên bước 7, có thể biến đổi
thuật toán, chọn lựa các phần tử tối ưu cho hệ mật nhằm nâng cao độ khó cho
cách tấn công hệ mật hiệu quả nhất. Nếu cần có thể lặp lại một số lần ở bước
này với các các thay đổi khác nhau nhằm đạt được mục đích.
9. Thực hiện phân tích chi tiết biến đổi hệ mật. Nếu như phân tích chi tiết vạch
ra sự tồn tại điểm yếu của hệ mật trong sơ đồ biến đổi thì lặp lại bước 8, nếu
cần có thể lặp lại cả bước 4.
10. Thực hiện kiểm tra thống kê và các thì nghiệm đặc biệt. Trên bước này
thực hiện chương trình thuật toán của hệ mật hoặc thực hiện chúng trên phần
cứng và tiến hành kiểm tra thống kê và các thí nghiệm đặc biệt, lập quy hoạch
kết quả phân tích để kiểm tra toàn diện và tương ứng với lý thuyết. Ngoài ra
việc kiểm tra hệ mật cũng chú ý đến các khả năng tấn công mới. Bước phân
tích hệ mật được tiếp tục thực hiện trong quá trình sử dụng hệ mật.
Các cách miêu tả khóa
1. Sử dụng tính trước. Ở đây chúng ta sử dụng một quá trình hay thuật toán để
biến đổi khóa mật thành khóa mở rộng. Việc sử dụng quá trình tính toán ban
đầu để mở rộng khóa cho phép đảm bảo được sự phụ thuộc phức tạp của
khóa vòng vào khóa mật. Cách làm này, nếu như có một thuật toán mở rộng
tốt thì sẽ tránh tấn công của thám mã nhằm đạt được khóa mật. Thế nhưng
phương pháp này có nhược điểm là sẽ làm giảm tốc độ mã trong ứng dụng ở
chế độ khóa phiên. Ngoài ra khi thực hiện trên máy cần tốn thêm một lượng
tài nguyên để thực hiện sơ đồ mở rộng khóa.
2. Trực tiếp sử dụng khóa mật. Ở đây sử dụng một phần khóa mật (kích cở là
32 hoặc 64 bit) cho mỗi vòng mã. Tiêu biểu cho cách sử dụng này là thuật
toán chuẩn liên xô 28147-89, chúng ta sẽ xem chi tiết thuật toán này ở phần
sau. Nhược điểm của phương pháp này là khóa vòng phụ thuộc rõ ràng vào
khóa mật nên thám mã có thể lợi dụng ở đây mà tấn công. Ngoài ra thực hiện
trực tiếp khóa mật tồn tại phần lớn lớp khóa yếu, tức là các khóa mà dùng
cho quá trình mã hóa và quá trình giải mã trùng nhau. Mặc dầu khóa yếu rất
hiếm xuất hiện và khi xử lý hệ mật thì tìm cách để tránh xuất hiện nó. Ưu
điểm khi dùng trực tiếp khóa mật làm khóa vòng là đảm bảo được tốc độ mã
ở chế độ khóa phiên và cũng không cần thêm tài nguyên cho quá trình mở
rộng khóa khi thực hiện trên máy.
3. Hình thành khóa vòng trong quá trình mã khối dữ liệu. Ở phương pháp
này thì vòng đầu tiên của quá trình mã sử dụng một phần khóa mật, nhưng
khi hoàn thành mã vòng đầu tiên thì hình thành khóa con cho vòng thứ hai.
Và khi mã vòng hai xong rồi thì tính toán khóa con cho vòng thứ ba và cứ
tiếp tục như thế. Quá trình giải mã cũng có qúa trình hình thành tương tự. Và
rõ ràng chúng ta thấy quan hệ khóa con giữa hai qúa trình mã và giải mã là
vòng mã thứ i và giải mã thứ R-i+1 có khóa con như nhau, ở đây R là số
vòng mã hay giải mã. Phương pháp này thì cũng cần thêm một lượng tài
nguyên khi thực hiện trên phần cứng nhưng nó đảm bảo được tốc độ mã ở
chế độ khóa phiên.
4. Biến đổi khóa con phụ thuộc vào biến đổi dữ liệu. Ở phương pháp này thì
một phần khóa mật được sử dụng trực tiếp, nhưng trước khi nó tham gia biến
đổi trên khối dữ liệu con thì nó bị biến đổi bằng lệnh, lệnh này phụ thuộc giá
trị hiện tại của một trong các khối con. Lệnh này có thể thực hiện đồng thời
với biến đổi của khối dữ liệu con khác, cho nên nó không làm giảm tốc độ
mã hóa. Phương pháp này cũng tồn tại xuất hiện khóa yếu, nhưng vấn đề này
có thể khắc phục bằng cách xây dựng hệ mật có một vòng mã không là thuận
nghịch (involution). Phương pháp này còn dễ thực hiện trên phần cứng và
đảm bảo được tốc độ cao ở chế độ khóa phiên.
7.6 Chuẩn mã khối DES và các biến dạng của nó
7.6.1 Tổng quan về DES.
DES (viết tắt của Data Encryption Standard, hay Tiêu chuẩn Mã hóa Dữ liệu) là một
phương pháp mật mã hóa được FIPS (Tiêu chuẩn Xử lý Thông tin Liên bang Hoa Kỳ)
chọn làm chuẩn chính thức vào năm 1976. Sau đó chuẩn này được sử dụng rộng rãi trên
phạm vi thế giới. DES mã hóa một xâu bit x dài 64 bằng một khóa có độ dài 56 bit. Và tất
nhiên bản mã cũng có độ dài 64 bit. Vì lý do DES có khóa mật quá ngắn, nên với kỹ
thuật hiện nay thì DES hoàn toàn bị phá. Nhưng để hiểu sâu về mã khối chúng ta không
thể không biết về DES.
Miêu tả thuật toán DES. Sơ đồ miêu tả DES được cho ở hình 7.11.
Hình 7.11 Sơ đồ thuật toán DES
Ta giải thích sơ đồ thuật toán, có thể xem thuật thuật toán có 3 giai đoạn sau:
1. Khối bản rõ x có độ dài 64. Nó sẽ bị biến đổi bằng lệnh hoán vị IP:
,
Với hoán vị IP được cho bảng dưới.
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
IP
Bản rõ x
1k
2k
16k
1IPBản mã y
F
F
F
Ở đây ta hiểu là, bit thứ 58 sẽ đổi về vị trí 1, bit thứ 50 về vị trí 2, tương tự như
thế cho các bit còn lại. Khối chia thành hai khối con có độ dài bằng nhau
.
2. Khối sẽ bị biến đổi qua 16 vòng, mỗi vòng sẽ biến đổi đúng trong
miểu tả mạng Feistel, tức là , chú ý là mỗi vòng sẽ có
một khóa ,khóa này được tạo ra bởi hàm tính toán khóa con, chúng ta sẽ nói
ở phần sau. Hàm F được miêu tả bằng sơ đồ trên hình 7.12:
Hình 7.12 Sơ đồ miêu tả hàm F của DES
Diễn giải sơ đồ như sau: Hàm F có hai tham số đầu vào, là khối dữ liệu 32 bit và
khóa con 48 bit, khối dữ liệu 32 bit sẽ mở rộng bằng hàm mỡ rộng E, để thành
48 bit, hàm E biểu diễn bằng bảng chọn bít sau:
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
24 25 26 27 28 29
28 29 30 31 32 1
E
32 bít dữ liệu
48 bít
48 bít khóa con
S2 S3 S4 S5 S6S1 S7 S8
P
32 bít
Sau đó nó cộng loại trừ với khóa con 48 bit, như hình vẽ, ta sẽ thu được 48 bit,
48 bít này sẽ đi qua 8 bảng hoán đổi , mỗi bảng S có 64 phần tử,xếp
thành 4 hàng, mỗi hàng 16 phần tử, mỗi phần tử là 4 bít. Giả sử đầu vào mỗi
bảng hoán đổi là 6 bít , thì đầu ra sẽ là 4 bít, cách xác định 4 bit
đó như sau: 2 bit xác định thứ tự hàng của bảng S, 4 bít xác định
cột của bảng S, và phần tử cần xác định tương ứng có hàng thứ và cột thứ
. Kết quả của quá trình hoán đổi chúng ta thu được là 32 bít. 32 bít này
sẽ thực hiện tiếp một hoán vị P và 32 bít nhận được là đầu ra của hàm F, với P
được cho ở bảng sau:
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
6 bảng S được cho như sau:
S1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
2 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
3 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
S2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
1 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
2 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
3 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
S3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
1 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
2 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
3 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
S4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
1 13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
2 10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
S5 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
1 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
2 4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
3 11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
S6 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
1 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
2 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
3 4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
S7 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
1 13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
2 1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
3 6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
S8 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
2 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
3 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
Chú ý. Quá trình mã hóa thì thứ tự khóa con tham gia lần lượt cho 16 vòng là
, quá trình giải mã thì thực hiện theo thứ tự ngược lại.
3. Qua 16 vòng, ta thu được 64 bit, và 64 bít này lại tiếp tục thực hiện hoán vị
ngược của hoán vị ta thu được 64 bít mã. tính ra như sau:
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
Quá trình sinh khóa con được miêu tả bằng sơ đồ hình 7.13.
Hình 7.13 Sơ đồ sinh khóa DES
PC1
Khóa 64 bít
<<< <<<
PC2
PC2
<<< <<<
PC2
<<<<<<
<<< <<<
PC2
Giải thích sơ đồ. Quá trình sinh khóa có thể chia ra hai giai đoạn sau:
1. Với 64 bit khóa ban đầu, ta loại các bit kiểm tra tính chẳn lẻ, còn lại 56 bit ta
thực hiện hoán vị cố định PC1, với PC1 được cho ở bảng dưới:
57 49 41 33 25 17 9 1 58 50 42 34 26 48
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
Với 56 bít nhận được phân chia ra hai khối con, mỗi khối 28 bít .
2. Với i chạy từ 1 đến 16 thực hiện các bước sau:
Hai khối con bít thực hiện dịch vòng trái bít, với mảng
, thu được 2 khối 28 bít tương ứng.
Trong 56 bít thu được, ta thực hiện hoán vị cố định PC2 có 48 phần tử để thu
được khóa con chiều dài là 48 bít, PC2 được cho ở bảng sau:
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
Chúng ta thấy PC2 vừa là hoán vị vừa là bảng chọn 48 bít từ 56 bít.
Biến dạng của DES.
Như nói ở phần trước, vì hạn chế của DES trước các phương pháp tấn công, nên họ
tìm cách làm tăng khả năng an toàn cho thuật toán. Chúng ta sẽ tìm hiểu hai cách biện
dạng hiệu quả trong số các biến dạng của DES.
3DES.
Sở dĩ nó có tên là 3DES bởi vì người ta dùng 3 lần liên tiếp DES với 3 khóa khác
nhau để mã hóa/giải mã. Chúng ta xem sơ đồ mã hóa 3DES trên hình 7.14, với E là quá
trình mã hóa của DES, tương ứng với quá trình giải mã là D.
D E
3KE
1KM
C
Hình 7.14. Sơ đồ 3DES
Viết gọn như sau:
Tức là bản tin ban đầu M sẽ được mã hóa bởi khóa được , tiếp tục giải mã bởi
được , tiếp tục mã hóa bởi được bản mã là C. Quá trình giải mã thì ngược lại,
tức là bản mã C sẽ giải mã bởi khóa thu được , mã hóa bởi thu được ,
giải mã bởi ta thu được bản tin ban đầu M. Lúc này chiều dài khóa sẽ là 56.3=168 bít.
Chúng ta dễ dàng nhận thấy nếu thì 3DES trở thành DES.
Nhưng tốt về hướng an toàn thuật toán thì có vấn đề về tốc độ thì 3DES khá chậm so
với bản thân DES, chính xác là chậm đi 3 lần so với DES. Ngoài ra khi thực hiện trên
phần cứng cũng tốn khá nhiều tài nguyên.
DESX.
Năm 1984 Ron revert giới thiệu một DES mới có tên là DESX, khắc phục được
nhược điểm của DES. DESX được xác định như sau:
Khóa của DESX có chiều dài là 54+64+64=184 bít. Để mã khối dữ liệu M, đầu tiên
khối dữ liệu M sẽ cộng theo modulo 2 với khóa theo từng bít, kết quả thu được được
mã hóa bỡi DES với khóa và cuối cùng lại cộng từng bít theo modulo 2 với khóa .
DESX làm tăng khả năng bảo vệ DES chống tấn công véc cạn khóa và đảm bảo được
độ an toàn chống lại các khả năng tấn công khác. Ngoài ra thuật toán này thực hiện đơn
giản và khi thực hiện trên phần cứng cũng đạt hiểu quả cao.
7.7 Thuật toán chuẩn mã khối Liên Xô GOST 28147-89
Đây là thuật toán có cấu trúc khá giống DES nhưng dễ thực hiện hơn, tốc độ mã lớn
hơn DES, hiện đang được sử dụng rộng rãi ở Nga. Nó mã hóa khối dữ liệu 64 bít, với
khóa là 256 bít. Đặc biệt thuật toán này dùng khóa mật trực tiếp tham gia vào quá trình
mã hóa, mà không sử dụng quá trình mở rộng khóa. Sơ đồ thuật toán được miêu tả ở hình
7.15.
Hình 7.15 Sơ đồ thuật toán chuẩn Liên Xô GOST 28147-89
Thuật toán thực hiện 32 vòng biến đổi. S ở đây hàm thay thế 32 bít này thành 32 bít
khác, nó bao gồm 8 bảng , mỗi bảng có 16 phần tử, mỗi phần tử 4 bít, 8 bảng
này được giữ bí mật để tạo thêm tham số mật cho hệ và nó được thay đổi theo chu kỳ thời
gian.
Các khóa con có chiều dài là 32 bít, nó được hình thành từ khóa mật. Khóa mật 256
bít chia ra 8 khóa con . Và cách sử dụng các khóa con tương ứng với qúa trình
mã hóa và giải mã được miêu ta trong bảng sau.
Vòng thứ i 1 2 3 4 5 6 7 8 9 10 11
Mã hóa Qi K1 K2 K3 K4 K5 K6 K7 K8 K1 K2 K3
Giải mã Qi K1 K2 K3 K4 K5 K6 K7 K8 K8 K7 K6
Vòng thứ i 12 13 14 15 16 17 18 19 20 21 22
Mã hóa Qi K4 K5 K6 K7 K8 K1 K2 K3 K4 K5 K6
Giải mã Qi K5 K4 K3 K2 K1 K8 K7 K6 K5 K4 K3
S <<<11
1Q
S <<<11
2Q
S <<<11
32Q
Bản rõ 64 bít
Bản mã 64 bít
Vòng thứ i 23 24 25 26 27 28 29 30 31 32
Mã hóa Qi K7 K8 K1 K2 K3 K4 K5 K6 K7 K8
Giải mã Qi K2 K1 K8 K7 K6 K5 K4 K3 K2 K1
Có thể miêu ta thuật toán theo các bước sau:
Khối dữ liệu ban đầu chia ra thành hai khối con (L,R) có chiều dài là 32 bít. Và 1
vòng của thuật toán thực hiện biến đổi theo các bước sau:
1. Khối L cộng với khóa con theo modulo .
2. 32 bít thu được ở bước 1, chia ra 8 phần mỗi phần 4 bít, 4 bít này qua phép
hoán đổi ta thu được 32 bít mới.
3. 32 bít ở bước 2 tiếp tục bị biến đổi với phép dịch vòng trái 11 bít.
4. Kết quả nhận được ở bước 3 tiếp tục cộng từng bít theo modulo 2 với nhánh
R và thực hiến hoán đổi theo mạng Feistel và thực hiện vòng biến đổi mới.
7.8 Thuật toán mã khối Blowfish
Thuật toán này tuy không thông dụng như DES nhưng đây là thuật toán có độ an toàn
cao và dễ thực hiện hơn DES, do Bruce Schneier đề xuất năm 1993. Thuật toán này cũng
có 16 vòng, và xây dựng trên cơ sỡ sơ đồ Feistel. Blowfish mã hóa khối dữ liệu 64 bít, và
dùng khóa có chiều dài từ 32 đến 448 bít, tùy ứng dụng mà chúng ta chọn chiều dài khóa
thích hợp. Chúng ta xem sơ đồ thuật toán Blowfish ở hình 7.16.
Hình 7.16 Sơ đồ thuật toán Blowfish
1k
F
16k
F
18k 17k
14 vòng tiếp theo
64 bít dữ liệu/mã
64 bít mã/dữ liệu
Miêu tả thuật toán: Từ khóa mật hình thành nên 18 khóa con chiều dài 32
bít và 4 ma trận kích thước 256, mỗi phần tử có độ lớn là 32 bít:
Q0(1), Q1
(1), …, Q255(1);
Q0(2), Q1
(2), …, Q255(2);
Q0(3), Q1
(3), …, Q255(3);
Q0(4), Q1
(4), …, Q255(4).
ở đây Q(i) được dùng đối với hàm F(X), với X có độ lớn 32 bít. Hàm F được miêu tả như
sau. X - 32 bít biểu diễn dưới dạng sau: X= x3 | x2 | x1 | x0. Sau đó diễn ra quá trình tính
F(X) như sau
F(X) = {[(Qx3(1) + Qx2
(2)) mod 232] Qx1(3)} + Qx0
(4) ( mod 232).
Hàm F miêu tả ở hình 7.17.
Hình 7.17. Sơ đồ miêu tả hàm F của Blowfish
Thuật toán Blowfish có thể trình bày dưới dạng sau:
Thuật toán mã hóa:
Đầu vào: 64 bít khối dữ liệu rõ T=L|R, tức là biểu diễn dưới dạng 2 khối con có chiều
dài 32 bít.
1) Thiết lập i = 1.
2) Biến đổi gía trị khối con L và tính giá trị V hiện tại:
L := L Ki;
V := F(L).
3) Biến đổi khối con R:
R := R V.
4) Nếu như i = 16, thì chuyển sang bước 7.
5) Tính i := i+1 và thực hiện hoán đổi giữa R và L:
1S 2S 3S 4S
32 bít
32 bít
32 bít
8 bít8 bít8 bít8 bít
W := R; R := L; L := W.
6) Chuyển về bước 2.
7) Biến đỗi khối con R:
R := R K17.
8) Biến đổi khối con L:
L := L K18.
Đầu ra: 64-bít khối bản mã L | R.
Thuật toán giải mã:
Đầu vào: 64-bít khối bản mã C = L | R.
1) Biến đổi khối con R:
R := R K17.
2) Biến đổi khối con L:
L := L K18.
3) Thiết lập i = 16.
4) Tính giá trị hiện tại của V và biến đổi khối con R:
V := F(L);
R := R V.
5) Biến đổi khối con L:
L := L K17-i.
6) Nếu i=1, thì chuyển sang bước 9.
7) Hoán đổi giữa R và L:
W := R; R := L; L := W.
8) i := i-1 và chuyển về bước 4.
Đầu ra là khối bản rõ: L | R.
7.9 Hệ mật mã khối RC2
Tác giả của nó là Ron Rivest – một trong 3 tác giả của hệ mật nổi tiếng RSA. RC2 sử
dụng khối có độ dài 64 bits, khóa có độ dài từ 8 đến 1024 bits. Thuật toán trong RC2
được thiết kế để có thể dễ dàng (và hiệu quả) triển khai trong hệ thống với bộ vi xử lý 16
bits (độ dài thanh ghi bằng 16 bits). Tốc độ mã của RC2 lớn hơn rất nhiều so với DES,
còn về độ an toàn thì có thể lớn hơn hoặc nhỏ hơn phụ thuộc vào chiều dài khóa mật
được chọn. Thực toán này thuộc sở hữu của công ty RSA Security Inc, nên muốn sử dụng
nó phải được đồng ý của công ty này. Chúng ta xem các thủ tục của thuật toán RC2.
Tạo khóa con
RC2 thực hiện một loạt thao tác với khóa chính để tạo 128 bytes khóa con. Khóa con
này được ghi trong mảng bytes: L[0], L[1], ..., L[127]. Một số phép biến đổi trong RC2
sẽ được mô tả đơn giản hơn nếu biểu diễn khóa con trên dưới dạng mảng các từ 2 bytes:
K[0], K[1], ..., K[63].
Giả sử khóa chính có độ dài T bytes (1 ≤ T ≤ 128). Trong RC2 có dự trù sẵn một thủ
tục cho phép làm giảm độ phức tạp của khóa đối với mã thám. Thủ tục này được sử dụng
trong trường hợp sản phẩm được dành để xuất khẩu. Ở đây chúng ta sẽ không xem xét
thủ tục này. Việc tạo khóa con được thực hiện bằng cách sao chép khóa chính (T bytes)
vào mảng L (128 bytes). Sau đó giá trị mảng L được thay đổi với sự trợ giúp của mảng
giả ngẫu nhiên P[0..255], mỗi phần tử P[i] có kích thước 1 bytes. Mảng P được sinh ra
bằng cách sử dụng các chữ số thập phân của số π. Phép biến đổi này có thể được mô tả
như sau:
Khi i chạy từ T đến 127 thực hiện:
L[i] = P[L[i-1] + L[i-T]]
L[128-T] = P[L[128-T]]
Khi i chạy từ 127-T về 0 thực hiện L[i]=P[L[i+1] L[i+T]]
Quá trình mã hóa.
Khối bản tin đầu vào 64 bít được biểu diễn dưới dạng 4 từ 16 bits: R[0], R[1], R[2],
R[3] và kết quả đầu ra được ghi vào chính các từ này. Thuật toán RC2 chứa 18 vòng, 16
vòng “xáo trộn” (mixing round) và và 2 vòng “nghiền nát” (mashing round), chúng ta đi
tìm hiểu hai vòng này dành cho quá trình mã hóa.
Mixing round.
Vòng Mixing round hình thành từ 4 thủ tục con MIX transformation, thủ tục MIX
transformation, thủ tục này miêu tả ở hình 7.18.
Hình 7.18. Thủ tục MIX - transformation
Vòng mixing round có thể biểu diễn dưới dạng công thức sau:
R[0] = R[0] + K[j] + (R[3] ^ R[2]) + (NOT(R[3]) ^ R[1])
R[0] = R[0] <<< 1
j=j+1
R[1] = R[1] + K[j] + (R[0] ^ R[3]) + (NOT (R[0]) ^ R[2])
R[1] = R[1] <<< 2
j=j+1
R[2] = R[2] + K[j] + (R[2] ^ R[0]) + (NOT (R[1]) ^ R[3])
R[2] = R[2] <<< 3
j=j+2
R[3] = R[3] + K[j] + (R[2] ^ R[1]) + (NOT (R[2]) ^ R[0])
R[3] = R[3] <<< 5
j=j+3
Mashing round.
4 từ R[0], R[1], R[2], R[3] được biến đổi bằng cách cộng với khóa con, ở đây việc
chọn khóa con K[j] phụ thuộc vào giá trị biến đổi dữ liệu:
R[0] = R[0] + K[R[3] & 63];
R[1] = R[1] + K[R[0] & 63];
R[2] = R[2] + K[R[1] & 63];
R[3] = R[3] + K[R[2] & 63];
Quá trình mã hóa
Sau khi định nghĩa mixing round và mashing round, ta đã có thể mô tả quá trình mã
hóa của RC2. Nó bao gồm các bước sau đây (trong dấu ngoặc là giá trị của j sau khi thực
hiện các chu kỳ tương ứng):
1. giá trị cho j=0.
2. Thực hiện 5 mixing rounds (j=20).
3. Thực hiện 1 mashing round.
4. Thực hiện 6 mixing rounds (j=44).
5. Thực hiện 1 mashing round.
6. Thực hiện 5 mixing rounds (j=64).
Quá trình giải mã
Quá trình giải mã thực hiện giống như quá trình mã hóa, nhưng các phép toán trong
quá trình giải mã thì ngược với quá trình mã hóa. Tức là 2 vòng Mixing round và
Mashing round được viết lại như sau:
Mixing round.
Vòng mixing round có thể biểu diễn dưới dạng công thức sau:
R[3] = R[3] - K[j] - (R[2] ^ R[1]) - (NOT (R[2]) ^ R[0])
j=j-1
R[2] = R[2] >>>3
R[2] = R[2] - K[j] - (R[2] ^ R[0]) - (NOT (R[1]) ^ R[3])
j=j-1
R[1] = R[1] >>> 2
R[1] = R[1] - K[j] - (R[0] ^ R[3]) - (NOT (R[0]) ^ R[2])
j=j-1
R[0] = R[0] >>> 1
R[0] = R[0] - K[j] - (R[3] ^ R[2]) - (NOT(R[3]) ^ R[1])
j=j-1;
Mashing round.
4 từ R[0], R[1], R[2], R[3] trong quá trình giải mã thực hiện như sau:
R[3] = R[3] - K[R[2] & 63];
R[2] = R[2] - K[R[1] & 63];
R[1] = R[1] - K[R[0] & 63];
R[0] = R[0] - K[R[3] & 63];
Quá trình giải mã cũng tiến hành trong 18 vòng như sau.
1. Gán giá trị cho j=63.
2. Thực hiện 5 mixing rounds (j=43).
3. Thực hiện 1 mashing round.
4. Thực hiện 6 mixing rounds (j=19).
5. Thực hiện 1 mashing round.
6. Thực hiện 5 mixing rounds (j=0).
Chú ý: các phép toán trong 2 vòng Mixing round và Mashing round đều thực hiện
theo modulo .
7.10 Hệ mật mã khối RC5
Giống như RC2 đây cũng là sản phẩm của tác giả Ron Rivest đề xuất năm 1994.
Nhưng hệ này tỏ ra mềm dẻo hơn trong việc lựa chọn tham số cho hệ mật, cụ thể là kích
thước khối mã có thể là 32, 64 hoặc 128, khóa có độ dài từ 0 đến 2040 bít, số vòng từ 0
đến 255. Tham số ban đầu đề xuất là khối mã 64 bít, khóa 128 bít và số vòng là 12.
Tạo khóa con
Trong RC5 quy định một thủ tục phức tạp để tạo t khóa con từ khóa chính K, mỗi
khóa con có kích thước w bít. Mỗi chu kỳ sử dụng 2 khóa con. Ngoài ra còn có 2 khóa
con được sử dụng trong một phép biến đổi không thuộc bất kỳ chu kỳ nào. Như thế, số
lượng khóa con cần tạo là t=2r+2. Các khóa con được lưu trong mảng t phần tử: S[0],
S[1], ..., S[t-1], kích thước của mỗi phần tử phụ thuộc vào kích thước khối dữ liệu chọn.
Sơ đồ sinh khóa con được miêu tả ở hình 7.19.
Hình 7.19. Quá trình sinh khóa con của RC5
Bước 1. Với r là số vòng, w= kích thước khối / 2 . Hàm Odd[x] cho số lẻ gần x nhất.
Bước này thực hiện loạt các phép tính sau:
, với e = 2,718281828459,
, với ,
Cụ thể tính ra như sau, các giá trị của , ở dạng hexa:
w 16 32 64
B7E1 B7E15163 B7E151628AED2A6B
9E37 9E3779B9 9E3779B97F4A7C15
Thuật toán khởi tạo mảng S có thể biểu diễn như sau:
S[0] = Pw
Với i từ 1 đến t-1 thì thực hiện: S[i] = (S[i-1] + Qw) (mod )
Bước 2
Khóa chính được lưu trong mảng K[0..b-1] gồm b phần tử, mỗi phần tử có kích thước
1 byte. Biến đổi mảng K thành mảng L[0..c-1] gồm c phần tử, mỗi phần tử có kích thước
w bít, giá trị ban đầu của mỗi phần tử bằng 0. Nếu b chia hết w thì c = b/w; nếu b không
chia hết w thì c = b/w + 1. Phép biến đổi từ K sang L chỉ đơn giản là sao chép các byte
của mảng K sang mảng L theo đúng thứ tự trong K. Trong trường hợp b không chia hết w
thì có một số bits bên phải của L sẽ giữ nguyên bằng 0.
Bước 3.
Thực hiện một thủ tục “xáo trộn” để kết hợp giá trị mảng L với giá trị khởi tạo của
mảng S nhằm xác định giá trị cuối cùng cho mảng khóa con S. Để đạt được điều này cần
duyệt 3 lần mảng lớn nhất trong hai mảng L, S:
i = j = X = Y = 0
do 3×max(t,c) times
begin
S[i] = (S[i] + X + Y) <<< 3; X = S[i]; i = (i+1) mod t
L[j] = (L[j] + X + Y) <<< (X+Y); Y=L[j]; j = (j+1) mod c
end
Tác giả RC5 Ron Rivest khẳng định rằng thủ tục sinh khóa con mang tính chất của
hàm một chiều – rất khó có thể xác định khóa K khi biết mảng S.
Quá trình mã hóa
Thuật toán mã hóa được thể hiện trên hình 7.20.a. Mỗi thanh ghi A, B có độ dài bằng
w bít. Khối tin trước hết được đưa vào 2 thanh ghi này. Để phân biệt phần trái và phần
phải của đầu ra ở chu kỳ thứ i ta sử dụng ký hiệu LEi và REi.
Hình 7.20. Sơ đồ miêu tả quá trình mã hóa và giải mã RC5
Thuật toán
LE0 = (A + S[0]) (mod );
RE0 = (B + S[1])(mod );
For i=1 to r do
begin
LEi = (((LEi-1 REi-1) <<< REi-1) + S[2×i]) ]) (mod );
REi = (((REi-1 LEi) <<< LEi) + S[2×i + 1]) ]) (mod );
End
Quá trình giải mã
Từ thuật toán mã hóa có thể dễ dàng suy ra thuật toán giải mã. Sơ đồ thuật toán giải
mã được thể hiệnt trên hình 7.20.b). Đầu tiên, 2 từ của khối mã được gán cho 2 biến là
LDr và RDr – kích thước mỗi biến là 1 từ (w bits). Phần trái và phần phải của của đầu vào
ở chu kỳ thứ i ký hiệu là LDi và RDi, i=1..r.
Thuật toán
For i=r downto r do
begin
RDi-1 = ((RDi – S[2×i + 1] >>> LDi) LDi) ]) (mod );
LDi-1 = ((LDi – S[2×i] >>> RDi-1) RDi-1) ]) (mod );
end
B=(RD0–S[1]) ]) (mod );
A = (LD0 – S[0]) ]) (mod );
Ưu điểm của RC5
RC5 có 2 ưu điểm nổi bật là:
1. Thực toán đơn giản
2. Phép quay là phép biến đổi phi tuyến tính duy nhất trong RC5. Ron Rivest khẳng
định rằng việc số bits trong các phép quay phụ thuộc vào giá trị của bản thân khối
dữ liệu được xử lý sẽ gây khó khăn rất lớn cho việc thám RC5 bằng phương pháp
thám tuyến tính, cũng như thám vi phân.
RC5 là hệ mật còn mới (được Ron Rivest xây dựng năm 1994). RSA Laboratories đã
bỏ ra nhiều thời gian để khảo sát hệ mật này khi làm việc với khối 64 bits. Chỉ sau 5 chu
kỳ RC5 đã cho kết quả thống kê “rất tốt”. Sau 8 chu kỳ mỗi bit của bản tin sẽ ảnh hưởng
ít đến nhất một phép quay. Để có thể thám RC5 với 5 chu kỳ bằng phương pháp thám vi
phân (Differential Cryptanalysis) thì cần phải lựa chọn và thử 224 khối tin; con số này sẽ
là 245 với 10 chu kỳ, 253 với 12 chu kỳ, 268 với 15 chu kỳ (trong khi đó, số bản tin tối đa là
264). Vì thế không thể dùng phương pháp thám vi phân để thám RC5 với 15 chu kỳ trở
lên.
Kết quả nghiên cứu khả năng tấn công RC5 bằng thám tuyến tính (Linear
Cryptanalysis) cho thấy RC5 tỏ ra an toàn khi số chu kỳ không nhỏ hơn 6. Rivest khuyến
cáo sử dụng RC5 với số chu kỳ không nhỏ hơn 12, tốt nhất là 16.
7.11 Hệ mật mã khối IDEA
Lịch sử ra đời
“Chuẩn mã hóa dữ liệu quốc tế” (IDEA – International Data Encryption Algorithm)
là một hệ mật thuộc nhóm mã khối. Nó được xây dựng bởi hai thành viên của Viện công
nghệ Thụy Điển là Xuejla Lai và James Massey. Phiên bản đầu tiên được công bố trong
[LAI90] vào năm 1990 dưới cái tên PES (Proposed Encryption Standard). Ngay năm sau
(1991), sau khi Biham và Shamir công bố phương pháp mã thám mới là “thám vi phân”
thì các tác giả đã cải biên thuật toán PES để chống lại phương pháp thám mã đó. Bản cải
biên được đặt tên là IPES (Improved PES) và được đổi thành IDEA vào năm 1992. IDEA
được mô tả chi tiết trong các ấn phẩm [LAI91] và [LAI92].
Miêu tả IDEA
IDEA mã hóa và giải mã theo từng khối 64 bits. Khóa có chiều dài 128 bít. Thực hiện
trong 9 vòng.
Quá trình sinh khóa con.
Như đã nói ở trên chiều dài khóa trong IDEA là 128 bits. Nhưng bản thân thuật toán
IDEA lại sử dụng đến 52 khóa con với kích thước mỗi khóa là 16 bits. Như vậy cần có
một thủ tục để sinh 52 khóa con này từ khóa mẹ 128 bits. Thủ tục thực hiện như sau:
1. Gán i=0
2. 128 bít khóa ban đầu K[1..128] được chia thành 8 phần, mỗi phần 16 bits.
Bằng cách đó ta có được 8 khóa con: k1+i=K[1..16], k2+i=K[17..32], ..., k6+i=K[81..96],
k7+i=K[97..112], k8+i=K[113..128].
3. Dịch K sang trái 25 bít,
4. Nếu chưa sinh đủ 52 khóa con thì i=i+8, quay lại bước 2.
IDEA thực hiện 9 vòng mã, 8 vòng giống nhau, 1 vòng có cấu trúc như hình 7.21.
Hình 7.21. Sơ đồ miêu tả IDEA
Vòng thứ 9 của IDEA có cấu trúc được miêu tả trên hình 7.22.
Hình 7.22 Sơ đồ miêu tả vòng cuối của IDEA
Quá trình mã hóa được viết dưới dạng thuật toán sau:
Đầu vào: là khối rõ 64 bít chia ra 4 phần , 52 khóa con
Khi i chạy từ 1 đến 8 thực hiện các biến đổi sau:
Begin
ik 1
iX ,1 iX ,2
ik 4ik 2ik 3
iX ,3 iX ,4
ik 5
ik 6
1,2 iX 1,3 iX 1,4 iX1,1 iX
49k
8,1X
52k50k 51k
8,2X 8,3X 8,4X
9,1X 9,2X 9,3X 9,4X
;
;
; ; ;
;
; ; ;
End
Đầu ra là 64 bít bản mã
Quá trình giải mã:
Thuật toán quá trình giải mã giống quá trình mã hóa, chỉ khác là phải dùng phép biến
đổi khóa con. Mà cụ thể là các khóa được dùng trong phép cộng module 216 phải được
chuyển thành phần tử đối của chúng, còn các khóa được dùng trong phép nhân module
216+1 thì phải chuyển thành phẩn tử nghịch đảo tương ứng.
Bảng sau đây cho biết quy tắc dùng khóa khi mã hóa và giải mã: Gọi quá trình
giải mã với các khóa con là
Mã hóa Giải mã
Số tt
vòn
g
Các khóa con Tương ứng với Các khóa con Tương ứng với
1 K[1..96]
2 K[97..128;26..89]
3 K[90..128;1..25;51..82
]
4 K[83..128;1..50]
5 K[76..128;1..43]
6 K[44..75;101..128;1..3
6]
7 K[37..100;126..128;1..
29]
8 K[30..125]
9 K[23..86]
7.12 Hệ mật mã khối MARS
Đặc điểm chung: MARS không giống với phần lớn các thuật toán mã khối khác,
IBM thiết kế MARS với một cấu trúc mới lạ, nó có cấu trúc bất đồng nhất
(heterogeneous). Thuật toán sử dụng các khóa biến đổi giữa 128 và 448 bít (biến đổi trên
32 bít). Thuật toán bao gồm 32 vòng với 2 kiểu cấu trúc, được chia thành 8 phần thực
hiện. Các thành phần cơ bản trong 1 vòng thường là các toán tử cộng số nguyên, cộng
mod2 và dịch vòng. Vì vậy thuật toán có hiệu suất hoạt động rất cao trên hầu hết các nền
(platform) thực hiện (có một số hạn chế khi thực hiện trên smart card). MARS khác với
tất cả các thuật toán AES chung kết khác là không dựa trên các cấu trúc đã biết vì vậy độ
an toàn của thuật toán rất khó ước lượng. Nói chung ưu điểm chính của MARS là nó rất
bền vững, trong thuật toán có sử dụng nhiều các cơ chế “fail stop” hơn so với các thuật
toán AES chung khảo khác. Nhờ có cấu trúc bất đồng nhất và sự đa dạng của các toán tử
bền vững, vì vậy thậm chí với các tấn công thành công trên một thành phần nào đó của
thuật toán, cũng sẽ không dẫn tới 1 tấn công thành công trên toàn bộ thuật toán. Thực tế,
với 12 vòng MARS là không an toàn, vì vậy số vòng tối thiểu sử dụng của nó là 20.
Mô tả thuật toán:
Đầu vào thuật toán là khối 128 bít, chia ra làm 4 nhánh, mỗi nhánh 32 bít. Thuật hiện
32 vòng mã. Quá trình mã gồm 6 giai đoạn sau:
1> Cộng khóa
2> 8 vòng trộn tới
3> 8 vòng mã tới
4> 8 vòng mã lùi
5> 8 vòng trộn lùi
6> Trừ khóa.
Được miêu tả như hình 7.23.
Hình 7.23. Sơ đồ thuật toán MARS
Giai đoạn trộn tới có 8 vòng, biểu diễn bởi hình 7.24.
Hình 7.24 Sơ đồ trộn tới
Giai đoạn trọn lùi cũng có 8 vòng, được cho như hình 7.25.
Hình 7.25. Sơ đồ trộn lùi
Các S0 và S1 là các hàm hoán đổi, tham số của nó là một số x có độ lớn là 1 byte, với
sự hổ trợ của bảng S-boxes gồm 512 phần tử, thực hiện như sau S0 là thêm vào 1 bít 0
vào đầu của x, tức là y=S-boxes[0 & x ], còn hàm S1 thì thêm vào đầu x bít 1, tức là hàm
S1 thực hiện như sau: y=S-boxes[1 & x]. Cách chọn x được đưa ra như sau, từ nhánh
nguồn (nhánh chọn các byte) có 4 byte b0, b1, b2, b3 theo thứ tự b0 là byte thấp nhất, đến b3
là byte cao nhất. b0, b2 làm tham số cho S0 còn b1 và b3 làm tham số cho S1.
Giai đoạn mã tới có 8 vòng, và mã lùi có 8 vòng, 2 giai đoạn này thể hiện như hình vẻ
7.26.
Hình 7.26. Sơ đồ giai đoạn mã tới và mã lùi
Hàm mở rộng E được cho như hình 7.27.
Hình 7.27. Sơ đồ miêu tả hàm mở rộng F
S đơn giản là phép thay thế 9 bít cuối cùng của nhánh thứ hai (nhánh out2) qua bảng
S-boxes để thu được 32 bít.
E-function (input: in, key1,key2)
1. // we use three temporary variables, L, M, R
2. 2. M=in+key1 //add first key word
3. R=(in<<<13) key2 //multiply by end key word, which must be odd
4. i= lowest 9 bits of M
5. L=S[i] //S-box lookup
6. R=R<<<5
7. r=lowest 5 bits of R //these bits specify rotation amount
8. M=M<<<r //1st data-dependent rotation
9. L=L R
10. R=R<<<5
11. L=L R
12. r=lowest 5 bits of R // these bits specify rotation amount
13. L=L<<<r //2st data-dependent rotation
14. output (L, M, R)
Trong 32 vòng mã, sử dụng 40 khóa con 32 bít, 40 khóa con này được mở rộng từ khóa
mật k[] bằng hàm Key–Expansion , k có độ dài từ 4 đến 14 từ 32 bít. Hàm Key–
Expansion có đặc điểm:
1. Hai bít thấp nhất của một từ trong khóa sử dụng đối với phép nhân có giá trị là 1.
2. Không có từ nào trong khóa chứa liên tiếp 10 bít 0 hay 10 bít 1.
Thủ tục Key–Expansion bao gồm các bước sau:
1. Ban đầu, nội dung khóa gốc được chép vào một mảng tạm T[] (có độ dài là 15 từ),
tiếp theo là số n và cuối cùng là các số 0. Nghĩa là:
[0.. T n−1]=k[0..n−1],T[n]=n,T[n+1..14] = 0
2. Sau đó, các bước dưới đây được thực hiện lặp lại bốn lần tương ứng với j=0,1,2,3.
Mỗi lần lặp sẽ tính giá trị của 10 từ kế tiếp trong khóa mở rộng:
a) Mảng T[] được biến đổi sử dụng công thức tuyến tính sau:
for i = 0 to 14
T[i]=T[i] ((T[i−7mod15] T[i−2mod15])<<<3) (4i+ j)
b) Kế đến, mảng T[] sẽ được biến đổi qua bốn chu kỳ của mạng Feistel loại 1:
T[i]=(T[i] + S-box[9 bit thấp của T[i–1 mod 15]]) <<< 9, với i = 0, 1, …, 14.
c) Sau đó, lấy 10 từ trong mảng T[], sắp xếp lại rồi đưa vào thành 10 từ kế tiếp của
mảng khóa mở rộng K[]:
K[10j + i] = T[4i mod 15], i = 0,1,…,9
3. Cuối cùng, xét 16 từ dùng cho phép nhân trong mã hóa (bao gồm các từ K[5], K[7],
…, K[35]) và biến đổi chúng để có hai đặc tính nêu trên. Cần lưu ý là khả năng từ được
chọn lựa ngẫu nhiên không thỏa đặc tính thứ hai (tức là từ có 10 bit liên tiếp bằng 0 hoặc
bằng 1) là khoảng 1/41. Mỗi từ K[5], K[7], K[9]…, K[35] được xử lý như sau:
a) Ghi nhận hai bit thấp nhất của K[i] bằng cách đặt j=K[i]^3. Sau đó, xây dựng từ w
dựa trên K[i] bằng cách thay thế hai bit thấp nhất của K[i] bằng giá trị 1, tức là w=K[i]v3.
b) Xây dựng một mặt nạ M của các bit trong w thuộc một dãy gồm 10 (hoặc nhiều hơn)
bit 0 hoặc 1 liên tiếp. Ta có Ml = 1 nếu và chỉ nếu wl thuộc một dãy 10 bit 0 hoặc 1 liên
tục. Sau đó đặt lại 0 cho các bit 1 trong M tương ứng với điểm cuối của đường chạy các
bit 0 hoặc 1 liên tục trong w, cũng làm như vậy đối với 2 bit thấp nhất và 1 bit cao nhất
của M. Như vậy, bit thứ i của M được đặt lại giá trị 0 nếu i < 2, hoặc i = 31 , hoặc nếu bit
thứ i của w khác bit thứ (i +1) hoặc bit thứ (i −1).
c) Tiếp theo, sử dụng một bảng B (gồm bốn từ) cố định để “sửa w”. Bốn phần tử
trong B được chọn sao cho mỗi phần tử (cũng như các giá trị xoay chu kỳ khác được xây
dựng từ phần tử này) không chứa bảy bit 0 hoặc mười bit 1 liên tiếp nhau. Cụ thể, các tác
giả sử dụng bảng B[] = {0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978}, (đây là
các phần tử thứ 265 đến 268 trong S–box). Lý do chọn các phần tử này là chỉ có 14 mẫu
8 bit xuất hiện hai lần trong các phần tử này và không có mẫu nào xuất hiện nhiều hơn
hai lần.
Sử dụng hai bit j (ở bước (a)) để chọn một phần tử trong B và sử dụng năm bit thấp nhất
của K[i–1] để quay giá trị của phần tử được chọn này, tức là:
p = B[j] <<< (5 bit thấp nhất của K[i–1])
d) Cuối cùng, thực hiện XOR mẫu p với w sử dụng mặt nạ M và lưu kết quả trong
K[i]:
K[i]=w (p^M)
Do hai bit thấp nhất của M là 0 nên hai bit thấp nhất của K[i] sẽ là 1 (do những bit này
trong w là 1). Ngoài ra, việc chọn giá trị của mảng B bảo đảm rằng K[i] không chứa dãy
mười bit 0 hoặc 1 liên tục.
Lưu ý rằng thủ tục này không chỉ đảm bảo rằng các từ K[5], K[7], K[9]…, K[35] có
hai đặc tính nêu trên mà còn giữ được tính chất “ngẫu nhiên” của các từ này, tức là không
có bất kỳ một giá trị của từ đơn nào có xác suất lớn hơn trong sự phân bố đồng. Sử dụng
phương pháp vét cạn, có thể kiểm chứng được rằng không có mẫu 20 bit nào xuất hiện
trong các từ này với xác xuất lớn hơn 1.23 x 2–20. Tương tự, không có mẫu 10 bit nào xuất
hiện với xác suất lớn hơn 1.06 x 2–10. Các yếu tố này được sử dụng trong việc phân tích
thuật toán.
Key-Expansion (input:k[], n; output: K[])
1. //n is the number of words in the key buffer k[], ( )
2. //K[] is the expanded key array, consisting of 40 words
3. //T[] is a temporary array, consisting of 15 words
4. //B[] is a fixed table of four words
5. //Initialize B[]
6. B[] = {0xa4a8d57b, 0x5b5d193b, 0xc8a8309b, 0x73f9a978}
7. //Initialize T[] with key data
8. T[0…n-1]=k[0…n-1], T[n]=n, T[n+1…14]=0
9. //Four iterations, computing 10 words of K[] in each
10. for j=0 to 4 do
11. for i=0 to 14 do //Linear transformation
12. T[i]=((T[i-7 mod 15] T[i-2 mod 15])<<<3) (4i+j)
13. repeat four times //Four stirring rounds
14. for i=0 to 14 do
15. T[i]=(T[i]+S[low 9 bits of T[i-1 mod 15]]<<<9
16. end –repeat
17. for i=0 to 9 do //store next 10 words into K[]
18. K[10j+i]=T[4i mod 15]
19. end for
20. //Modify multiplication keys
21. for i=5,7,9,…,35 do
22. j= least two bits of K[i]
23. w=K[i] with both of the least two bits set to 1
24. //Generate a bit - Mask M
25. Ml= 1 iff wl belongs to a sequence of ten consecutive 0’s or 1’s in w
26. and also and wl-1=wl=wl+1
27. Select a pattern from the fixed table and rotate if
28. r= least five bits of K[i-1] //Rotation amount
29. p=B[j]<<<r
30. // Modify K[i] with p under the control of the mask M
31. K[i]=w (p^M)
32. end for
MARS-encrypt(input: D[], K[])
Phase (I): Forward mixing – trộn tới
1. // First add subkeys to data
2. for i=0 i = 0 to 3 do
3. D[i]=D[i]+K[i]
4. // Then do eight rounds of forward mixing
5. for i=0 0 to 7 do // use D[0] ] to modify D[1],D[2],D[3]
6. // four S-box look-ups
7. D[1]=D[1] S0[low byte of D[0]]
8. D[1]=D[1]+S1[[ 2nd byte of D[0]]
9. D[2]=D[2]+S0[3rd byte of D[0]]
10.D[3]=D[3] S1[high byte of D[0]]
11.// and rotation of the source word to the right
12.D[0]=D[0]>>>24
13.// followed by additional mixing operations
14.if i=0 or i=4 then
15.D[0]=D[0]+D[1]// add D[1] ] back to the source word
16.if i=1 or i=5 then
17.D[0]=D[0]+D[1]// add D[1] ] back to the source word
18.// rotate D[] ] by one word to the right for next round
19.(D[3],D[2],D[1],D[0]) (D[0],D[3],D[2],D[1])
20.end-for
Phase (II): Keyed transformation
21. // Do 16 rounds of keyed transformation
22. for i=0 to 15 do
23. (out1, out2, out3)=E-function(D[0],K[2i+4],K[2i+5])
24. D[0]=D[0]<<<13
25. D[2]=D[2]+out2
26. if i<8 then // first 8 rounds in forward mode
27. D[1]=D[1]+out1
28. D[3]=D[3] out3
29. else // last 8 rounds in backwards mode
30. D[3]=D[3]+out1
31. D[1]=D[1] out3
32. end-if
33. // rotate D[] by one word to the right for next round
34. (D[3],D[2],D[1],D[0]) (D[0],D[3],D[2],D[1])
35. end-for
Phase (III): Backwards mixing –trộn lùi
36. // Do eight rounds of backwards mixing
37. for i=0 to 7 do
38. // additional mixing operations
39. if i=2 or i=6 then
40. D[0]=D[0]-D[3]3] // subtract D[3] from source word
41. if i=3 or i=7 then
42. D[0]=D[0]-D[1]1] // subtract D[1]] from source word
43. // four S-box look-ups
44. D[1]=D[1] S1[ low byte of D[0]]
45. D[2]=D[2] - S0[high byte of D[0]]
46. D[3]=D[3]- S1[ 3rd byte of D[0]]
47. D[3]=D[3] S0[2nd byte of D[0]]
48. // and rotation of the source word to the left
49. D[0]=D[0]<<<24
50. // rotate D[0] by one word to the right for next round
51. (D[3],D[2],D[1],D[0]) (D[0],D[3],D[2],D[1])
52. end-for
53. // Then subtract subkeys from data
54. for i=0 to 3 do
55. D[i]=D[i]-K[36+i]
Quy trình giải mã là nghịch đảo của quy trình mã hóa. Mã giả cho quy trình giải mã
của thuật toán MARS tương tự với mã giả của quy trình mã hóa của thuật toán:
MARS-derypt(input: D[], K[])
Phase (I): Forward mixing –trộn tới
1. // First add subkeys to data
2. for i=0 i = 0 to 3 do
3. D[i]=D[i]+K[36+i]
4. // Then do eight rounds of forward mixing
5. for i=7 to 0 do
6. //rotate D[] by one word to the left for this round
7. (D[3],D[2],D[1],D[0]) (D[2],D[1],D[0],D[3])
8. //and rotate of the source word to the right
9. D[0]=D[0]>>>24
10.//four S-box look-ups
11.D[3]=D[3] S0[2nd byte of D[0]]
12.D[3]=D[3]+S1[3rd byte of D[0]]
13.D[2]=D[2]+S0[high byte of D[0]]
14.D[1]=D[1] S1[low byte of D[0]]
15.// followed by additional mixing operations
16.if i=2 or i=6 then
17.D[0]=D[0]+D[3]// add D[3]3] back to the source word
18.if i=3 or i=7 then
19.D[0]=D[0]+D[1]// add D[1]1] back to the source word
20.end-for
Phase (II): Keyed transformation
21. // Do 16 rounds of keyed transformation
22. for i=15 to 0 do
23. //rotate D[] by one word to the left for this round
24. (D[3],D[2],D[1],D[0]) (D[2],D[1],D[0],D[3])
25. D[0]=D[0]>>>13
26. (out1, out2, out3)=E-function(D[0],K[2i+4],K[2i+5])
27. D[2]=D[2]-out2
28. if i<8 then // last 8 rounds in forward mode
29. D[1]=D[1]-out1
30. D[3]=D[3] out3
31. else // first 8 rounds in backwards mode
32. D[3]=D[3]-out1
33. D[1]=D[1] out3
34. end-if
35. end-for
Phase (III): Backwards mixing – trộn lùi
36. // Do eight rounds of backwards mixing
37. for i=7 to 0 do
38. // rotate D[] by one word the left for this round
39. (D[3],D[2],D[1],D[0]) (D[2],D[1],D[0],D[3])
40. //additional mixing operations
41. if i=0 or i=4 then
42. D[0]=D[0]-D[3]1] // subtract D[3]1] from source word
43. if i=1 or i=5 then
44. D[0]=D[0]-D[1] //subtract D[1] from source word
45. //and rotation of the source word to the left
46. D[0]=D[0]<<<24
47. //four S-box look-ups
48. D[3]=D[3] S1[high byte of D[0]
49. D[2]=D[2]-S0[3rd byte of D[0]]
50. D[1]=D[1]-S1[2nd byte of D[0]
51. D[1]=D[1] S0[low byte of D[0]
52. end-for
53. // Then subtract subkeys from data
54. for i=0 to 3 do
55. D[i]=D[i]-K[i]
7.13 Hệ mật RC6
Đặc điểm chung RC6: là thuật toán được phát triển từ RC5, được xây dựng dựa trên
cấu trúc cơ sở Feistel. Nó có thể được thực hiện trên các biến thể khác nhau (kích thước
khối dữ liệu đầu vào, kích thước khóa, số lượng vòng, trong cuộc thi AES thuật toán gồm
20 vòng, khóa có độ dài thay đổi được là 128 hoặc 192 hoặc 256 bít và khối mã có độ lớn
là 128 bít), vì thế thuật toán rất mềm dẻo đối với tất cả các cấp độ của độ an toàn và sự
hiệu quả. Thuật toán RC6 tương ứng với các tham số w/r/b, trong đó kích thước từ là w
bit, quy trình mã hóa bao gồm r chu kỳ và tham số b xác định chiều dài mã khóa tính
bằng byte. Trên thực tế, RC6 được xem như 2 quá trình mã hóa RC5 song song. RC6 bao
gồm 20 vòng, tác giả của thuật toán đã xác nhận rằng với 16 vòng, thuật toán có thể tấn
công với độ phức tạp 2119. Thuật toán có thể ít phù hợp trên một số nền nào đó vì trong
thuật toán có sử dụng các toán tử dịch vòng trên 32 bít (có thể biến đổi) và các phép nhân
số nguyên, nhưng khi các toán tử này được hỗ trợ, RC6 sẽ thực hiện nhanh hơn so với tất
cả các thuật toán AES chung kết khác. Nhược điểm chính của RC6 liên quan đến số
lượng vòng được sử dụng trong thuật toán.
Miêu tả thuật toán. Thuật toán RC6-w/r/b thực hiện trên các đơn vị bốn từ w bít sử
dụng 6 phép toán cơ bản và logarit cơ số 2 của w, ký hiệu là lgw.
a + b phép cộng số nguyên theo modulo 2w
a - b phép trừ số nguyên theo modulo 2w
a b phép XOR
a * b phép nhân số nguyên modulo 2w
a<<<b quay a sang trái b bít
a>>>b quay a sang phải b bít.
Sơ đồ thuật toán được cho như hình 7.28. Đầu vào là khối 4 từ w bít, thực hiện r
vòng. Trong sơ đồ có một hàm f: f(x)=x(2x+1).
Hình 7.28. Sơ đồ thuật toán RC6
Quá trình sinh khóa: Thuật toán sử dụng khóa mật có chiều dài b bytes, ở đây
. Từ khóa mật thực hiện mở rộng khóa thành 2r+4 từ (w bít mỗi từ). 2r+4 từ
này cóp vào mảng S[0,...,2r+3]. Mảng này sử dụng cho quá trình mã hóa và giải mã.
Trong thủ tục mở rộng khóa sử dụng các hằng số Pw và Qw như các “hằng số huyển bí”.
Thủ tục mở rộng khóa được thực hiện như sau. b byte khóa mật sẽ cóp vào mảng L[0,
…,c-1] (gồm c từ w bít), nếu thiếu thì thêm vào các byte 0, sau đó thực hiện các phép
biến đổi để tạo ra khóa con để lưu vào mảng S[]. Quá trình này được miêu tả bằng đoạn
lệnh sau:
Key schedule của RC6–w/r/b
Input:
Khóa (gồm b byte) do người dùng cung cấp được đưa vào mảng L[0,…, c–1] (gồm c–
từ)
r là số lượng chu kỳ
Output: Các khóa chu kỳ w bit S[0, …, 2r + 3]
Begin
S[0] = Pw
for i = 1 to 2r + 3
S[i] = S[i – 1] + Qw
A = B = i = j = 0
v = 3 × max{c; 2r + 4}
for s = 1 to v
A = S[i] = (S[i] + A + B) <<< 3
B = L[j] = (L[j] + A + B) <<< (A + B)
i = (i + 1) mod (2r + 4)
j = (j + 1) mod c
end for
End
Quy trình mã hóa và giải mã
RC6 làm việc với bốn từ w bit A, B, C, D chứa các dữ liệu đưa vào ban đầu cũng như
dữ liệu mã hóa đưa ra cuối quy trình mã hóa. Quy trình mã hóa, giải mã được cho bởi
đoạn miêu tả code giả sau:
Encryption/Decryption with RC6-w/r/b
Input: Plaintext stored in four w-bit input registers A, B, C & D
r is the number of rounds
w-bit round keys S[0, ... , 2r + 3]
Output: Ciphertext stored in A, B, C, D
// '''Encryption Procedure:'''
B = B + S[0]
D = D + S[1]
for i = 1 to r do
{
t = (B(2B + 1)) <<< lg w
u = (D(2D + 1)) <<< lg w
A = ((A ^ t) <<< u) + S[2i]
C = ((C ^ u) <<< t) + S[2i + 1]
}
A = A + S[2r + 2]
C = C + S[2r + 3]
// '''Decryption Procedure:'''
C = C - S[2r + 3]
A = A - S[2r + 2]
for i = r downto 1 do
{
(A, B, C, D) = (D, A, B, C)
u = (D.(2D + 1)) <<< lg w
t = (B.(2B + 1)) <<< lg w
C = ((C - S[2i + 1]) >>> t) ^ u
A = ((A - S[2i]) >>> u) ^ t
}
D = D - S[1]
B = B - S[0]
7.14 Hệ mật mã khối Serpent
Đặc điểm chung: Serpent là thuật toán được thiết kế dựa trên cấu trúc cơ sở là 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. 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ễ rà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).
Miêu tả thuật toán:
Quá trình mã hóa của Serpent được chia ra làm 3 giai đoạn sau:
1. Phép hoán vị đầu IP (initial permutation);
2. 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 32 bảng 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.
3. Phép hoán vị cuối FP (final permutation).Đây là phép hoán đổi nghịch của phép
hoán đổi ban đầu IP.
Sơ đồ thuật toán mã hóa của Serpent được cho như hình 7.29.
Hình 7.29. Sơ đồ miêu tả qúa trình mã hóa của Sepent
ở đây Kr là khóa vòng 128 bít, mỗi vòng dùng 32 bảng Si giống nhau, với i=r mod 8, r
là số thứ tự của vòng mã, 8 bảng DES, và biến đổi đầu và cuối xem phụ lục, còn phép
biến đổi tiến tính được cho như hình sau với đầu vào 128 bít chia ra làm 4 nhánh làm đầu
vào của biến đổi tuyến tính.
Quá trình giải mã của Serpent là biến đổi ngược của quá trình mã hóa, cũng có 32
vòng, và sơ đồ thuật toán được cho như hình 7.30:
Hình 7.30. Sơ đồ miêu tả qúa trình giải mã của Sepent
Hàm mở rộng khóa. Như chúng ta thấy quá trình mã hóa và giải mã cần đến 33 khóa
con 128 bít (K0, …, K32). Các khóa này hình thành từ khóa mật bằng hàm mở rộng khóa.
Hàm mở rộng được cho như sau. Khóa mật K ban đầu sẽ ghi ra thành 8 từ 32 bít (w -8, …,
w-1), nếu khóa K không đủ thì ta them vào dãy bít 100…0 để cho đủ, mở rộng 8 từ này
thành 132 khóa trung gian bằng công thức sau:
wi=(wi-8 wi-5 wi-3 wi-1 i )<<<11
ở đây là phần phân số của tỉ số vàng hay dạng số hexa 0x9e3779b9. Bằng cách
tạo ra các khóa trung gian theo công thức trên cho phép các bít khóa phân đều ở các chu
kỳ, tránh được khóa yếu. Từ các khóa trung gian này hình thành nên các khóa của chu kỳ,
nhờ giúp đở của bảng thay thế S-box như sau:
K0=S-box3 (w0, w1, w2,w3)
K1= S-box2 (w4, w5, w6,w7)
K3= S-box1 (w8, w9, w10,w11)
K4= S-box0 (w12, w13, w14,w15)
K5= S-box7 (w16, w17, w18,w19)
….
K31= S-box4 (w124, w125, w126,w127)
K32= S-box3 (w128, w129, w130,w131)
S-boxi ở đây 32 bảng Si liên tiếp nhau, để thay thế 128 bít khóa trung gian thành khóa
vòng.
7.15 Hệ mật mã khối Twofish
Đặc điểm chung: là thuật toán được thiết kế dựa trên thuật toán Blowfish (được thiết
kế dựa trên cấu trúc cơ sở là mạng Feistel). Twofish là thuật toán nhanh và không yêu
cầu nhiều bộ nhớ khi thực hiện. Cấu trúc của thuật toán rất phức tạp và do đó rất khó
phân tích (để đạt được sự mềm dẻo trong cấu trúc, các tác giả của thuật toán đã sử dụng
một số “kỹ xảo - tricks”, sự an toàn của các kỹ thuật này không rõ ràng, vì vậy trong 5
thuật toán chung khảo AES, Twofish là thuật toán khó phân tích nhất), điều này làm cho
nó giống như thuật toán MARS, nhưng nó có ưu điểm hơn là thiết kế được dựa trên một
thuật toán đã được nghiên cứu và đã phổ biến. Twofish bao gồm 16 vòng, tính năng đặc
biệt của nó là sử dụng các hộp S được tính toán trước phụ thuộc vào khóa, và sử dụng
khóa theo thời gian biểu tương đối phức tạp. Trong thiết kế, thuật toán sử dụng 1 số thành
phần của các thiết kế khác – ví dụ biến đổi PHT (Pseudo-Hadamard Transform) của họ
mã SAFER. Trên hầu hết các nền phần mềm Twofish chậm hơn một chút so với Rijndael
(với 128 bít khóa), nhưng có phần nhanh hơn đối với 256 bít khóa. Các tác giả của thuật
toán đã đề cập đến việc tấn công thuật toán trên 6 vòng và tấn công liên quan đến khóa
lên tới 10 vòng. Trên thực tế (đến năm 2005) không có kiểu tấn công nào lên thuật toán
hiệu quả hơn kiểu tấn công “tìm khóa theo phương pháp vét cạn – brute force key
search”.
Miêu tả thuật toán. Sơ đồ thuật toán như hình vẻ 7.31. Ở đây, văn bản ban đầu đưa
vào là bốn từ 32 bit A, B, C, D. Trước khi tham gia vào 16 vòng bốn từ này XOR với bốn
từ khóa K0..3. Kế đến thực hiện tiếp 16 chu kỳ. Trong mỗi chu kỳ, hai từ A, B là dữ liệu
vào của hàm g (đầu tiên từ B được quay trái 8 bit). Hàm g bao gồm bốn S–box (mỗi S–
box là một byte) phụ thuộc khóa, theo sau là bước trộn tuyến tính dựa trên ma trận MDS.
Kết hợp kết quả trả ra của hai hàm g thông qua biến đổi tựa Hadamard (PHT) rồi cộng
thêm vào hai từ khóa (K2r+8 cho A và K2r+9 cho B ở chu kỳ r). Sau đó hai kết quả này XOR
với hai từ C và D (trước khi xor từ D với B, từ D được quay trái 1 bit và sau khi XOR từ
C với A, từ C được quay phải 1 bit). Kế đến hai từ A và C, B và D hoán đổi cho nhau để
thực hiện chu kỳ kế tiếp. Sau khi thực hiện xong 16 chu kỳ, hoán chuyển trở lại hai từ A
và C, B và D, cuối cùng thực hiện phép XOR bốn từ A, B, C, D với bốn từ khóa K4...7 cho
ra bốn từ A’, B’, C’, D’ đã được mã hóa.
Hình 7.31. Sơ đồ thuật toán Twofish
Hàm F: Ở đây hàm F là phép hoán vị phụ thuộc khóa trên gía trị 64 bít. Hàm F nhận
vào ba tham số, đó là hai từ dữ liệu vào R0 và R1, và số thứ tự r của chu kỳ dùng để chọn
khóa con thích hợp. R0 được đưa qua hàm g để tạo ra T0. R1 được quay sang trái 8 bít, sau
đó được đưa qua hàm g để tạo ra T1. Tiếp theo là T0 và T1 được được kết hợp sử dụng
PHT và cộng thêm hai từ trong bảng khóa mở rộng, hàm F có thể biểu diễn bằng chuỗi
lệnh sau:
T0=g(R0)
T1=g(ROL(R1,8))
F0=(T0+T1+K2r+8)mod 232
F1=(T0+2T1+K2r+9)mod 232
(F0,F1) là kết quả của hàm F
Hàm g: Hàm g là trung tâm của thuật toán Twofish. Từ dữ liệu đâu vào X được chia
thành 4 byte. Mỗi byte thực hiện thông qua S–box phụ thuộc khóa của chính mình. Mỗi
S–box đưa 8 bit dữ liệu vào và đưa ra 8 bit kết quả. 4 byte kết quả được xem như một véc
tơ có chiều dài bằng 4 trên GF(28) và véc tơ này nhân với ma trận MDS 4 × 4 (sử dụng
trường GF(28) cho việc tính toán). Véc tơ kết quả Z được xem như một từ 32 bit và nó
cũng là kết quả của hàm g.
, i=0,…,3
, i=0,…,3
Si là các S-box phụ thuộc vào khóa, ma trận MDS được cho ở dạng Hexa như sau:
S-box phụ thuộc vào khóa: Mỗi S–box được định nghĩa với 2, 3 hoặc 4 byte của dữ liệu
đầu vào của khóa phụ thuộc vào kích thước khóa. Điều này thực hiện như sau cho các
khóa 128 bit, được miêu tả ở hình 7.32.
S0(x)=q1[q0[q0[x] S0,0] S1,0]
S1(x)=q0[q0[q1[x] S0,1] S1,1]
S2(x)=q1[q1[q0[x] S0,2] S1,2]
S3(x)=q0[q1[q1[x] S0,3] S1,3]
Hình 7.32. Sơ đồ miêu tả sinh S-Box
Phép hoán vị q0 và q1: ở đây q0 và q1 là các phép hoán vị cố định trên các gía trị 8 bít.
Nó được xây dựng từ 4 phép hoán vị 4 bít khác nhau. Nếu gọi x là giá trị đầu vào thì y là
giá trị đầu ra của hoán vị được xác định như sau:
a0,b0=[x/16], x mod 16
a1=a0 b0
b1=a0 (b0>>>1) 8a0 mod 16
a2,b2=t0[a1], t1[a1]
a3=a2 b2
b3=a2 (b2>>>1) 8a2 mod 16
a4,b4=t2[a3], t3[b3]
y=16b4+a4
ở đây t0,t1,t2,t3 là các S-box, được xác định khác nhau đối với q0 và q1. Trường hợp q0
thì t0,t1,t2,t3 được cho như sau:
t0=[817D6F320B59ECA4]
t1=[ECB81235F4A6709D]
t2=[BA5E6D90C8F32471]
t3=[D7F4126E9B3085CA]
Trường hợp q1 thì t0,t1,t2,t3 được cho như sau:
t0=[28BDF76E31940AC5]
t1=[1E2B4C376DA5F908]
t2=[4C75169A0ED82B3F]
t3=[B951C3DE647F208A]
Các giá trị Si,j: Cách xác định giá trị của Si,j qua các bước sau:
Đầu tiên ta định nghĩa k=N/64, với N là chiều dài khóa mật 128 hay 192 hay 256.
Khóa M bao gồm 8k byte m0,…,m8k-1, các byte này biến đổi thành 2k từ 32 bít. Ta xác
định Mi như sau:
Từ Mi ta xác định 2 véc tơ có chiều dài k như sau:
Me=(M0,M2,…,M2k-2)
Mo=(M1,M3,…,M2k-1)
Một vector gồm k từ 32 bit thứ 3 cũng được suy ra từ khóa bằng cách lấy ra từng
nhóm gồm 8 byte trong khóa, xem nhóm các byte này là một vector trên GF(28) và nhân
vector này với ma trận 4×8 RS. Sau đó mỗi kết quả 4 byte được xem như một từ 32 bit.
Những từ này kết hợp lại tạo thành vector thứ ba. Được xác định như sau:
ở đây RS được cho như sau:
Các giá trị của véc tơ thứ 3 được tính như sau:
S=(Sk-1,Sk-2,…,S0)
Hàm mở rộng khóa: Thuật toán Twofish sử dụng 40 khóa con 32 bít, các khóa con
này hình thành từ khóa mật bằng hàm mở rộng khóa. Hàm này được xây dựng trên cơ sở
thủ tục h, thủ tục này được biểu diễn như hình vẻ 7.33.
Hình 7.33. Quá trình sinh khóa con
Như ta thấy đối số đầu vào của h là X có độ lớn là 32 bít và một danh sách L=(L0,
…,Lk-1) mỗi phần tử cũng là 32 bít, và đầu ra là một số có độ lớn là 32 bít. Hàm h thực
hiện qua k giai đoạn. Trong mỗi giai đoạn 4 byte, mỗi byte thực hiện thay thế qua S-box
cố định và XOR với một phần tử của danh sach L. Qua k giai đoạn, các byte thu được lại
thực hiện tiếp phép thay thế S-box nữa và cuối cùng là nhân với ma trân MDS như trong
hàm g. Cụ thể là ta chia các từ thành cá byte:
, i=0,…,k-1; j=0,1,2,3.
Sau đó lần lượt xác định thay thế và phép toán XOR.
Nếu k=4 thì:
Nếu chúng ta có:
Trong các trường hợp còn lại thì chúng ta có:
y0=q1[q0[q0[y2,0] l1,0] l0,0]
y1=q0[q0[q1[y2,1] l1,1] l0,1]
y2=q1[q1[q0[y2,2] l1,2] l0,2]
y3=q0[q1[q1[y2,3] l1,3] l0,3]
Sauk hi tìm hiểu xong hàm h, ứng dụng hàm này để mở rộng khóa bằng dãy các phép
tính sau:
Hằng số sử dụng để nhân đôi các byte, i= 0, ..., 255, iρ gồm 4 byte bằng nhau, mỗi
byte ứng với giá trị i. Áp dụng hàm h lên các từ theo dạng này. Đối với Ai các giá trị byte
là 2i và đối số thứ hai của h là Me. Tương tự Bi được tính toán, sử dụng 2i + 1 như giá trị
byte và Mo như đối số thứ hai với một phép quay thêm trên 8 bit. Các giá trị Ai và Bi tổ
hợp thành một PHT (Pseudo–Hadamard Transform). Một trong hai kết quả này quay 9
bit nữa. Hai kết quả này tạo thành hai từ khóa mở rộng
7.16 Chuẩn mã khối AES
Lịch sử ra đời. Với rất nhiều nhược điểm đã được chỉ ra, thuật toán DES (được công
nhận vào năm 1976 bởi NIST của Mỹ và có tên gọi chính thức là chuẩn FIPS PUB 46
vào năm 1977) đã gần như không còn được sử dụng trong các ứng dụng thực tiễn. Các
nghiên cứu về khả năng ứng dụng của DES đã chỉ ra rằng, thuật toán DES đã không còn
đáp ứng được các tiêu chuẩn cần thiết (độ an toàn, tính hiệu quả, tốc độ thực hiện, …) để
có thể tiếp tục là chuẩn cho các ứng dụng trong thực tiễn. Để cố gắng khắc phục các
nhược điểm đã chỉ ra của thuật toán DES, trên thực tế đã xuất hiện rất nhiều các thuật
toán cải tiến dựa trên DES (như DES-X, G-DES, D_DES, T_DES) hoặc các thuật toán
khác (như IDEA, RC5, Blowfish, …) nhằm khắc phục các nhược điểm hoặc thay thế
thuật toán DES. Nhưng với các đòi hỏi ngày càng cao của các ứng dụng trong thực tiễn
các thuật toán này đều đã chứng tỏ là không đạt chuẩn với các yêu cầu mới.
Trước tình hình đó, NIST đã mở ra một cuộc thi nhằm tìm kiếm thuật toán mới thay
thế cho thuật toán DES (được gọi là AES – Advanced Encryption Standard [12-20]). Các
yêu cầu cơ bản đối với các thuật toán AES là có tốc độ nhanh hơn so với DES, ít nhất có
độ an toàn không kém T_DES và có khả năng thực hiện tối ưu trên cả phần cứng và phần
mềm. Các thuật toán này phải thực hiện trên khối dữ liệu có độ dài 128 bít, và có khả
năng làm việc với các khóa có độ dài khác nhau – 128, 192, và 256 bít, và cuộc thi đã
chính thức công nhận thuật toán Rijndael là chuẩn mới (với độ dài khóa là 128 bít, và
khuyến nghị sử dụng khóa 256 bít đối với các yêu cầu tối mật).
Kết quả qua so sánh thực hiện trên phần mềm và phần cứng, có 5 thuật toán vào vòng
chung kết MARS, RC6, Rijndael, Serpent, Twofish, chúng ta đã xem 4 thuật toán trước.
Ở đây chúng ta xem thuật toán được bầu làm chuẩn mới Rijndael.
Đặc điểm chung: là thuật toán được phát triển từ thuật toán Square, Nhà thiết kế:
Vincent Rijmen và Joan Daemen. Mặc dù 2 tên AES và Rijndael vẫn thường được gọi
thay thế cho nhau nhưng trên thực tế thì 2 thuật toán không hoàn toàn giống nhau. AES
chỉ làm việc với khối dữ liệu 128 bít và khóa có độ dài 128 (có 10 vòng mã), 192 (có 12
vòng mã) hoặc 256 (có 14 vòng mã) bít trong khi Rijndael có thể làm việc với dữ liệu và
khóa có độ dài bất kỳ là bội số của 32 bít nằm trong khoảng từ 128 tới 256 bít. Trong
phần này chúng ta tìm hiểu về hệ mật AES.
Miêu tả thuật toán: Hầu hết các tính toán của AES được thực hiện trên trường hữu
hạn. AES hoạt động trên các mảng của byte kích thước 44, được gọi là state (trạng
thái).
Quy trình mã hóa Rijndael sử dụng bốn phép biến đổi chính:
1. AddRoundKey: cộng ( ) mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của
khóa của chu kỳ bằng với kích thước của trạng thái.
2. SubBytes: thay thế phi tuyến mỗi byte trong trạng thái hiện hành thông qua bảng
thay thế (S-box).
3. MixColumns: trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột được
xử lý độc lập.
4. ShiftRows: dịch chuyển xoay vòng từng dòng của trạng thái hiện hành với di số
khác nhau.
Quá trình mã hóa được thực hiện 3 ba giai đoạn sau:
1. Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ mã hóa.
2. Nr – 1 chu kỳ mã hóa bình thường: mỗi chu kỳ bao gồm bốn bước biến đổi liên tiếp
nhau: SubBytes, ShiftRows, MixColumns, và AddRoundKey.
3. Thực hiện chu kỳ mã hóa cuối cùng: trong chu kỳ này thao tác MixColumns được
bỏ qua.
Chúng ta đi tìm hiểu các lệnh biến đổi trong quá trình mã hóa.
+ SubstituteBytes – bước thay thế có tính phi tuyến, theo đó mỗi byte được thay thế
bởi một byte có giá trị khác theo bảng tìm kiếm (lookup table) – gọi là hộp S. Như vậy,
mỗi byte trong bảng được thay thế bởi một byte của hộp S (S-box). Hộp S được sinh ra từ
hàm ngược (inverse function) trên GF(28) để có được tính chất phi tuyến cao nhất. Để
ngăn ngừa cuộc tấn công dựa trên các tính chất đại số đơn giản, hộp S-box này được tạo
nên bằng cách kết hợp phép nghịch đảo với một phép biến đổi affine khả nghịch. Hộp S
cũng được thiết kế để bảo đảm tính xáo trộn tốt nhất và được chọn để tránh các điểm bất
động.
Hình 7.34. Trong bước SubstituteBytes,
mỗi byte trong state được thay thế bởi
một byte (phần tử 8 bít) của hộp S đóng
vai trò là bảng tìm kiếm.
+ ShiftRows – bước chuyển dịch, theo đó mỗi hàng của state được dịch vòng một số
bước nào đó. Đối với AES hàng đầu tiên không thay đổi. Các byte của hàng thứ 2 được
dịch vòng đi 1byte về bên trái. Tượng tự, các byte của hàng thứ 3 và 4 được dịch vòng đi
2 và 3 byte tương ứng về phía trái. Bằng cách này mỗi cột của state ra của ShiftRows là
sự kết hợp lại của các byte từ mỗi cột của state vào.
Hình 7.35. Trong bước ShiftRows, các
byte trong mỗi hàng của state được dịch
vòng về phía trái. Số lượng các bước dịch
vòng là khác nhau ở mỗi hàng.
+ MixColumns – hoạt động trên các cột của state, thực hiện một biến đổi tuyến tính.
Trong bước này 4 byte của mỗi cột của state được tổ hợp sử dụng một biến đổi tuyến tính
ngược. Trong hàm MixColumns mỗi byte của lối vào sẽ ảnh hưởng lên tất cả 4 byte ở lối
ra. Cùng với ShiftRows, MixColumns sẽ tạo ra tính khuếch tán (diffusion) của mã. Mỗi
cột được xử lý như một đa thức trên GF(28) và được nhân với một đa thức cố định c(x) =
‘03’x3 +’01’ x2 + ‘01’x + ‘02’ theo modul (x4 + 1).
Hình 7.36. Trong MixColumns,
mỗi cột của state được nhân với
một đa thức cố định c(x) theo
mod(x4 + 1).
Hàm Mixcolums(state) được thực hiện trên mỗi cột của ma trận state. Như vậy, đối
với 4 cột của ma trận state, hàm Mixcolums(state) được thực hiện 4 lần.
+ AddRoundKey – mỗi byte của state được kết hợp với khóa vòng, mỗi khóa vòng
được sinh ra từ khóa bí mật, khi sử dụng thời gian biểu của khóa (key schedule), mỗi
khóa vòng có cùng kích thước với state.
Hình 7.37. Trong bước
AddRoundKey, mỗi byte của state
được kết hợp tương ứng với 1 byte
của khóa vòng bằng sử dụng toán tử
XOR.
Vòng cuối cùng, thay thế bước Mixcolumns bằng một giá trị
AddRoundKey riêng biệt.
Quá trình giải mã: Quá trình này thực hiện các biến đổi ngược so với quá trình mã
hóa. Nó thực hiện thông qua các bước sau:
1. Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ giải mã.
2. Nr −1 chu kỳ giải mã bình thường: mỗi chu kỳ bao gồm bốn bước biến đổi liên tiếp
nhau: InvShiftRows, InvSubBytes, AddRoundKey, InvMixColumns.
3. Thực hiện chu kỳ giải mã cuối cùng. Trong chu kỳ này, thao tác InvMixColumns
được bỏ qua.
Phép biến đổi InvSubBytes: Phép biến đổi ngược của thao tác SubBytes, ký hiệu là
InvSubBytes, sự dụng bảng thay thế nghịch đảo của S-box trên GF(28), ký hiệu là S-box-
1.
Phép biến đổi InvShiftRows: InvShiftRows chính là phép biến đổi ngược của phép
biến đổi ShiftRows. Dòng đầu tiên của trạng thái sẽ vẫn được giữ nguyên trong khác ba
dòng cuối của trạng thái sẽ được dịch chuyển xoay vòng theo chiều ngược với phép biến
đổi ShiftRows.
Phép biến đổi InvMixColumns: InvMixColumns là biến đổi ngược của phép biến đổi
MixColumns. Mỗi cột của trạng thái hiện hành được xem như đa thức s(x) bậc 4 có các
hệ số thuộc GF(28) và được nhân với đa thức a-1(x) là nghịch đảo của đa thức a(x)
(modulo M(x)) được sử dụng trong phép biến đổi MixColumns.
a-1(x) = {0b}x3 + {0d}x2 + {09}x + {0e}
Hàm mở rộng khóa:
Bảng khóa mở rộng là mảng 1 chiều chứa các từ (có độ dài 4 byte), được ký hiệu là
w[Nb*(Nr + 1)]. Hàm phát sinh bảng khóa mở rộng phụ thuộc vào giá trị Nk, tức là phụ
thuộc vào độ dài của mã khóa chính. Hàm mở rộng khóa được hổ trợ bởi hai hàm sau:
Hàm SubWord(W) thực hiện việc thay thế (sử dụng S-box) từng byte thành phần của
từ 4 byte được đưa vào và trả kết quả về là một từ bao gồm 4 byte kết quả sau khi thực
hiệc việc thay thế.
Hàm RotWord(W) thực hiện việc dịch chuyển xoay vòng 4 byte thành phần (a, b, c,
d) của từ được đưa vào. Kết quả trả về của hàm RotWord là một từ gồm 4 byte thành
phần là (b, c, d, a).
KeyExpansion(byte key[4 * Nk], word w[Nb * (Nr + 1)], Nk)
begin
i=0
while (i < Nk)
w[i] = word[key[4*i],key[4*i+1],
key[4*i+2],key[4*i+3]]
i = i + 1
end while
i = Nk
while (i < Nb * (Nr + 1))
word temp = w[i - 1]
if (i mod Nk = 0) then
temp = SubWord(RotWord(temp)) xor Rcon[i / Nk]
else
if (Nk = 8) and (i mod Nk = 4) then
temp = SubWord(temp)
end if
w[i] = w[i - Nk] xor temp
i = i + 1
end while
end
Các hằng số của mỗi chu kỳ hoàn toàn độc lập với giá trị Nk và được xác định bằng
Rcon[i] = (RC[i], {00}, {00}, {00}) với RC[i] ∈ GF(28) và thỏa:
RC[1]=1 ({01})
RC[i] =x ({02})•(RC[i-1]) = x(i–1)
Khóa của vòng thứ i được xác định bao gồm các từ (4 byte) có chỉ số từ Nb*i đến
Nb*(i +1)−1 của bảng mã khóa mở rộng. Như vậy, mã khóa của chu kỳ thứ i bao gồm
các phần tử w[Nb*i], w[Nb* i +1] ,…, w[Nb*(i+1)−1] . Các khóa vòng được miêu tả ở
hình 7.38.
Hình 7.38. Miêu tả khóa vòng
Độ bền vững của thuật toán:
Khắc phục được điểm yếu của khóa DES
Thám mã vi sai (diffrential cryptanalysis): các tấn công vi sai là có thể nếu có thể dự
đoán được sự sai khác lan truyền trên tất cả các vòng mà có tỉ số lan truyền lớn hơn đáng
kể 21-n, với n là độ dài của khối dữ liệu. Trong AES với 4 vòng đưa ra, tỉ số lan truyền
khoảng 2-150 và với 8 vòng là khoảng 2-300. Vì vậy nó đủ nhỏ để chống lại thám mã vi sai.
Thám mã tuyến tính (linear cryptanalysis): với AES tương qua vào ra qua 4 vòng vào
khoảng 2-75 và qua 8 vòng là 2-150. Vì vậy nó đủ nhỏ để chống lại thám mã tuyến tính.
Ưu điểm và hạn chế:
Ưu điểm:
Phương diện thực hiện:
AES có thể được thực hiện để làm việc tại tốc độ rất nhanh (đối với một thuật toán mã
khối) trên bộ vi xử lý Pentium (Pro).
AES có thể được thực hiện trên một Smart card với 1 số lượng nhỏ của chỉ thị (code),
sử dụng ít RAM và tiêu tốn ít chu kì thời gian.
Vòng biến đổi song song bởi thiết kế, đây là một ưu điểm quan trọng cho các bộ vi xử
lý song song và dành cho phần cứng chuyên dụng.
Trong thuật toán không sử dụng các phép toán số học, nó không ảnh hưởng đến giới
hạn trên hoặc dưới của cấu trúc bộ vi xử lý.
Tính đơn giản thực hiện:
Thuật toán mã hoàn toàn “tự hỗ trợ”. Nó không sử dụng các thành phần của thuật toán
mã khác.
Tính bí mật của thuật toán không dựa trên sự không rõ ràng.
Thiết kế kín của thuật toán không cho phép có đủ cơ hội để che giấu một cửa sập.
Độ dài của khối dữ liệu:
128 bít là phù hợp với các yêu cầu hiện tại của các ứng dụng trong thực tế.
Khả năng mở rộng:
Khả năng sử dụng khóa với các độ dài khóa 128, 192, 256 cho phép thuật toán đáp
ứng được một phạm vi rộng về các mức độ bảo mật.
Giới hạn:
Phần giải mã ít phù hợp để thực hiện trên Smart card hơn phần mã hóa, nó yêu cầu
nhiều chỉ thị và số chu kì thực hiện nhiều???.
Trên phần mềm: mã và giải mã sử dụng các chỉ thị và/hoặc các bảng khác nhau.
Trên phần cứng: giải mã chỉ sử dụng một phần mạch đã được thiết kế thực hiện cho
mã hóa.
7.17 Các chế độ mật mã khối
Trong các phần vừa qua chúng ta trình bày các thuật toán mã khối. Rõ ràng để mã
một bản tin/bản mã có độ dài lớn hơn kích thước khối của thuật tóan, thì chúng ta phân
chia ra từng khối có kích thước với khối của thuật toán và tiến hành mã/giải mã theo thứ
tự.
Đối với thuật toán mã khối thì nó làm việc với các chế độ khác nhau. Các chế độ này
đảm bảo được các tính chất cần thiết của mã khối, ví dụ như tính ngẫu nhiên, khả năng
san bằng bản tin ban đầu đến một kích thước bất kỳ (để chiều dài bản mã không có quan
hệ với bản tin ban đầu), kiểm tra sự lan truyền của lỗi, tạo ra khóa chạy cho mã dòng…
vv.
Tồn tại 5 chế độ: Chế độ mã thay thế (ECB - Electronic Code Book), Chế độ móc nối
khối (CBC - Cipher Block Chaining), Chế độ hồi tiếp theo bản mã (CFB - Cipher
Feedback), Chế độ hồi tiếp theo đầu ra (OFB - Output Feedback) và chế độ đếm (CRT-
Counter). Để miêu tả các chế độ, chúng ta sử dụng các ký hiệu sau:
E(): thuật toán mã hóa tương ứng với mã khối.
D(): thuật toán giải mã tương ứng với mã khối.
n: kích thước khối tin ở dạng nhị phân.
-m các đoạn bản tin ban đầu, ở đây ta lưu ý:
- Nếu như bản tin thứ m có độ dài ngắn hơn kích thước khối chuẩn thì ta thêm
vào các bít để đạt kích thước chuẩn.
- Trong một số chế độ kích thước của đoạn bản tin bằng n, nhưng trong một số
chế độ khác có thể không vượt số n.
: m các đoạn bản mã, đây là kết quả ứng dụng các chế độ mã
xác định.
LSBu(B),MSBv(B) tương ứng là u bít thấp, và v bít cao của khối B.
A||B là kệnh nối 2 khối A và B.
Chế độ mã thay thế (ECB - Electronic Code Book).
Một cách mã hóa (hay giải mã) đơn giản nhất là mã (giải mã) từng đoạn bản tin (bản
mã), các đoạn này độc lập nhau với một khóa K. Chế độ ECB xác định như sau:
Mã hóa ở chế độ ECB: .
Giải mã ở chế độ ECB: .
ECB là chế độ đơn giản nhất của mã khối, nó thường được sử dụng khi cần truyền an
toàn các thông tin có dung lượng nhỏ (ví dụ, mã hóa khóa). Chế độ này có nhược điểm là
độ an toàn không cao, vì rằng đối thủ có thể dựng lại các bản mã từ các bản mã gốc.
Nhưng khi hoạt động ở chế độ này, sơ đồ mã có khả năng dung lỗi chống lại lỗi của bản
mã (chỗ các bit bị thay đổi) và lỗi đồng bộ hóa (chỗ các bit có thể được thêm vào hoặc
mất đi). Ở chế độ này các thuật toán mã có thể hoạt động với tốc độ cao nhất (nó có khả
năng mã hóa song song các khối dữ liệu).
Chế độ móc nối khối (CBC - Cipher Block Chaining).
Ở chế độ này bản tin cũng được chia thành các khối . Trước khi mã hóa,
khối được cộng từng bit theo module 2 với khối mã Ci-1 vừa nhận được trước đó.
Trong trường hợp i=1 thì Ci-1 = C0 = IV là một hằng số, được gọi là véc tơ khởi tạo, nó là
n bít ngẫu nhiên, véc tơ này như một khối mã, nên cũng không bắt buộc là bí mật. Như
vậy, giá trị của khối mã Ci không chỉ phụ thuộc vào giá trị của khối rõ mà còn phụ
thuộc vào giá trị của khối mã trước nó Ci-1. Đây cũng là lời giải thích cho tên gọi chế độ
móc nối khối. Vì tính kết nối này nên kết quả của quá trình mã là một khối mã ngẫu
nhiên, và nó bao gồm m+1 khối dữ liệu n bít. Chế độ này được miêu tả ở hình 7.39. Ở
chế độ này được hiện bởi các lệnh sau:
Mã hóa ở chế độ CBC:
Đầu vào: IV, ;
Đầu ra: IV, ;
Giải mã ở chế độ CBC:
Đầu vào: IV, ;
Đầu ra: IV, ;
Hình 7.39. Chế độ mã CBC
Chế độ CBC thường được sử dụng nhất của mã khối, nó thường được sử dụng khi
truyền các khối dữ liệu hoặc dùng để xác thực, vì sau khi giải mã, người nhận có thể thực
hiện lại quá trình mã hóa bản tin thu được (sử dụng cùng khóa K và vector IV của người
gửi), nếu khối CN thu được sau mã hóa trùng với khối CN trong bản mã nhận được từ phía
người gửi thì coi như bản mã không bị sai lệch trong quá trình gửi. Khi làm việc ở chế độ
này, các sơ đồ mã có nguy cơ bị lộ thông tin do kiểu tấn công “nghịch lý ngày sinh nhật”.
Với khả năng chống lại lỗi bản mã thì một bit lỗi truyền sẽ chỉ ảnh hưởng đến việc giải
mã của 2 khối tiếp sau. Chế độ này không có khả năng chống lại lỗi đồng bộ hóa. Nhược
điểm chính của các thuật toán khi hoạt động ở chế độ này là nó chỉ cho phép hoạt động
theo dòng liên tiếp, mà không có khả năng xử lý song song các khối dữ liệu.
Chế độ hồi tiếp theo bản mã (CFB - Cipher Feedback).
Ở chế độ này thì bản tin đầu vào có kích thước là s, với , với sự tham gia của
véc tơ khởi tạo khối với kích thước n bít ngẫu nhiên. Kết quả của quá trình mã quay trở
về đầu vào của thuật toán mã khối, xem hình 7.40 Véc tơ khởi tạo cũng đóng vai trò là
Mã hóa(E)
IV 1P
Mã hóa(E)
2P
2C
Mã hóa(E)
mP
mC
Giải mã(D)
IV
1C
1P
Giải mã(D)
2C
2P
1mC
Giải mã(D)
mC
mP
một khối bản mã nên cũng không bắt buộc phải dữ bí mật. Chế độ này được thực hiện bởi
các tập lệnh sau:
Mã hóa ở chế độ CFB:
Đầu vào: IV, ;
Đầu ra: IV, ;
Giải mã ở chế độ CFB:
Đầu vào: IV, ;
Đầu ra: IV, ;
Hình 7.40. Chế độ mã CFB
Thanh ghi dịchn-s bít || s bít
n
Hàm mã hóa(E)
Chọn s bít cao
n
Đoạn bản tin
ss
Đoạn bản tin
Thanh ghi dịchn-s bít || s bít
n
Hàm mã hóa(E)
Chọn s bít cao
n
ss
Đoạn bản mã
s s
s
Quá trình mã hóa
Chúng ta thấy rằng qúa trình mã hóa và giải mã chỉ dùng hàm mã hóa, chính vì điều
này nên có thể dùng bất kỳ hàm một chiều nào. Chế độ CFB cũng giống như chế độ
CBC, đoạn bản mã phụ thuộc vào tất cả các đoạn bản tin ban đầu và véc tơ khởi tạo.
Chế độ CFB thường được sử dụng khi truyền các dòng dữ liệu hoặc dùng để xác thực.
Chế độ này có khả năng khôi phục chống lại lỗi bản mã và lỗi đồng bộ hóa sau khi truyền
một số lượng nào đó các khối dữ liệu.
Chế độ hồi tiếp theo đầu ra (OFB - Output Feedback).
Chế độ này khá giống với chế độ CFB, chỉ khác ở chổ là, kết quả khối quay lại đầu
vào của thuật toán mã khối, xem hình 7.41. Ở chế độ này thì véc tơ khởi tạo cần phải n
bít và là khối đầu vào. Nó được thể hiện bằng chuổi lệnh sau:
Mã hóa ở chế độ OFB:
Đầu vào: IV, ;
Đầu ra: IV, ;
Giải mã ở chế độ OFB:
Đầu vào: IV, ;
Đầu ra: IV, ;
Hình 7.41. Chế độ OFB
Ở chế độ này thì quá trình mã hóa và giải mã cũng chỉ dùng một hàm mã hóa, nên có
thể dùng hàm một chiều bất kỳ cho hàm mã. Và chúng ta thấy rằng kết quả chọn s bít để
cộng từng bít theo modulo 2 với bản rõ chỉ phụ thuộc vào khóa, và véc tơ khởi tạo, nên
nếu biết được vị trí đoạn bản tin thì có thể giải mã được mà không cần xét đến các đoạn
tin trước, đều này có thể giúp cho chúng ta sữa lỗi nếu quá trình mã bị lỗi, vì thế ở chế độ
này thường được sử dụng khi truyền dòng dữ liệu trên các kênh có. Tuy nhiên trong chế
độ này OFB cần phải sử dụng một kênh tín hiệu phụ để định kỳ truyền các véc tơ khởi
tạo (IV – Initialization vector) từ bên gửi đến bên nhận để có được khả năng tái đồng bộ.
Chế độ đếm (CTR-Counter).
Chế độ CTR thì các giá trị của đếm sẽ quay về đầu vào tương ứng với thuật toán mã
khối, đếm được khởi tạo lúc đầu. Chế độ này có thể biểu diễn bằng chuỗi lệnh sau:
Mã hóa ở chế độ đếm;
Đầu vào: , ;
Đầu ra: , ;
Giải mã ở chế độ đếm
Đầu vào: , ;
Đầu ra: , ;
Thanh ghi dịchn-s bít || s bít
n
Hàm mã hóa(E)
Chọn s bít cao
n
Đoạn bản tin
ss
Đoạn bản tin
Thanh ghi dịchn-s bít || s bít
n
Hàm mã hóa(E)
Chọn s bít cao
n
ss
Đoạn bản mã
s s
s
Quá trình mã hóa
Ở chế độ này thì có ưu việt hơn các chế độ CFB và OFB bởi vì chế độ này hoàn toàn
đơn giản, và cho phép sử lý song song.
Khi thực hiện các thuật toán mã trong các ứng dụng và dưới các điều kiện làm việc cụ
thể, thì người thiết kế phải nắm vững các khả năng hoạt động của thuật toán ở các chế độ
làm việc cụ thể. Bởi vì trong các chế độ hoạt động này, các thuật toán mã sẽ có khả năng
thực hiện các giải pháp mã khác nhau, và chúng sẽ nhận được các ưu điểm hoặc các
nhược điểm tương ứng với chế độ hoạt động đó. Phân tích các chế độ làm việc cụ thể của
các sơ đồ mã khối ta có thể thấy được các ưu nhược điểm của chúng như sau:
Trong chế độ không hồi tiếp, các khối dữ liệu có thể được mã hóa một cách độc lập
với các khối khác. Vì vậy trong chế độ này một số khối dữ liệu có thể được thực hiện mã
hóa song song. Còn trong chế độ hồi tiếp, các sơ đồ mã không có khả năng thực hiện mã
hóa khối dữ liệu tiếp sau trừ khi khối dữ liệu trước nó đã được xử lý xong. Vì vậy trong
chế độ này các khối dữ liệu phải được mã hóa một cách tuần tự. Tuy nhiên ở chế độ giải
mã các sơ đồ mã có thể hoạt động xử lý song song đối với cả chế độ hồi tiếp và không
hồi tiếp.
Dựa trên các đánh giá, ta thấy rằng việc mã hóa sẽ dữ liệu chủ yếu dựa trên các chế độ
hồi tiếp của mã khối như CBC và CFB. Còn với chế không độ hồi tiếp thường sử dụng
chế độ ECB để mã hóa khóa phiên trong quá trình phân phối khóa.
7.18 Phân tích kiểm tra và thống kê thuật toán
Chúng ta đã biết để đánh giá hiệu quả của một hệ mật chúng ta cần quan tâm đến 4
đặc điểm: Độ bền vững, tốc độ mã, đơn giản khi thực hiện và giá thành thấp. Điều chúng
ta quan tâm đầu tiên là độ bền vững của hệ mật. Khi chúng ta tạo ra một hệ mật mới làm
thế nào để biết được nó bền vững hay không bền vững? Để trả lời câu hỏi này chúng ta
có 2 phương pháp xác định: Phân tích hệ mật với các phương pháp tấn công, phân tích
thống kê thuật toán. Vì các phương pháp tấn công chúng ta không thể lường hết các
phương pháp mới và có nhiều thuật toán thám mã, nên cách hiệu quả để đánh giá hệ mật
là phân tích và thống kê thuật toán.
Tiêu chí đánh giá tính chất “hiệu ứng thác lũ”
Để phân tích kết quả xử lý thống kê thuật toán mã khối tổ chức NESSIE (New
European Schemes for Signatures, Integrity and Encryption) của Châu Âu đề xuất những
tiêu chí sau đây:
1. Số lượng bít ở đầu ra bị thay đổi khi thay đổi một bít của véc tơ đầu vào.
2. Bậc biến đổi hoàn toàn.
3. Bậc hiệu ứng thác lũ.
4. Bậc ứng với hiệu ứng thác lũ chặc chẽ.
Đặt U(i) = U Ei – là một véc tơ nhị phân nhận được khi thay đổi một bít thứ i của véc
tơ U. Lúc này véctơ nhị phân Y(i) = F(U(i)) F(U) được gọi là véctơ thác lũ theo thành
phần i. Đối với một mã khối thì U = X║K. Để xem các tiêu chí, chúng ta giả sử U có
chiều dài là n và Y có chiều dài là m.
Ở tiêu chí 2 và 4 chúng ta sử dụng ma trận phụ thuộc ║aij║n×m, với:
.
Ma trận ║aij║n×m cho chúng ta biết sự phụ thuộc của bít thứ j của véctơ đầu ra vào bít
thứ i của véctơ đầu vào. Lúc này thì bậc biến đổi hoàn toàn được đánh giá qua công thức
sau:
.
Còn bậc tương ứng với tiêu chí thác lũ chặc chẽ xác định theo công thức sau:
Với N = #U = #{U}.
Để nhận được đánh giá một cách chính xác cần phải lựa chọn tất cả các giá trị của
véctơ U, thế nhưng véctơ U có kích thước lớn thì không thể lựa chọn tất cả hết các giá trị
của nó, để tính giá trị gần đúng chúng ta nên dùng phương pháp Monte Carlo.
Ở tiêu chí 1 và 3 chúng ta sử dụng ma trận khoảng cách Hamming ║bij║n×m, với:
.
Số lượng bít trung bình thay đổi khi thay đổi một bít của véctơ đầu vào được đánh giá
theo công thức sau:
.
Còn bậc hiệu ứng thác lũ được xác định theo công thức sau:
.
Đánh giá ảnh hưởng các bít của bản rõ đối với bản mã
Các tiêu chí đánh giá ảnh hưởng các bít của bản rõ đối với bản mã nhằm xem xét
điểm yếu của thuật toán, các tiêu chí này có thể sử dụng phương pháp thám mã trên cơ sở
lựa chọn bản rõ hoặc hay phương pháp thám mã vi sai. Trong trường hợp này véctơ thác
lũ Y(i) được hình thành theo véctơ đầu vào U = X║K и U(i) = X(i)║K, где X(i) = X Ei.
Trong số các tham số đưa ra các giá trị: q là số lượng khóa được chọn, t là số lượng
bản tin được chọn thì N = qt. Việc lựa chọn q và t phụ thuộc vào giá trị của n và m. Ma
trận phụ thuộc ║aij║n×m và ma trận khoảng cách Hamming ║bij║n×m có dạng sau:
Để tạo kết quả chính xác thì việc lựa chọn khóa và bản tin cần phải ngẫu nhiên.
Trong trường hợp này thì véctơ thác lũ Y(i) được hình thành theo véctơ đầu vào U =
X║K và U(i) = X║K(i), где K(i) = K Ei. Trong các tiêu chí thì ma trận phụ thuộc ║aij║n×m
và ma trận khoảng cách Hamming║bij║n×m có dạng sau:
Chúng ta cần chú ý rằng các tiêu chí đã xem xét là công cụ hiệu quả đối với việc xem
xét điểm yếu của thuật toán, cũng như xem hiệu quả của cách miêu tả khóa, và qua đây
chúng ta biết được thuật toán chúng ta nên chọn số vòng là bao nhiêu để đạt hiệu quả.
Chú ý: Ngoài ra để thiết lập quan hệ giữa các mô hình lý thuyết và thực hành người ta
còn đưa ra tiêu chí ở đây chúng ta không xem xét.
7.19 Thám mã véc cạn khóa
Giả sử rằng kẻ gian có được một hoặc một số cặp (x,y). Gỉa sử rằng đối với một cặp
(x,y) bất kỳ thì tồn tại một khóa k duy nhất thỏa mãn . Chúng ta sắp xếp tập hợp
không gian khóa và lần lượt kiểm tra các khóa từ tập khóa K xem sự thỏa mãn biểu thức
. Nếu như xem một lần kiểm tra khóa là một lệnh thì việc véc cạn khóa
cần #K lệnh, ở đây #K là số lượng phần tử của tập K. Giả sử rằng khóa k trong sơ đồ mã
hóa được chọn ngẫu nhiên và khả năng như nhau từ tập K. Như vậy xác suất đoán được
khóa k là , và độ khó của phương pháp véc cạn sẽ bằng 1. Cho nên để đánh giá độ
khó của phương pháp ta chọn kỳ vọng toán học của độ lớn ngẫu nhiên , ở đây là số
phép thử trước thời điểm tìm được khóa sử dụng. Bởi vì là độ lớn ngẫu nhiên phân bố
đều, nên M( )= .
Thuật toán véc cạn cho phép thực hiện song song, bời vì điều này nên có thể tăng tốc
đáng kể quá trình tìm khóa. Có hai hướng trong quá trình tính toán khóa song song.
Một là, xây dựng dây chuyền. Cho thuật toán của biểu thức được biểu diễn
dưới dạng dây chuyền cố định các lệnh .
Chọn N quá trình , sắp xếp theo thứ tự và cho quá trình thứ i hoàn thành
3 lệnh như nhau theo thời gian:
a. Nhận dữ liệu thứ (i-1) quá trình;
b. Hoàn thành lệnh ;
c. Chuyển dữ liệu cho quá trình thứ (i+1);
Như vậy dây chuyền gồm N quá trình được liên kết nối tiếp nhau làm việc song song,
đồng bộ làm việc với tốc độ , là tốc độ hoàn thành 1 lệnh của quá trình.
Hướng thứ hai là tập khóa K được phân nhỏ ra thành các tập không giao nhau
. Hệ thống gồm Q máy thực hiện việc lựa chọn khóa, máy thứ i thực hiện
việc lựa chọn khóa từ tập . Hệ thống ngừng làm việc nếu như có một máy tìm
được khóa. Điều phức tạp nhất của phương pháp là tổ chức phân chia tập khóa. Thế
nhưng nếu tổ chức việc tìm kiếm khóa như vậy thì trong mỗi lần thí nghiệm thì một trong
N quá trình sẽ trở nên ngẫu nhiên, thời gian thí nghiệm sẽ tăng nhưng tốc độ của sơ đồ lại
tăng lên đáng kể. Số bước thí nghiệm thực hiện N quá trình trong trường hợp này là .
Việc thực hiện xử lý song song như vậy phải có các cách giải quyết khác nhau. Một
trong các cách được ưu tiên đó là tạo ra virut máy tính để phân bố chương trình trong
mạng nội bộ.Virut cần sử dụng chu kỳ dừng của máy tính để thực hiện việc tìm kiếm theo
tập khóa. Sớm hay muộn thì một trong các máy nhiểm virut sẽ tìm được khóa cần tìm.
Với sự lớn của công suất máy tính cũng như tốc độ lây lang virut thì khả năng thành công
của phương pháp này ngày một tăng.
7.20 Thám mã bằng phương pháp thống kê
Mục đích của phương pháp thám mã thống kê là xử lý thuật toán nhằm tìm khóa chưa
biết (hoặc một phần khóa) . Chúng ta xem các nguyên tắc cơ bản và định nghĩa của
phương pháp thống kê đối với mã khối.
Thực hiện phương pháp thám mã thống kê nhằm xác định khóa mật đối với mã khối
cho phép nhận được đánh giá hiệu quả thuật toán hơn là phương pháp véc cạn khóa. Đầu
vào là mốt số cặp (Xi,Yi), i=1,…,N bản rõ và bản mã, bản mã thu được bằng cách ứng
dụng ánh xạ F với khóa k. Các cặp như vậy được gọi là “tư liệu” và ký hiệu là M. Dung
lượng của tư liệu tương ứng với số cặp (Xi,Yi): . Giả sử rằng các bản rõ Xi, i=1,
…,N được chọn ngẫu nhiên, đồng khả năng và độc lập từ không gian .
Quá trình thống kê phân loại là phần quan trọng nhất của phương pháp phân tích
thống kê, quá trình này dùng để tìm các tham số chưa biết theo quan sát ngẫu nhiên. Hàm
phân bố xác suất để quan sát phụ thuộc vào tham số mật này. Ý tưởng của quá trình
thống kê phân loại thể hiện ở chổ, nếu như sự phận bố xác suất này mà khác nhau thì khi
số lượng quan sát đủ lớn thì có thể xác định được định luật phân bố quan sát và từ đó có
thể xác định tham số cần tìm.
Chúng ta ký hiệu tập hợp ở đó nhận giá trị của tham số chưa biết là .
Mỗi quá trình thống kê phân loại được xác định sự phân chia tất cả không gian quan
sát M ra T phần không giao nhau: với
. Vùng gọi là vùng chọn nghiệm. Đối với từng vùng Mi
quá trình thống kê phân loại cũng xác định danh mục thứ thự s’ thành phần của tập hợp
, lúc này với .
Để xác định thành phần chưa biết từ tập cần thực hiện các lệnh sau. Đầu tiên theo sự
quan sát nhận được cần xác định số thứ tự vùng chọn nghiệm i(m). Sau đó lựa
chọn lần lượt các tham số từ tập và kiểm tra xem giá trị của
tham số thứ j (j=1…s’) có phải là cần tìm hay không.
7.21 Thám mã vi sai
Thám mã vi sai là một trong các phương pháp phân tích cơ bản và hiệu quả nhất đối
với mã khối. Phương pháp mã vi sai đươc đưa ra năm 1990 bởi các nhà nhà toán học E.
Biham và Shamir. Đây là phép tấn công với việc chọn bản rõ chọn lọc, để tìm ra khóa
mật hay một phần khóa mật.
Định nghĩa: Cho cặp hai véc tơ X, X* . Khoảng cách giữa hai véc tơ hay
còn gọi là hiệu giữa hai véc tơ được xác định bằng lệnh XOR: .
Định nghĩa: Vi sai của vòng mã thứ i được xác định bằng cặp véc tơ ( ), sao cho
cặp bản rõ (x,x’) có hiệu bằng có thể đi qua i vòng mã, đầu ra là cặp bản mã (y,y’) với
hiệu của chúng là .
Xác suất vi sai của vòng mã thứ i- đó là xác suất có điều kiện, sao cho hiệu của
cặp bản mã (y,y’) sau i vòng mã bằng với điều kiện là cặp bản rõ tương ứng (x, x’) có
hiệu khoảng cách là , khi bản rõ x và các khóa k(1), k(2),…,k(i) sử dụng tương ứng
trong các vòng 1,2,…,i là độc lập và đồng khả năng, có nghĩa là
,
lúc này xác suất phân bố vi sai đối với từng vòng là không đổi và không phụ thuộc vào
vòng trước.
Giá trị vi sai ở đầu ra của vòng mã thứ i được sử dụng để tìm kiểm khóa con của vòng
mã cuối cùng tức là vòng thứ i+1 bằng cách như sau:
Đối với từng cặp bản rõ –mã ta giả sử rằng giá trị vi sai đầu ra của vòng mã thứ i là . Tiếp
theo để giá trị này và giá trị của cặp bản rõ –mã tìm được những giá trị có thể của khóa con trong
vòng mã cuối i+1 cùng, tức là hình thành một số tập hợp khóa con mà nó thỏa mã điều kiện trên.
Lúc này thì một phần trong các tập hợp là khóa đúng. Đối với tất cả tập hợp giá trị có thể của
khóa vòng, chúng ta thiết lập bảng tần số xuất hiện của chúng. Tấn công sẽ thành công khi giá trị
đúng của khóa vòng xuất hiện thường xuyên hơn các giá trị khác.
Trong trường hợp này có thể tính toán biểu thức tương quan giữa số lương cặp giá trị
giả sử đúng và số lượng trung bình các phương án có thể của khóa vòng trong bảng tần
số.
Biểu thức này được gọi là biểu thức tín hiệu – tiếng ồn S/N (Signal to noise). Nếu như
kích thước bảng phương án của khóa vòng là , ở đây l là chiều dài của khóa vòng, còn
số lượng trung bình các phương án là thì biểu thức S/N được viết:
(7.1)
Biểu thức (7.1) ảnh hưởng rất lớn lên số lượng cặp bản mã và rõ đúng mà số lượng
này cần thiết để xác định một khóa vòng.
Thuật toán thám mã vi sai
Quá trình cơ bản của thuật toán thám mã vi sai r vòng mã sử dụng bản rõ chọn lọc,
diễn ra như sau:
Đầu vào: thuật toán mã hóa, bản rõ chọn lọc và bản mã tương ứng.
Đầu ra: khóa.
1. Ở bước đầu tiên của tính toán chúng ta tìm tập hợp vi sai của cho vòng
mã thứ , với , sao cho xác suất lớn nhất hoặc
gần lớn nhất. Lúc này bản rõ X và tất cả khóa con đối với vòng
mã là độc lập và đồng khả năng. Sắp xếp chúng theo thứ tự tăng dần của xác suất.
2. Đối với một bản rõ bất kỳ x chúng ta tính bản rõ x’ sao cho hiệu khaỏng cách giữa
x và x’ bằng . Mã hóa bản rõ x và x’ trên khóa cần tìm và sau r vòng thu được cặp bản
mã . Giả sử rằng đầu ra của vòng mã thứ hiệu khoảng cách của các bản
mã có xác suất lớn nhất: . Từ bộ ba chúng ta tìm ra tất
cả giá trị có thể của khóa .
3. Lặp lại bước 2 cho đến khi có một hoặc một số giá trị của khóa con к (r) không
ngừng xuất hiện thường xuyên các giá trị khác. Chúng ta xem khóa này hoặc một tập
khóa này là nghiệm mã hóa đối với khóa của vòng mã cuối cùng.
4. Chúng ta lặp lại các bước từ 1-3 đối với vòng mã kề cuối, lúc này giá trị
được tính bằng cách giải mã bản mã trên khóa tìm được . Chúng ta thực hiện tương tự
để tìm ra các khóa vòng còn lại.
Hiệu quả của thuật toán phụ thuộc vào độ lớn và sự phân bố tập hữu hạn vi sai sau
vòng mã, có nghĩa là biểu thức S/N. Xác suất vi sai càng nhỏ và càng phân bố đều
giữa chúng thì càng khó xác định giá trị khóa .
Từ thuật toán chúng ta thấy rằng, điều kiện cần để thám mã vi sai r vòng mã thành
công là tồn tại vi sai của vòng mã thứ (r-1), mà xác suât xuất hiện của chúng lớn hơn rất
nhiều so với 2−m.
Điều này có nghĩa là, để phân tích khả năng thực hiện tấn công vi sai, cũng như đánh
giá hiệu quả của phương pháp, cần phải biết được giá trị lớn nhất của xác suất vi sai sau
một số vòng mã.
Xác suất lớn nhất của vi sai được sử dụng để xác định giới hạn dưới của độ phức tạp
tấn công vi sai và có thể chứng tỏ rằng r vòng mã sẽ không bị tổn thương bởi phép tấn
công này.
Đối với mật mã có vi sai không phụ thuộc vào sự lựa chọn bản rõ, nếu các khóa con
của các chu kỳ độc lập nhau thì dãy các khoảng cách sau từng chu kỳ tạo thành chu trình
Markob. Lúc này xác suất thu được vi sai của vòng thứ s được xác định:
P( y(s)= s | x= )= .
Đối với cặp vi sai đã cho xác suất để thu được cặp này lớn hơn nhiều so với
:
P( y(i)= | x= )= ,
với m là kích thước của khối mã.
Độ phức tạp bẻ khóa của vòng thứ r mật mã là Q(r) được xác định bắng số lệnh mã sử
dụng trong qúa trình tìm khóa:
Q(r) 2/ (Pmax - 1/(2m-1)),
ở đây:
Pmax=max( )max( )(P( y(r-1)= | x= )),
Trong số đó nếu Pmax 1/(2m-1), thì việc tấn công được xem là không thành công.
7.22 Thám mã tuyến tính
Ý tưởng của phương pháp tuyến tính lần đầu tiên được chuyên gia người Nhật M.
Matsu đưa ra năm 1992. Phương pháp này được cho là một trong các phương pháp phân
tích hiện đại và hiệu quả đối với mã khối. Phương pháp dựa trên tập bản rõ và bản mã
tương ứng để tìm ra khóa mật.
Thám mã tuyến tính là một trường hợp của phương pháp thám mã thống kê tổng quát
trên cơ sở sử dụng biểu thức sau:
, (7.2)
ở đây a, b Vn, c Vm, 0≤ t1 ≤ t2 ≤ r (ở đây cặp véc tơ (a, b) được gọi là đặc trưng tuyến
tính) . Lệnh là tích vô hướng giữa hai véc tơ a và b cùng kích thước.Ở
phương pháp thám mã tuyến tính chỉ sử dụng biểu thức kiểu (7.2), xác suất để thu được
biểu thức này khác với ½ và có thể viết dưới dạng:
21,,, )()( 21 cKbYaYP tt , (7.3)
ở đây 21
21
.số ε gọi là ưu thế (deviation, bias).
Hiệu quả của phương pháp thám mã tuyến tính càng lớn nếu như trị tuyệt đối của ε
càng lớn. Cho nên khi xây dựng một thuật toán cụ thể xác định khóa bằng phương pháp
thám mã tuyến tính thì nhiệm vụ đặt ra là tìm các véc tơ a, b Vn, c Vm, để giá trị tuyệt
đối của có thể lớn nhất: max,,
||cba
. Lúc này thì hiệu quả và độ khó của phương pháp
được xá định bằng độ lớn đã cho |ε|, có nghĩa là để xây dựng các véc tơ a, b Vn, c
Vm, cần biết đánh giá |ε| trong biểu thức (7.3).
Chúng ta xem một phương án đơn giản nhất (không phải hiệu quả nhất) của thám mã
tuyến tính – đó là thuật toán xác định một bít khóa, được gọi là thuật toán 1 Masui. Thuật
toán này sử dụng biểu thức (7.2) với t1=0 và t2=r, có nghĩa là biểu thức (7.2) được viết lại
dưới dạng bản rõ và bản mã như sau:
,
ở đây cặp véc tơ (Xi, Yi) là căp bản rõ và bản mã mà thám mã biết. Phương pháp thám
mã vi sai tương ứng với phương án đã cho xác định tổ hợp tuyến tính các bít khóa.
Tập hợp công sức được tính:
Quá trình phân loại thống kê phân chia tất cả không gian quan sát M ra hai phần M 0
và M1 ( : Đối với vùng M0 tương ứng với , còn vùng M1 ứng với
. Thuật toán sử dụng nguyên tắc sự hợp lý cực đại: Nếu như và trong
biểu thúc (7.3) hoặc và trong biểu thức (7.3) , thì thuật toán đưa ra giá trị
, trong trường hợp ngược lại thì . Các bít khóa còn lại xác định theo
phương pháp véc cạn.
7.23 Hệ mã dòng RC4
Thuật toán RC4.
Đây là một hệ mã dòng, với chiều dài khóa biến đổi, tác giả của nó là Ronald Rivest,
được nêu ra năm 1987.
Hạt nhân của thuật toán là thủ tục tạo khóa dòng, xem hình 7.42, hàm này tạo dãy bít
sau đó cộng với bản tin theo modulo 2 với bản rõ ta thu được bản mã, và khi giải mã thì
cũng sinh ra mã dòng, rồi cộng với bản mã theo từng bít ta thu được bản rõ ban đầu. RC4
làm việc ở chế độ OFB. Gọi k là giá trị mã dòng được sinh. Việc sinh mã dòng được thực
hiện trên cơ sỡ khối hoán đổi kích thước 8x8 : S[0],...S[255]. Khối hoán đổi là phép hoán
vị các số 0,…, 255 phụ thuộc vào khóa, được thực hiện bởi các lệnh sau:
1.
2.
3. Hoán đổi giá trị của S[i] và S[j]
4. Tính tổng S[i] và S[j], gán cho t: t= (S[i] + S[j]) mod 256
5. k=S[t].
Hình .7.42. Sơ đồ tạo khóa dòng k
Trong quá trình sử dụng, bộ đếm i sẽ làm cho nội dung của khối S thay đổi chậm, còn
bộ đếm j sẽ đảm bảo sự thay đổi này là ngẫu nhiên.
Byte k được tạo ra cộng với byte của bản rõ để tạo ra byte bản mã.
Một phần chính của thuật toán nữa là khởi tạo khối hoán đổi S, việc khởi tạo được
thực hiện các bước sau:
2. Gán cho mỗi phần tử giá trị bằng chỉ số của nó: S[0]=0,…,S[255]=255.
3. Tạo một mảng key gồm 256 phần tử, mỗi phần tử có kích thước 1 byte. Điền đầy
mảng key bằng các byte của khóa K, nếu mảng key chưa điền đầy thì lặp lại mốt
số bye của khóa K.
4. Xáo trộn khối S:
a. i = 0..255
b. j = (j + S[i] + key[i]) mod 256
c. Hóan đổi giá trị: S[i] ↔ S[j]
Những ưu điểm chính của RC4
Thuật toán đơn giản. Ý nghĩa của từng bước rõ ràng, logic. RC4 tỏ ra an toàn đối với cả 2 phương pháp thám cơ bản là thám tuyến tính và
thám vi phân (chưa có công trình nào về thám RC4 được công bố) . Số trạng thái
mà RC4 có thể có là 256!×256×256 » 21700. Tốc độ mã đạt rất cao. Ví dụ so với DES thì RC4 nhanh gấp 10 lần. Có thể khía quát thuật toán trên cơ sở từ có chiều dài lớn và kích thước khối hoán
đổi lớn, ví dụ 16x16.
7.24 Mã dòng WAKE
Đây là thuật toán mã dòng, tác giả của WAKE là Devit Uyler. Ở đầu ra nhận được
chuỗi từ 32 bít. WAKE làm việc ở chế độ CFB – từ trước của bản mã được dùng để tạo
ra từ tiếp theo bằng chuỗi khóa.
Trong thuật toán sử dụng khối hoán đổi đặc biệt S gồm 256 từ 32 bít. Ở đây các bytes
cao của từ là hoán đổi các số từ 0 đến 255, còn 3 bytes thấp được chọn ngẫu nhiên.
Ban đầu khối hoán đổi được khởi tạo trên cơ sở khóa. Sau đó 4 thanh ghi A, B, C và
D được khởi tạo bằng giá trị ban đầu, cũng phụ thuộc vào khóa: . Từ tiếp theo
của khóa dòng nhận được theo công thức .
Sau bước này thì giá trị của các thanh ghi bị thay đổi:
Với
Thuật toán này có tốc độ lớn mặc dầu nó không vững chắc với phép tấn công theo
phương pháp chọn bảng rõ ban đầu.