Một trong những ứng dụng của an toàn thông tin là chữ ký số, với đặc điểm là đơn giản cho người sử dụng mà vẫn đảm bảo được tính bảo mật.. RSA hiện là một trong các giải thuật mã hóa khó
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN 1
BÁO CÁO BÀI TẬP LỚN Môn : CƠ SỞ AN TOÀN THÔNG TIN
Đề tài: Tìm hiểu về giải thuật tạo chữ ký số sử dụng RSA
Giảng viên hướng dẫn
Lớp
Nhóm
Danh sách sinh viên
Hoàng Xuân Dậu E22CQCN02-B 02
Mã sinh viên
1 Nguyễn Văn Linh
2 Phạm Như Linh
3 Trịnh Diệu Linh
4 Vũ Ngọc Linh
B22DCVT307 B22DCDT178 B22DCVT310 B22DCDT179
Trang 2HÀ NỘI - 2024
Trang 3LỜI NÓI ĐẦU
Ngày nay trong mọi hoạt động của con người thông tin đóng một vai trò quan trọng không thể thiếu Xã hội càng phát triển nhu cầu trao đổi thông tin giữa các thành phần trong xã hội ngày càng lớn Mạng máy tính ra đời đã mang lại cho con người rất nhiều lợi ích trong việc trao đổi và xử lý thông tin một cách nhanh chóng và chính xác Chính từ những thuận lợi này đã đặt ra cho chúng ta một câu hỏi, liệu thông tin đi từ nơi gửi đến nơi nhận có đảm bảo an toàn tuyệt đối, ai có thể đảm bảo thông tin của ta không
bị truy cập bất hợp pháp Đặc biệt khi các phương thức tấn công qua mạng ngày càng tinh
vi, phức tạp có thể dẫn đến mất mát thông tin, thậm chí sụp đổ hoàn toàn hệ thống thông tin tổ chức Vì vậy an toàn thông tin là nhiệm vụ quan trọng, nặng nề và khó đoán trước đối với các hệ thống thông tin
Một trong những ứng dụng của an toàn thông tin là chữ ký số, với đặc điểm là đơn giản cho người sử dụng mà vẫn đảm bảo được tính bảo mật Kỹ thuật sử dụng chữ ký số được sử dụng phổ biến, đa dạng trong hầu hết các lĩnh vực, nhất là Tài chính, Ngân hàng,
Kế toán,…
Hiện nay, Bộ Thông tin và Truyền thông, Bộ Công thương, Bộ Tài chính và Ngân hàng Nhà nước Việt Nam đã được Chính phủ cho phép triển khai chữ ký số và xác thực thanh toán điện tử từ năm 2006 Hiện nay, Hàn Quốc cũng đang giúp ta triển khai hạ tầng
cơ sở khóa công khai PKI trong Chính phủ điện tử
Để có thể ứng dụng các phương pháp trên vào thực tiễn, chúng em đã tìm hiểu về
đề tài “Tìm hiểu về giải thuật tạo chữ ký số RSA”.
Do khả năng còn hạn chế, nên mặc dù chúng em đã cố gắng nhằm hoàn thành tốt nhiệm vụ của mình nhưng vẫn không thể tránh khỏi những thiếu sót Nhóm em mong nhận được những lời nhận xét quý giá từ thầy để có thể tiếp tục hoàn thiện hơn nữa Cuối cùng, nhóm xin được gửi lời cảm ơn đến thầy PGS.TS Hoàng Xuân Dậu đã hướng dẫn nhóm trong suốt quá trình hoàn thành tiểu luận
Chúng em xin chân thành cảm ơn thầy!
Trang 4MỤC LỤC
1 GIỚI THIỆU 4
1.1.Khái niệm 4
1.2 Giải thuật mã hóa RSA 4
1.3 Chữ ký số mã hóa RSA 5
1.4 Hàm băm (Hash function) 5
2 NỘI DUNG 6
2.1 Kiến trúc 6
2.1.1 Quá trình ký (bên gửi) 6
2.1.2 Quá trình kiểm tra chữ ký (bên nhận) 7
2.2 Giải thuật mã hóa RSA 8
2.3 Cài đặt thử nghiệm tạo và kiểm tra chữ ký số để đảm bảo toàn vẹn dữ liệu 9
2.3.1 Sử dụng python3 để cài đặt chương trình tạo và kiểm tra chữ ký số 9
2.3.2 Nhận xét 13
2.4 Ưu điểm của giải thuật tạo chữ ký số RSA 13
2.4.1 Tính bảo mật cao 13
2.4.2 Hỗ trợ rộng rãi trong các hệ thống và tiêu chuẩn 13
2.4.3 Chữ ký số không phụ thuộc vào dữ liệu gốc 13
2.5 Điểm yếu của giải thuật tạo chữ ký số RSA 14
2.6 Các dạng tấn công 15
2.6.1 Tìm cách xác định khóa bí mật 15
2.6.2 Giả mạo chữ ký 16
2.6.3 Tấn công người dùng 16
2.7 Ứng dụng 17
3 KẾT LUẬN 17
4 TÀI LIỆU THAM KHẢO 18
Trang 51 GIỚI THIỆU
1.1.Khái niệm
Chữ ký số (Digital Signature) là những thông tin đi kèm với dữ liệu nhằm chứng thực
nguồn gốc và nội dung của văn bản Chữ ký số được dựa trên cơ sở lý thuyết hệ mã hóa công khai, còn gọi là mã hóa bất đối xứng được tạo ra để giải quyết câu hỏi: “Làm thế nào
để định nghĩa một chữ ký cho các văn bản số, với các tính chất tương tự như chữ ký viết tay?”
Mã hóa công khai hay còn gọi là mã hóa bất đối xứng: Sử dụng 2 khóa có quan hệ toán
học với nhau, khóa công khai dùng để mã hóa, được công bố rộng rãi Khóa còn lại là khóa bí mật dùng để giải mã, được giữ bí mật Cơ sở toán học của hệ mã hóa bất đối xứng
là dùng những hàm một chiều, tức là những hàm để tính theo chiều thuận thì dễ còn chiều ngược lại thì không khả thi với máy tính hiện tại
Chữ ký số bao gồm 3 thành phần:
1 Thuật toán tạo ra khóa
2 Hàm tạo chữ ký là hàm tính toán chữ ký trên cơ sở khóa mật và dữ liệu cần ký
3 Hàm kiểm tra chữ ký là hàm kiểm tra xem chữ ký đã cho có đúng với khóa công cộng không (Khóa này mọi người có quyền truy cập nên mọi người đều có thể kiểm tra được chữ ký)
Giải thuật tạo ra chữ ký số (Digital Signature generation algorithm) là một phương
pháp sinh chữ ký số
Giải thuật kiểm tra chữ ký số (Digital Signature verification algorithm) là một phương
pháp xác minh tính xác thực của chữ ký số, có nghĩa là nó thực sự được tạo ra bởi 1 bên chỉ định
Một hệ chữ ký số (Digital Signature Scheme) bao gồm giải thuật tạo chữ số và giải
thuật kiểm tra chữ ký số
Quá trình tạo chữ ký số (Digital Signature signing process) bao gồm:
Giải thuật tạo chữ ký số
Phương pháp chuyển dữ liệu thông điệp thành dạng có thể ký được
Quá trình kiểm tra chữ ký số (Digital signature verification process) bao gồm:
Giải thuật kiểm tra chữ ký số
Phương pháp khôi phục dữ liệu từ thông điệp
1.2 Giải thuật mã hóa RSA
Giải thuật mã hóa RSA là một hệ mã hóa bất đối xứng được 3 nhà khoa học người Mỹ
là R.Rivest, A.Shamir và L.Adleman phát minh năm 1977 và tên giải thuật RSA được đặt theo chữ cái đầu của tên 3 đồng tác giả Độ an toàn của RSA dựa trên tính khó của việc phân tích số nguyên rất lớn, với độ lớn cỡ hàng trăm chữ số thập phân RSA sử dụng một cặp khóa, trong đó khóa công khai dùng để mã hóa và khóa riêng dùng để giải mã Chỉ khóa riêng RSA cần giữ bí mật, còn khóa công khai có thể công bố rộng rãi
Trang 6Hiện nay, các khóa RSA có kích thước nhỏ hơn 1024 bit được coi là không an toàn do tốc độ các hệ thống máy tính tăng nhanh Để đảm bảo an toàn, khuyến nghị sử dụng khóa
2048 bit trong giai đoạn 2010-2020 Trong tương lai, cần sử dụng khóa RSA lớn hơn, chẳng hạn 3072 bit
RSA hiện là một trong các giải thuật mã hóa khóa bất đối xứng được sử dụng rộng rãi nhất trên thực tế: RSA có thể được sử dụng để mã hóa thông điệp, để tạo và kiểm tra chữ
ký số Hoạt động của RSA dựa trên 4 bước chính: sinh khóa, chia sẻ khóa, mã hóa và giải mã
1.3 Chữ ký số mã hóa RSA
Chữ ký số mã hóa RSA là loại chữ ký số sử dụng hệ mã hóa RSA để tăng độ an toàn
và bảo mật cho thông điệp dữ liệu
RSA đóng vai trò quan trọng trong việc tạo ra chữ ký số bằng cách sử dụng cặp khóa không đối xứng: khóa công khai và khóa bí mật Quy trình tạo chữ ký số với thuật toán RSA diễn ra như sau:
Người gửi phải sở hữu cặp khóa công khai (Public key) và khóa bí mật (Private key) Khóa công khai được công khai tới người nhận
Người gửi sử dụng khóa bí mật để tạo chữ ký số cho thông điệp (bản chất là sử dụng khóa bí mật để mã hóa chuỗi đại diện cho thông điệp)
Người nhận sử dụng khóa công khai của người gửi để kiểm tra chữ ký số của thông điệp (bản chất là sử dụng khóa công khai để giải mã khôi phục chuỗi đại diện cho thông điệp)
1.4 Hàm băm (Hash function)
Hàm băm là hàm toán học chuyển đổi thông điệp (message) có độ dài bất kỳ (hữu hạn)
thành một dãy bit có độ dài cố định (tùy thuộc vào thuật toán băm) Dãy bit này được gọi
là thông điệp rút gọn (message digest) hay giá trị băm (hash value), đại diện cho thông điệp ban đầu
Ví dụ hàm băm SHA-256 (Thuật toán băm an toàn 256-bit) là hàm băm được sử dụng rộng rãi, tạo ra giá trị băm 256-bit Nó là một phần của họ hàm băm SHA-2 và được biết đến với các đặc tính bảo mật mạnh mẽ, bao gồm khả năng chống tiền ảnh, khả năng chống tiền ảnh thứ hai và khả năng chống va chạm SHA-256 thường được sử dụng trong các thuật toán chữ ký số như RSA, DSA và ECDSA
Để tạo chữ ký, người gửi sẽ dùng khóa riêng và người nhận sẽ dùng khóa công khai để xác thực chữ ký đó Tuy nhiên, vì bản tin rất dài nên việc mã hóa toàn bộ bản tin sẽ rất mất thời gian Vì vậy, trong thực hành, chữ ký số thường sử dụng phương pháp mã hóa giá trị băm của bản tin Việc này mang lại rất nhiều lợi ích như:
Các hàm băm là hàm 1 chiều, vì vậy dù có được giá trị băm cũng không thể biết được bản tin gốc như thế nào
Độ dài giá trị băm là cố định và thường rất nhỏ, vì vậy sẽ không chiếm quá nhiều dung lượng
Giá trị băm còn có thể dùng để kiểm tra lại bản tin nhận được có nguyên vẹn hay không?
Trang 72 NỘI DUNG
2.1 Kiến trúc
2.1.1 Quá trình ký (bên gửi)
2.1.1.1 Chuẩn bị thông điệp:
Người ký chuẩn bị một thông điệp (gọi là m) mà họ muốn ký Thông điệp này có thể là bất kỳ chuỗi dữ liệu nào (ví dụ: tài liệu văn bản, hợp đồng, thông điệp điện tử)
2.1.1.2 Tạo hàm băm của thông điệp:
Trước khi ký, thông điệp cần được băm bằng một hàm băm mật mã (ví dụ như SHA-256) Điều này tạo ra một giá trị băm của thông điệp (gọi là H(m)
Giá trị băm là một chuỗi có độ dài cố định, đại diện duy nhất cho nội dung thông điệp mmm Việc sử dụng hàm băm giúp đảm bảo tính toàn vẹn của thông điệp và giảm kích thước thông điệp cần ký
2.1.1.3 Mã hóa giá trị băm bằng khóa riêng:
Người ký sử dụng khóa riêng RSA của mình để mã hóa giá trị băm H(m)
Cụ thể, họ sẽ tính S=H(m)d mod n trong đó:
S là chữ ký số
d là khóa riêng của người ký
n là mô-đun công khai (nằm trong cặp khóa công khai và khóa riêng của RSA)
Kết quả của phép mã hóa này là một chuỗi gọi là chữ ký số S Chữ ký này được gửi cùng với thông điệp m đến bên nhận
2.1.1.4 Gửi thông điệp và chữ ký:
Người ký gửi thông điệp m và chữ ký số S cho người nhận Bên nhận cần phải kiểm tra tính xác thực và toàn vẹn của thông điệp thông qua chữ ký số này
Trang 82.1.2 Quá trình kiểm tra chữ ký (bên nhận)
2.1.2.1 Nhận thông điệp và chữ ký số
Người nhận nhận được cả thông điệp gốc và chữ ký số từ người gửi Thông điệp này là nội dung mà người gửi muốn gửi đi, và chữ ký số là kết quả của việc mã hóa giá trị băm của thông điệp bằng khóa riêng của người gửi
2.1.2.2 Tạo giá trị băm từ thông điệp nhận được
Người nhận sẽ sử dụng cùng một hàm băm (hash function) mà người gửi
đã sử dụng để tính toán giá trị băm của thông điệp gốc nhận được Kết quả là một giá trị băm (gọi là H′(m))
H′(m) = Hàm băm(thông điệp)
2.1.2.3 Giải mã chữ ký số bằng khóa công khai của người gửi
Chữ ký số đã được người gửi mã hóa bằng khóa bí mật, vì vậy người nhận sẽ sử dụng khóa công khai của người gửi để giải mã chữ ký số S
Giải mã S sẽ cho ra giá trị băm H(m) mà người gửi đã tạo khi ký thông điệp
Phép giải mã: H(m)=Dpublic key(S) trong đó:
Dpublickey là phép giải mã sử dựng khoá công khai của người gửi
S là chữ kí số nhận được
Trang 9
2.1.2.4 So sánh giá trị băm
Sau khi giải mã chữ ký số, người nhận so sánh giá trị băm H(m) vừa giải
mã với giá trị băm H′(m) mà họ đã tính toán từ thông điệp nhận được
Nếu hai giá trị băm này trùng khớp, điều đó có nghĩa là:
Thông điệp không bị thay đổi trong quá trình truyền tải
Chữ ký số thực sự được tạo ra bởi người gửi (người có khóa riêng tương ứng với khóa công khai mà người nhận sử dụng)
Nếu hai giá trị băm không trùng khớp, thông điệp có thể đã bị thay đổi hoặc chữ ký số không hợp lệ
2.2 Giải thuật mã hóa RSA
Hoạt động của RSA dựa trên 3 bước chính: sinh khóa, mã hóa và giải mã
Bước 1: Sinh khoá
1 Chọn hai số nguyên tố lớn p và q
2 Tính n = p*q ( n sẽ được dùng làm module trong cả khoá công khai và khoá bí mật,
n có độ dài bit bằng tổng độ dài bit của p và q)
3 Tính hàm Euler ϕ(n) = (p-1)*(q-1) ( Hàm Euler đại diện cho số lượng các số nhỏ hơn n mà nguyên tố cùng nhau với n )
4 Tính giá trị d, là nghịch đảo của e modulo ϕ(n), sao cho d*e=1 mod ϕ(n).d là thành phần của khoá bí mật
Khoá công khai (n, e)
Khoá bí mật (n, d)
Bước 2: Mã hoá
Trang 10Để mã hoá thông điệp M (thường là một số nguyên hoặc chuỗi dữ liệu đã được chuyển đổi thành số nguyên bằng khoá công khai (n, e))
1 Chuyển đổi thông điệp thành một số nguyên M sao cho 0 ≤ M ≤ n
2 Tính bản mã C= Me mod n
Bản mã C là kết quả của phép toán luỹ thừa mô-đun và sẽ được gửi đến người nhận
Bước 3: Giải mã
Để giải mã bản mã C và khôi phục thông điệp M, người nhận sử dụng khoá riêng tư (n,d) bằng công thức : M= Cd mod n (M là thông điệp ban đầu được gửi)
Ví dụ:
Bước 1: Sinh khoá
Chọn hai số nguyên tố p=3 và q=7
Tính n = p*q = 3*7 = 21
Tính ϕ(n) = (p-1) *(q-1) = 2*6 = 12
Chọn số e sao cho 0 < e < 12 và e, n, ϕ(n) là các số nguyên tố cùng nhau => e = 5
Tìm d sao cho d*e = 1 mod ϕ(n) => d*5 = 1 mod 12 => d=17 (d=5 không được vì trùng với e)
Ta có: khóa công khai là (21,5) và khóa riêng là (21,17)
Bước 2: Mã hoá
Giả sử muốn gửi mã M=2
Tính bản mã C= Me mod n = 25 mod 21=11
Gửi bản mã C=11 cho người nhận
Bước 3: Giải mã
Với bản mã C=11 ta có M= Cd mod n= 1117 mod 21=2
Vậy bản rõ M=2
2.3 Cài đặt thử nghiệm tạo và kiểm tra chữ ký số để đảm bảo toàn vẹn dữ liệu
2.3.1 Sử dụng python3 để cài đặt chương trình tạo và kiểm tra chữ ký số.
2.3.1.1 Cài đặt thư viện PyCryptodome
Thư viện PyCryptodome được sử dụng để thực hiện các thao tác liên quan
đến mã hóa và bảo mật dữ liệu
pip install pycryptodome
2.3.1.2 Tạo khóa
Sử dụng thư viện PyCryptodome để tạo một cặp khóa RSA 1024 bit, cặp
khóa này được tạo ngẫu nhiên
Khóa riêng tư sẽ được lưu vào file private.key
Khóa công khai sẽ được lưu vào file public.key
Trang 11from Crypto.PublicKey import RSA
# Tạo ra khóa RSA 1024 bit
key = RSA.generate( 1024 )
# Viế t khóa riếng tư vào file
private_key = key.export_key()
file_out = open("private.key", "wb")
file_out.write(private_key)
file_out.close()
print(private_key)
print()
# Viế t khóa công khai vào file
public_key = key.publickey().export_key()
file_out = open("public.key", "wb")
file_out.write(public_key)
file_out.close()
print(public_key)
print()
Output:
b' -BEGIN RSA PRIVATE KEY -\
nMIICXAIBAAKBgQCqaH/NR4ftKVyB+3mkZZNu5IL36pBYVNVtnQDAsa9r+KrUcjG7\
nO2ttTiDMMA/UH3WnZmqhvuJuqnBTRBRviz9CXqdZ2Awf7jFswdgIpQZ3b82UDCUw\
nAsJmY2I8uHKKGSkxYc0Nm8u6kTqIG0+QKoHspEzYxZS1gW98nYUov7wN9QIDAQAB\
nAoGABpLBW0nHFH7j8p+gsZa5eS2XX7jMmJutH+1OeiBgg+mzrT46bN595ll9KmMw\
nOR59i1eIBXU3hs1MR+n4X9UfO3/2wmcXfwHH9jbxiJ59x3qtULP83i/gCzMEheBE\
nIit41TMh7GzIt36a7P9+Hmapat5IE9P4sfjyNM+fg//SzoECQQC7yQg84/m6mPOV\
njr3DFC4IY81IGcjnNc7SQB4uy9ofv9JoIJhjJGHb94scGSwraT4k7C+moWKg9xFa\
noNamWbADAkEA6E9/MNaE22Vvj/UVaWZXIUG86Y5sTFYAksgaz+27WyIDB4jbbZnz\
ngsnqHn3lIfNCx/2cjxmbnzyyXf9/iH4UpwJBALJo8CuxyRzwnlSUdlP2QznzYCDF\
nZqvM4n+9LS/2u3j4rXYCqeVftp3fVUpP3DguWD2KLEebAvK9ab56GxWXFnMCQHqw\
noYf1g60rYUQyN+C2gAW8Zj0jTubx9NOQgziVYYG78MWl7d1wlT7ZzJ/V9ZF8nCRr\
nOKgK6jmrILisG3rGu7kCQEmpyeZjY8U9lwik/M3W1sF/0vBLB5KNNTbSscUJFNr+\
nFH+OfX4/KaB/vjweVqWvSlHUavuj4wAB231cHn0v8eM=
\n -END RSA PRIVATE KEY -'
b' -BEGIN PUBLIC KEY -\
nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqaH/NR4ftKVyB+3mkZZNu5IL3\
n6pBYVNVtnQDAsa9r+KrUcjG7O2ttTiDMMA/UH3WnZmqhvuJuqnBTRBRviz9CXqdZ\
n2Awf7jFswdgIpQZ3b82UDCUwAsJmY2I8uHKKGSkxYc0Nm8u6kTqIG0+QKoHspEzY\
nxZS1gW98nYUov7wN9QIDAQAB
\n -END PUBLIC KEY -'
2.3.1.3 Quá trình ký
Nhập thông điệp cần được gửi đi message dưới dạng byte string vì các thuật toán mã hóa như RSA hoặc hàm băm làm việc với byte string thay vì xâu ký
tự thông thường
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
# Tạo thông điệp
message = b'Cong hoa Xa hoi Chu nghia Viet Nam'
print(message)