Bài viết đề xuất kết hợp phương pháp mã hóa Hill và mã OTP để mã hóa và giải mã thông điệp dựa trên ngôn ngữ lập trình Python. Thuật toán mã hóa Hill là thuật toán dễ dàng, tuy nhiên cái khó khăn là chọn khóa làm sao cho thỏa mãn khóa có tính khả nghịch.
Trang 1Kết hợp thuật toán mật mã Hill và mã OTP
trong mã hóa và giải mã thông điệp
Vũ Ngọc Phan1
và Nguyễn Đức Toàn2
1Trường Đại học Tài nguyên và Môi trường Hà Nội
Email: vnphan@hunre.edu.vn
2Học viện Phụ nữ Việt Nam Email: ductoanndt9@gmail.com
Abstract:
Trong bài báo này chúng tôi đề xuất kết hợp phương pháp
mã hóa Hill và mã OTP để mã hóa và giải mã thông điệp dựa
trên ngôn ngữ lập trình Python Thuật toán mã hóa Hill là
thuật toán dễ dàng, tuy nhiên cái khó khăn là chọn khóa làm
sao cho thỏa mãn khóa có tính khả nghịch Mã OTP là mã
khóa chỉ dùng 1 lần, chính vì thế trong bài báo này chúng tôi
đề xuất dùng mã OTP làm khóa cho thuật toán mã hóa Hill
Trong phần thực nghiệm chúng tôi chọn khóa có kích thước
2x2 và 3x3 Do đó khóa nhận được là có tính ngẫu nhiên
Keywords- Python, Hill, OTP, mã hóa, giải mã
I GIỚITHIỆU
Với sự phát triển nhanh chóng của công nghệ
thông tin, bảo mật thông tin ngày càng trở nên quan
trọng Trước đây, người ta thường dùng phương pháp
mật mã (cryptography) để bảo mật thông tin Tuy nhiên,
khi sử dụng phương pháp này, đối tượng cần
bảo mật được chuyển thành dạng mật mã khó hiểu nên
gây sự chú ý nhiều hơn Điều này làm cho những kẻ
xấu luôn tìm cách giải mã để hiểu được nội dung của
đối tượng được bảo vệ đó Nhằm tránh gây sự chú ý,
một phương pháp bảo mật khác được đề xuất và sử
dụng rộng rãi là giấu tin mật Thông tin cần bảo vệ
được ẩn giấu trong một đối tượng mang tin, thường là
ảnh, video, âm thanh, văn bản,… Kỹ thuật này có ưu
điểm là thông tin không chỉ được bảo vệ mà còn che
giấu được sự tồn tại của nó
Mật mã đối xứng sử dụng cùng một khóa cho việc mã
hóa và giải mã Có thể nói mã đối xứng là mã một khoá
hay mã khóa riêng hay mã khoá thỏa thuận Ở đây
người gửi và người nhận chia sẻ khoá chung K, mà họ
có thể trao đổi bí mật với nhau Ta xét hai hàm ngược
nhau: E là hàm biến đổi bản rõ thành bản mã và D là
hàm biến đổi bản mã trở về bản rõ Giả sử X là văn bản
cần mã hóa và Y là dạng văn bản đã được thay đổi qua
việc mã hóa Khi đó ta ký hiệu:
Y = EK(X)
X = DK(Y)
Mọi thuật toán mã cổ điển đều là mã khoá đối xứng, vì
ở đó thông tin về khóa được chia sẻ giữa người gửi và người nhận Mã đối xứng là kiểu duy nhất trước khi phát minh ra khoá mã công khai (còn được gọi là mã không đối xứng) vào những năm 1970 Hiện nay các mã đối xứng và công khai tiếp tục phát triển và hoàn thiện Mã công khai ra đời hỗ trợ mã đối xứng, không thay thế nó,
do đó mã đối xứng đến nay vẫn được sử dụng rộng rãi
Định nghĩa một số khái niệm cơ bản về mã hóa
Một hệ mật mã là một bộ 5 (P,C,K,E,D) thoả mãn các điều kiện sau [1]:
P (Plaintext) là một tập hợp hữu hạn các bản rõ và được gọi là không gian bản rõ
C (Ciphertext) là tập các hữu hạn các bản mã và được gọi là không gian các bản mã
K (Key) là tập hữu hạn các khoá hay còn gọi là không gian khoá Đối với mỗi phần tử k của K được gọi là một khoá (Key) Số lượng của không gian khoá phải
đủ lớn để không có đủ thời gian thử mọi khoá;
E (Encrytion) là tập hợp các qui tắc mã hóa có thể
D (Decrytion) là tập hợp các qui tắc giải mã có thể Đối với mỗi 𝑘 ∈ 𝐾 có một quy tắc mã 𝑒𝑘: 𝑃 → C và một quy tắc giải mã tương ứng dk ∈ D
Mỗi ek: P → C và dk: C → P là những hàm mà: 𝑑𝑘(𝑒𝑘(𝑥)) = 𝑥 với mỗi x ∈ P
Chúng ta đã biết một thông tin thường được tổ chức dưới dạng bản rõ Người gửi sẽ làm nhiệm vụ mã hoá bản rõ, kết quả thu được gọi là bản mã Bản mã này được gửi đi trên một đường truyền tới người nhận, sau khi nhận được bản mã người nhận giải mã nó để tìm hiểu nội dung
Thuật toán dùng khi sử dụng định nghĩa hệ mật mã: 𝑒𝑘(𝐶) = 𝑃, 𝑑𝑘(𝑃) = 𝐶
Một mã đối xứng có các đặc trưng là cách xử lý thông tin của thuật toán mã, giải mã, tác động của khóa vào bản mã, độ dài của khóa Mối liên hệ giữa bản rõ, khóa
và bản mã càng phức tạp càng tốt, nếu tốc độ tính toán
là chấp nhận được [3] Cụ thể hai yêu cầu để sử dụng an toàn mã khoá đối xứng là:
+) Thuật toán mã hoá mạnh Có cơ sở toán học vững chắc đảm bảo rằng mặc dù công khai thuật toán, mọi
Trang 2người đều biết, nhưng việc thám mã là rất khó khăn và
phức tạp nếu không biết khóa
+) Khoá mật chỉ có người gửi và người nhận biết Có
kênh an toàn để phân phối khoá giữa các người sử dụng
chia sẻ khóa Mối liên hệ giữa khóa và bản mã là không
nhận biết được
Phần còn lại của bài báo được tổ chức như sau: trong
phần II, chúng tôi miêu tả thuật toán Trong phần III,
chúng tôi xây dựng demo IV cung cấp các kết quả mô
phỏng và phân tích lý thuyết và đánh giá hiệu năng của
hệ thống Cuối cùng, chúng tôi kết luận bài báo trong
phần IV
II THUẬTTOÁNHILLVÀMÃOTP
2.1 Thuật toán Hill
Mã hoá Hill phát minh bởi Lester S Hill năm 1929, là
mật mã cổ điển cho phép mã hoá hai, hoặc ba, hoặc
nhiều hơn các ký tự (theo lý thuyết) tại cùng thời điểm
Mã hoá Hill sử dụng hai lý thuyết toán học cực kì quan
trọng trong ngành mật mã là Đại số tuyến tính và Số học
mô-đun [8]
Để thuật tiện cho quá trình mã hoá, quy ước mỗi chữ cái
trong bảng chữ cái tương ứng với một giá trị theo thứ tự
tăng dần Vì thuật toán Hill thực hiện việc mã hoá theo
khối block gồm m ký tự tại cùng một thời điểm
Bước 1: Mã hóa
Cho biết khoá K và thông điệp P, mã hoá Hill thực hiện
phép nhân ma trận giữa K và P để mã hoá thông điệp tạo
bản mã C
𝐾 ⋅ 𝑃 ≡ 𝐶(𝑚𝑜𝑑26)
Để mã hoá một thông điệp, chúng ta cần tạo một
khoá K Khoá này là bí mật và chỉ giữa những người
trao đổi thông tin với nhau biết được Khoá phải đảm
bảo 2 tính chất:
K có độ dài là m x m (bình phương độ dài khối
block m)
K là ma trận khả nghịch theo modulo 26
𝐾 ⋅ 𝐾−1≡ 1 (𝑚𝑜𝑑26)
𝐾−1 là ma trận nghịch đảo của K trên vành Z26
Trong thuật toán này mã khoá hợp lệ là khoá có độ dài
2x2 hoặc 3x3 và khả nghịch theo modulo 26
Thỏa mãn: Khóa phải có độ dài là số chính phương [7]
Bước 2: Giải mã
Cho biết khoá 𝐾 và bản mã 𝐶, mã hoá Hill thực hiện
phép nhân ma trận nghịch đảo 𝐾−1và bản mã 𝐶 để tạo
thông điệp gốc 𝑃
𝐾−1⋅ 𝐶 ≡ 𝑃(𝑚𝑜𝑑26) Trước hết, để tìm ma trận nghịch đảo 𝐾−1, chúng ta đã
biết theo lý thuyết đại số tuyến tính:
𝐾−1= 1𝑑𝑒𝑡(𝐾) 𝐾∗
Trong đó 𝑑𝑒𝑡(𝐾) là định thức ma trận K, và 𝐾∗ là ma
trận liên hợp của 𝐾 Tuy nhiên đối với mã hoá Hill,
chúng ta đang cần tìm ma trận nghịch đảo 𝐾−1 theo
modulo 26, công thức trở thành:
𝐾−1= det (𝐾)−1 𝐾∗(𝑚𝑜𝑑26)
Trong đó, 𝑑𝑒𝑡𝐾−1 là nghịch đảo của 𝑑𝑒𝑡(𝐾) theo modulo 26:
𝑑𝑒𝑡𝐾∗det (𝐾)−1≡ 1(𝑚𝑜𝑑26) Chúng ta tìm được nghịch đảo của 𝑑𝑒𝑡(𝐾) bằng cách lặp các giá trị từ 0 tới 25, nhân với 𝑑𝑒𝑡(𝐾) và lấy dư phép chia 26, giá trị thoả mãn chia 26 dư 1 chính là det (𝐾)−1
2.2 Mã OTP
Hệ mật mã với khóa sử dụng một lần OTP (One Time Pad) là một hệ mật mã dòng, đã được chứng minh có độ
an toàn hoàn hảo Đặc điểm nổi bật của hệ mật này là mỗi khóa chỉ sử dụng đúng một lần và không bao giờ được dùng lại Nhưng nhược điểm cơ bản của hệ mật này là độ dài của khóa phải bằng đúng độ dài của bản rõ
và một yêu cầu rất khắt khe nữa là các khóa phải được sinh thực sự ngẫu nhiên Đây là một điều kiện rất khó thực hiện ngay cả các chuỗi ngẫu nhiên được sinh tự động bằng máy tính cũng mới chỉ là giả ngẫu nhiên vì chúng phụ thuộc vào một cái nhân (seed) cho trước[4] Lược đồ này gồm ba qui trình sau:
Bước 1 Mã hóa:
Chia bản rõ thành các khối có kích thước bằng 256 bit Nếu không chẵn thì phải chèn thêm cho đủ một khối Băm bản rõ bằng một hàm băm với giá trị băm có kích thước bằng 256 bit Giá trị băm này được chọn làm khóa OTP khởi đầu, gọi là K1 Sau đó, K1 sẽ được XOR với khối bản rõ thứ nhất để tạo ra khối bản mã thứ nhất Các khóa OTP tiếp theo, Ki (i >= 2) sẽ được sinh ra bằng cách mã hóa khối bản rõ thứ i − 1 bằng hệ mật AES256 với khóa Ki−1 Các khóa mới được sinh ra lại được XOR với khối bản rõ tương ứng để tạo ra các khối bản
mã tiếp theo Ghép tất cả các khối bản mã để thu được bản mã
Bước 2 Ký bản rõ và gửi bản mã:
Khóa K1 được mã hóa bằng khóa bí mật của người gửi Sau đó, lại được mã hóa bằng khóa công khai của người nhận Gửi cho bên nhận thông tin đã mã hóa này và bản
mã
Bước 3 Xác thực và giải mã: Người nhận sử dụng khóa
bí mật của mình và khóa công khai của người gửi để giải mã ra khóa K1 Chia bản mã thành các khối có kích thước 256 bit sau đó làm tương tự như quá trình mã hóa
để thu được bản rõ
Lược đồ trên, đã lấy giá trị băm của bản rõ làm khóa OTP Vì các bản rõ là những văn bản bất kỳ nên giá trị băm của chúng là các chuỗi bit ngẫu nhiên và gần như là duy nhất đối với mỗi bản rõ Việc chọn giá trị băm làm khóa OTP đã làm giảm đáng kể độ dài của khóa đối với những bản rõ có dung lượng lớn Các khóa tiếp theo được sinh ra bằng thuật toán AES trên khối bản rõ tương ứng với khóa được sinh ra trước đó vẫn đảm bảo được tính OTP
Trong hệ mã với khóa sử dụng một lần OTP (One -_Time Pad) mỗi byte của bản rõ được mã hóa bằng một byte của luồng khóa và mỗi byte khóa chỉ được sử dụng đúng một lần và không bao giờ được sử dụng lại Trong
hệ mật mã này độ dài của khóa phải bằng đúng độ dài
Trang 3của bản rõ và phải là một luồng được sinh ra thực sự
ngẫu nhiên, tức là mọi byte của khóa có thể nhận bất kỳ
giá trị nào trong khoảng từ 0 đến 255 với xác suất như
nhau và độc lập với giá trị của tất cả các byte khóa khác
[2] Trong hệ mã OTP, bản rõ được biểu diễn dưới dạng
một chuỗi nhị phân, luồng khóa cũng là một chuỗi nhị
phân có độ độ dài bằng độ dài bản rõ
Việc mã hóa bằng OTP thường được ký hiệu là:
Ci = Pi Ki , (i = 1, 2, 3, )
Trong đó Pi là ký tự thứ i của bản rõ, Ki là byte thứ
i của khóa được sử dụng để mã hóa bản rõ này và Ci là
ký tự thứ i của bản mã kết quả, là ký hiệu của phép
cộng loại trừ (XOR), phép toán hay được dùng trong mã
hóa OTP nhưng vẫn có thể được thay bằng phép toán
khác
Quá trình giải mã được làm tương tự như mã hóa :
Pi = Ci Ki
Tuy nhiên, phương pháp One_Time_ Pad không có ý
nghĩa sử dụng thực tế vì chiều dài khóa bằng chiều dài
bản tin, mỗi khóa chỉ sử dụng một lần, nên thay vì
truyền khóa trên kênh an toàn thì có thể truyền trực tiếp
bản rõ mà không cần quan tâm đến vấn đề mã hóa nữa
2.3 Kết hợp thuật toán Hill và mã OTP
Bước 1: Mã hóa
def int_matrix_to_str(matrix, alphabet):
word = ""
n = len(matrix)
for i in range (n):
for j in range (n):
word += int_to_char(matrix[i][j], alphabet)
return word
Bước 2: Tạo ma trận có đảo ngược ngẫu nhiên
def gen_random_inv_matrix(n, alphabet):
matrix = gen_random_matrix(n, alphabet)
while not is_invertible_matrix(matrix, alphabet):
matrix = gen_random_matrix(n, alphabet)
return matrix
Bước 3: Tạo khóa dùng mã OTP
if len(word) <= 0:
return None
n = int(math.sqrt(len(word)))
if n * n != len(word):
return None
matrix = [[0 for i in range (n)] for j in range (n)]
k = 0 (Đây là khóa khởi đầu cho luồng OTP)
for i in range (n):
for j in range (n):
matrix[i][j] = char_to_int(word[k], alphabet)
k 1 XOR C i
Các khóa OTP tiếp theo, 𝐾𝑖(𝑖 = 2, 3, , 𝑛) sẽ
được sinh ra bằng cách mã hóa khối bản rõ 𝑃𝑖−1 bằng
hệ mật AES256 với khóa 𝑘𝑖−1 Các khóa mới được sinh
ra lại được XOR với khối bản rõ tương ứng để tạo ra các khối bản mã tiếp theo
return matrix
Bước 4: Tính ma trận nghịch đảo
et = np.linalg.det(matrix)
if math.gcd(int(round(det)), len(alphabet)) == 1: matrix = Matrix(matrix)
return np.array(matrix.inv_mod(len(alphabet))) else:
return None
Bước 5: Giải mã
plaintext = ""
ciphervector = [0 for i in range (n)]
messagevector = [0 for i in range (n)]
block = 0 while block * n < len(_ciphertext):
for i in range (n):
ciphervector[i] = char_to_int(_ciphertext[i + block * n], alphabet)
print("Cipher vector: ") print(ciphervector) for i in range (n):
messagevector[i] = 0 for j in range (n):
messagevector[i] += invkmatrix[i][j] * ciphervector[j]
print(messagevector[i]) plaintext += str(int_to_char(messagevector[i], alphabet))
block += 1 return plaintext
2.4 Đánh giá độ an toàn
Khóa OTP đề xuất kết hợp với thuật toán Hill có khả năng xác thực nguồn gốc và tính toàn vẹn của bản tin nhận được Vì thế ngoài khả năng chống được các dạng tấn công đối với các hệ mã khối thông thường khác, thuật toán còn có thể chống lại một số dạng tấn công giả mạo trong thực tế [5]
Ngoại trừ khối đầu tiên được mã hóa và giải mã theo phương pháp của các hệ mã lũy thừa như: RSA, Elgamal…thì các khối còn lại của bản tin được mã hóa/giải mã hoàn toàn theo nguyên tắc của hệ mã OTP
Vì thế, về căn bản hiệu quả thực hiện của thuật toán kết hợp tương đương với hệ mã OTP
Trong phần thực nghiệm chúng tôi đã để khóa dưới dạng ma trận 2x2 và 3x3 Các khóa này được tạo ra hoàn toàn ngẫu nhiên mà người dùng không cần phải tính xem khóa có độ dài là số chính phương
III KẾTQUẢ Trong phần này, chúng tôi thực hiện các mô phỏng thuật toán Hill kết hợp với mã OTP để mã hóa và giải
mã thông điệp bằng các công thức đã được trình bày ở
Trang 4phần II Việc sử dụng khóa OTP để mã hóa/giải mã bản
tin, trong đó khóa kOTP được sử dụng tương tự như hệ
mã OTP [6] cho phép loại trừ hầu hết các dạng tấn công
đã được biết đến trong thực tế: thám mã vi sai, thám mã
tuyến tính, tấn công bản mã có lựa chọn, tấn công bản rõ
đã biết
Các phương pháp tấn công này hoàn toàn không có
tác dụng với khóa OTP do kOTP chỉ sử dụng 1 lần cùng
với bản tin được mã hóa, hơn nữa với kích thước 128 bit
thì phương pháp vét cạn là không khả thi để tấn công
các khóa con ki [2]
3.1 Thực nghiệm với bản rõ với các kí tự chữ a đến z với
các khóa ma trận 2x2 và 3x3
Hình 1 Chuyển đổi ma trận 2x2
Hình 2 Chuyển đổi ma trận 3x3
3.2 Thực nghiệm với bản rõ với các kí tự chữ a đến z và
các số từ 0 đến 9 với các khóa ma trận 2x2 và 3x3
Hình 3 Chuyển đổi ma trận 2x2
Hình 4 Chuyển đổi ma trận 3x3 với bản rõ z26
3.2 Thực nghiệm với bản rõ với các kí tự chữ và các số với các khóa ma trận 2x2 và 3x3
Trang 5Hình 5 Chuyển đổi ma trận 2x2
Hình 6 Chuyển đổi ma trận 3x3
IV KẾTLUẬN
Sự phát triển vượt bậc của công nghệ thông tin và
truyền thông đã đem lại rất nhiều ứng dụng trong thực tế
và thu được những kết quả hết sức to lớn thúc đẩy xã
hội phát triển không ngừng Để đáp ứng được các nhu cầu bảo mật và việc áp dụng các kỹ thuật mã hóa, các nhà khoa học đã nỗ lực nghiên cứu, đề xuất, cải tiến các thuật toán mã hóa để phù hợp với tình hình mới và giải quyết được những bài toán mới phát sinh trong thực tiễn Trong bài báo này, chúng tôi đề xuất và tiến hành thực nghiệm thuật toán Hill kết hợp với mã OTP để mã hóa và giải mã thông điệp dựa trên ngôn ngữ lập trình Python Đề xuất của bài báo nhằm giải quyết khó khăn trong việc chọn khóa có tính khả nghịch cho thuật toán
mã hóa Hill Đây là thuật toán dựa trên sự kết hợp của
mã dòng và mã khối, sử dụng hàm băm SHA256 để sinh khóa OTP ban đầu Thuật toán AES để sinh khóa OTP tiếp theo cho mỗi khối dữ liệu 256 bit Thuật toán này sẽ tăng tốc độ mã hóa và giải mã, tăng tính bảo mật, giảm
độ dài khóa bí mật, đồng thời thuật toán cònxác thực được nội dung của thông điệp và bảo mật được khóa ban đầu nhờ hệ mật khóa công khai RSA và thuật toán Hill TÀILIỆUTHAMKHẢO
[1] Nguyễn Đức Toàn, Nguyễn Văn Tảo, (2016), “Thiết kế các bộ tạo dãy giả ngẫu nhiên có chu kỳ cực đại”, Tạp chí Khoa học và Công nghệ, Chuyên san Khoa học Tự nhiên Kỹ thuật – Đại học Thái Nguyên, ISSN 1859-2171, Tập 159, Số 14, tr 115 – 118 [2] Nguyễn Đức Toàn, Bùi Thế Hồng, Nguyễn Văn Tảo, Trần Mạnh Hường, (2016), “Mã hóa và xác thực thông điệp bằng thuật toán mật mã với khóa sử dụng một lần”, Kỷ yếu Hội nghị Khoa học Công nghệ Quốc gia lần thứ IX (FAIR’9), Nhà xuất bản Khoa học Tự nhiên và Công nghệ, ISBN
978-604-913-472-2, tr 284 -289
[3] Nguyễn Đức Toàn, Nguyễn Văn Tảo, (2016), “Kết hợp phương thức xử lý mã OTP và mã khối để mã hóa và giải mã thông điệp”, Hội thảo toàn quốc về Điện tử, Truyền thông và Công nghệ thông tin REV/ECIT 2016, Nhà xuất bản Công thương, Chủ đề: 4-1, tr 191 – 196
[4] Ioannis Tsamardinos, Laura E Brown,(2006), “The Max-Min Hill-Climbing Bayesian Network Structure Learning Algorithm”, Machine Learning volume 65, pages31–78 [5] N.J.Croft and M.S.Olivier (2005) “Using an approximated One-Time Pad to Secure ShortMessaging service(SMS)” SATNAC 2005 Proceedings
[6] Raman Kumar,Roma Jindal, Abhinav Gupta , SagarBhalla,
HarshitArora (2011) "A Secure Authentication System-Using
Enhanced One Time Pad Technique" IJCSNS International
Journal of Computer Science and Network Security,VOL.11 No.2,February 2011
[7] SharadPatil , Ajay Kumar (2010) "Effective Secure Encryption Scheme(One Time Pad) using Complement Approach" International Journal of Computer Science & Communication, Vol.1,No.1,January-June 2010, pp.229-233
[8] SharadPatil ,ManojDevare , Ajay Kumar (2007) "Modified One Time Pad Data Security Scheme: Random Key Generation Approach" International Journal of Computer Science and Security (IJCSS) ,Volume (3): Issue(2)