You are on page 1of 2

Mã Nhân (Multiplicative Cipher):

Trong Mã Caesar, để mã hóa ta dịch chuyển từng kí tự của bản rõ lên k bước. Nó được xem là một
dạng mã cộng. Hàm lập mã và hàm giải mã được định nghĩa như sau:
E(p, k) = (p + k) mod 26
D(c, k) = (c - k) mod 26
Nếu thay phép cộng trong 2 hàm trên bằng phép nhân, ta sẽ có hệ mã nhân.
E(p, k) = (p * k) mod 26
D(c, k) = (c * k) mod 26
Và Mã Affine chính là sự kết hợp của mã nhân và mã Caesar. Hàm lập mã và hàm giải mã của mã
Affine được định nghĩa:
E(p, k) = (a * p + b) mod 26
D(c, k) = a-1 (c - b) mod 26
Trong đó khóa k là một bộ gồm 2 thành phần k = (a, b) và kí hiệu a-1 chỉ module nghịch đảo của a
Module nghịch đảo của một số:
Module nghịch đảo của một số a kí hiệu a-1 theo mod m là một số i sao cho:
(a * i) = 1 (mod m)
tức là (a * i) chia cho m sẽ dư 1.
ví dụ về mã Affine:
 
Giả sử khóa k của tôi là bộ số k = (8, 2) khi đó tập bản rõ P sau khi thực hiện mã hóa với hàm E ở trên sẽ được tập bản mã C như sau (bạn đọc
hãy tự thực hiện hàm E này):
 
P: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
 
C: C K S A I Q Y G O W E M U C K S A I Q Y G O W E M U
 
Ta có nhận xét là một số kí tự bản rõ sẽ được mã hóa thành cùng một kí tự bản mã: ví dụ cặp D, Q đều được mã hóa thành A; tương tự cặp J và
W cùng được mã hóa thành W. Như vậy nếu ta nhận được một bản mã có chứa kí tự A, ta sẽ không biết bản rõ tương ứng là D hay Q.
 
Để hạn chế nhược điểm này, có 1 cách đó là ta chọn a sao cho a và m (ở đây m = 26) là hai số nguyên tố cùng nhau, tức là ước số chung lớn
nhất của a và m là 1: gcd(a, m) = 1. Nếu chọn k = (8, 2) thì vì gcd(8, 26) ≠ 1 nên sẽ gây hiện tượng trên, thay vào đó nếu ta chọn k = (7, 2) thì sẽ
không gặp vấn đề trùng mã. Việc chọn a như vậy cũng đảm bảo tính khả nghịch của a tức là a-1 luôn tồn tại.
Not good for encoding: Mã Affine là một hệ mã yếu. Có 12 số a ∈ Z26 thỏa mãn gcd(a, 26) = 1. Như vậy tập khóa K chỉ có 12 x 26 = 312 phần
tử. Ta dễ dàng dùng thuật toán Brute-force để thám mã.
Giả sử ta mở rộng tập kí tự P và C bao gồm cả các kí tự chữ hoa, chữ thường, chữ số, kí tự đặc biệt:
 
“”” !”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~”””
Tập này có 95 phần tử, lúc đó a có 75 khả năng nên tập khóa K có 75 x 95 = 7125 phần tử. Với sức mạnh của máy tính, ta vẫn có thể dễ dàng
thử hết các khả năng bằng thuật toán Brute-force.
 

You might also like