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.
Hội nghị Quốc gia lần thứ 24 Điện tử, Truyền thông Công nghệ Thông tin (REV-ECIT2021) Kết hợp thuật toán mật mã Hill mã OTP mã hóa giải mã thơng điệp Vũ Ngọc Phan1 Nguyễn Đức Tồn2 Trường Đại học Tài ngun Mơi trường Hà Nội Email: vnphan@hunre.edu.vn Học viện Phụ nữ Việt Nam Email: ductoanndt9@gmail.com Abstract: Trong báo chúng tơi đề xuất kết hợp phương pháp mã hóa Hill mã OTP để mã hóa giải mã thơng điệp dựa ngơn ngữ lập trình Python Thuật tốn mã hóa Hill thuật tốn dễ dàng, nhiên khó khăn chọn khóa cho thỏa mãn khóa có tính khả nghịch Mã OTP mã khóa dùng lần, báo đề xuất dùng mã OTP làm khóa cho thuật tố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 3x3 Do khóa nhận có tính ngẫu nhiên Keywords- Python, Hill, OTP, mã hóa, giải mã I điều kiện sau [1]: GIỚI THIỆU Với phát triển nhanh chóng cơng nghệ thơng tin, bảo mật thông tin ngày 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, sử dụng phương pháp này, đối tượng cần bảo mật chuyển thành dạng mật mã khó hiểu nên gây ý nhiều Điều làm cho kẻ xấu tìm cách giải mã để hiểu nội dung đối tượng bảo vệ Nhằm tránh gây ý, phương pháp bảo mật khác đề xuất sử dụng rộng rãi giấu tin mật Thông tin cần bảo vệ ẩn giấu đối tượng mang tin, thường ảnh, video, âm thanh, văn bản,… Kỹ thuật có ưu điểm thơng tin khơng bảo vệ mà cịn che giấu tồn Mật mã đối xứng sử dụng khóa cho việc mã hóa giải mã Có thể nói mã đối xứng mã khố hay mã khóa riêng hay mã khố thỏa thuận Ở người gửi người nhận chia sẻ khố chung K, mà họ trao đổi bí mật với Ta xét hai hàm ngược nhau: E hàm biến đổi rõ thành mã D hàm biến đổi mã trở rõ Giả sử X văn cần mã hóa Y dạng văn thay đổi qua việc mã hóa Khi ta ký hiệu: Y = EK (X) X = DK (Y) ISBN 978-604-80-5958-3 Mọi thuật toán mã cổ điển mã khoá đối xứng, thơng tin khóa chia sẻ người gửi người nhận Mã đối xứng kiểu trước phát minh khoá mã cơng khai (cịn gọi mã khơng đối xứng) vào năm 1970 Hiện mã đối xứng cơng khai tiếp tục phát triển hồn thiện Mã công khai đời hỗ trợ mã đối xứng, khơng thay nó, mã đối xứng đến sử dụng rộng rãi Định nghĩa số khái niệm mã hóa Một hệ mật mã (P,C,K,E,D) thoả mãn 221 P (Plaintext) tập hợp hữu hạn rõ gọi không gian rõ C (Ciphertext) tập hữu hạn mã gọi không gian mã K (Key) tập hữu hạn khố hay cịn gọi khơng gian khố Đối với phần tử k K gọi khoá (Key) Số lượng khơng gian khố phải đủ lớn để khơng có đủ thời gian thử khố; E (Encrytion) tập hợp qui tắc mã hóa D (Decrytion) tập hợp qui tắc giải mã Đối với 𝑘 ∈ 𝐾 có quy tắc mã 𝑒𝑘: 𝑃 → C quy tắc giải mã tương ứng dk ∈ D Mỗi ek: P → C dk: C → P hàm mà: 𝑑𝑘(𝑒𝑘(𝑥)) = 𝑥 với x ∈ P Chúng ta biết thông tin thường tổ chức dạng rõ Người gửi làm nhiệm vụ mã hoá rõ, kết thu gọi mã Bản mã gửi đường truyền tới người nhận, sau nhận mã người nhận giải mã để tìm hiểu nội dung Thuật toán dùng sử dụng định nghĩa hệ mật mã: 𝑒𝑘(𝐶) = 𝑃, 𝑑𝑘(𝑃) = 𝐶 Một mã đối xứng có đặc trưng cách xử lý thơng tin thuật tốn mã, giải mã, tác động khóa vào mã, độ dài khóa Mối liên hệ rõ, khóa mã phức tạp tốt, tốc độ tính tốn chấp nhận [3] Cụ thể hai yêu cầu để sử dụng an tồn mã khố đối xứng là: +) Thuật tốn mã hố mạnh Có sở tốn học vững đảm bảo công khai thuật toán, Hội nghị Quốc gia lần thứ 24 Điện tử, Truyền thông Công nghệ Thông tin (REV-ECIT2021) người biết, việc thám mã khó khăn phức tạp khơng biết khóa +) Khố mật có người gửi người nhận biết Có kênh an tồn để phân phối khố người sử dụng chia sẻ khóa Mối liên hệ khóa mã khơng nhận biết Phần cịn lại báo tổ chức sau: phần II, chúng tơi miêu tả thuật tốn Trong phần III, xây dựng demo IV cung cấp kết mơ phân tích lý thuyết đánh giá hiệu hệ thống Cuối cùng, kết luận báo phần IV II THUẬT TỐN HILL VÀ MÃ OTP 2.1 Thuật tốn Hill Mã hoá Hill phát minh Lester S Hill năm 1929, mật mã cổ điển cho phép mã hoá hai, ba, nhiều ký tự (theo lý thuyết) thời điểm Mã hoá Hill sử dụng hai lý thuyết tốn học quan trọng ngành mật mã Đại số tuyến tính Số học mơ-đun [8] Để thuật tiện cho q trình mã hoá, quy ước chữ bảng chữ tương ứng với giá trị theo thứ tự tăng dần Vì thuật tốn Hill thực việc mã hố theo khối block gồm m ký tự thời điểm Bước 1: Mã hóa Cho biết khố K thơng điệp P, mã hố Hill thực phép nhân ma trận K P để mã hoá thông điệp tạo mã C 𝐾 ⋅ 𝑃 ≡ 𝐶(𝑚𝑜𝑑26) Để mã hố thơng điệp, cần tạo khố K Khố bí mật người trao đổi thông tin với biết Khố phải đảm bảo tính chất: K có độ dài m x m (bình phương độ dài khối block m) K ma trận khả nghịch theo modulo 26 𝐾 ⋅ 𝐾 −1 ≡ (𝑚𝑜𝑑26) 𝐾 −1 ma trận nghịch đảo K vành Z26 Trong thuật toán mã khoá hợp lệ khố có độ dài 2x2 3x3 khả nghịch theo modulo 26 Thỏa mãn: Khóa phải có độ dài số phương [7] Bước 2: Giải mã Cho biết khoá 𝐾 mã 𝐶, mã hoá Hill thực phép nhân ma trận nghịch đảo 𝐾 −1 mã 𝐶 để tạo thông điệp gốc 𝑃 𝐾 −1 ⋅ 𝐶 ≡ 𝑃(𝑚𝑜𝑑26) Trước hết, để tìm ma trận nghịch đảo 𝐾 −1 , biết theo lý thuyết đại số tuyến tính: 𝐾 −1 = 1𝑑𝑒𝑡(𝐾) 𝐾 ∗ Trong 𝑑𝑒𝑡(𝐾) định thức ma trận K, 𝐾 ∗ ma trận liên hợp 𝐾 Tuy nhiên mã hố Hill, 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) ISBN 978-604-80-5958-3 222 Trong đó, 𝑑𝑒𝑡𝐾 −1 nghịch đảo 𝑑𝑒𝑡(𝐾) theo modulo 26: 𝑑𝑒𝑡𝐾 ∗ det(𝐾)−1 ≡ 1(𝑚𝑜𝑑26) Chúng ta tìm nghịch đảo 𝑑𝑒𝑡(𝐾) cách lặp giá trị từ tới 25, nhân với 𝑑𝑒𝑡(𝐾) lấy dư phép chia 26, giá trị thoả mãn chia 26 dư det(𝐾)−1 2.2 Mã OTP Hệ mật mã với khóa sử dụng lần OTP (One Time Pad) hệ mật mã dòng, chứng minh có độ an tồn hồn hảo Đặc điểm bật hệ mật khóa sử dụng lần không dùng lại Nhưng nhược điểm hệ mật độ dài khóa phải độ dài rõ yêu cầu khắt khe khóa phải sinh thực ngẫu nhiên Đây điều kiện khó thực chuỗi ngẫu nhiên sinh tự động máy tính giả ngẫu nhiên chúng phụ thuộc vào nhân (seed) cho trước[4] Lược đồ gồm ba qui trình sau: Bước Mã hóa: Chia rõ thành khối có kích thước 256 bit Nếu khơng chẵn phải chèn thêm cho đủ khối Băm rõ hàm băm với giá trị băm có kích thước 256 bit Giá trị băm chọn làm khóa OTP khởi đầu, gọi K1 Sau đó, K1 XOR với khối rõ thứ để tạo khối mã thứ Các khóa OTP tiếp theo, K i (i >= 2) sinh cách mã hóa khối rõ thứ i − hệ mật AES256 với khóa K i−1 Các khóa sinh lại XOR với khối rõ tương ứng để tạo khối mã Ghép tất khối mã để thu mã Bước Ký rõ gửi mã: Khóa K1 mã hóa khóa bí mật người gửi Sau đó, lại mã hóa khóa cơng khai người nhận Gửi cho bên nhận thông tin mã hóa mã Bước Xác thực giải mã: Người nhận sử dụng khóa bí mật khóa cơng khai người gửi để giải mã khóa K1 Chia mã thành khối có kích thước 256 bit sau làm tương tự q trình mã hóa để thu rõ Lược đồ trên, lấy giá trị băm rõ làm khóa OTP Vì rõ văn nên giá trị băm chúng chuỗi bit ngẫu nhiên gần rõ Việc chọn giá trị băm làm khóa OTP làm giảm đáng kể độ dài khóa rõ có dung lượng lớn Các khóa sinh thuật toán AES khối rõ tương ứng với khóa sinh trước đảm bảo tính OTP Trong hệ mã với khóa sử dụng lần OTP (One _Time Pad) byte rõ mã hóa byte luồng khóa byte khóa sử dụng lần không sử dụng lại Trong hệ mật mã độ dài khóa phải độ dài Hội nghị Quốc gia lần thứ 24 Điện tử, Truyền thông Công nghệ Thông tin (REV-ECIT2021) rõ phải luồng sinh thực ngẫu nhiên, tức byte khóa nhận giá trị khoảng từ đến 255 với xác suất độc lập với giá trị tất byte khóa khác [2] Trong hệ mã OTP, rõ biểu diễn dạng chuỗi nhị phân, luồng khóa chuỗi nhị phân có độ độ dài độ dài rõ Việc mã hóa OTP thường ký hiệu là: Ci = Pi K i , (i = 1, 2, 3, ) Trong Pi ký tự thứ i rõ, K i byte thứ i khóa sử dụng để mã hóa rõ Ci ký tự thứ i mã kết quả, ký hiệu phép cộng loại trừ (XOR), phép toán hay dùng mã hóa OTP thay phép tốn khác Q trình giải mã làm tương tự mã hóa : Pi = Ci K i Tuy nhiên, phương pháp One_Time_ Pad ý nghĩa sử dụng thực tế chiều dài khóa chiều dài tin, khóa sử dụng lần, nên thay truyền khóa kênh an tồn truyền trực tiếp rõ mà khơng cần quan tâm đến vấn đề mã hóa 2.3 Kết hợp thuật toán Hill mã OTP 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 = 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] = for j in range (n): messagevector[i] += invkmatrix[i][j] * ciphervector[j] print(messagevector[i]) plaintext += str(int_to_char(messagevector[i], alphabet)) block += return plaintext 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)