Trong thực tế, một kịch bản phổ biến trong trường hợp cần mã hóa thông tin khối lượng lớn là mã hóa thông tin này bằng một giải thuật đối xứng, và sử dụng giải thuật bất đối xứngnhư RSA
Trang 1MỤC LỤC
MỞ ĐẦU 2
CHƯƠNG 1 TỔNG QUAN VỀ CÁC HỆ MẬT MÃ 3
1.1 Lịch sử .3
1.2 Mô tả hoạt động .3
1.2.1 Tạo khóa .3
1.2.2 Mã hóa .4
1.2.3 Giải mã .4
1.3 Ví dụ .4
1.4 Đặc trưng của hệ mật RSA .5
1.5 Độ an toàn của hệ mật RSA .6
1.6 Quản lý khóa công của hệ mật RSA .6
1.6.1 Phân phối khóa công khai .6
1.6.2 Trung tâm quản lý khóa công khai .7
1.6.3 Phương pháp sử dụng chứng chỉ khóa công khai .7
1.6.4 Sử dụng mã hóa công khai để phân phối khóa mật .8
CHƯƠNG 2 LẬP TRÌNH MÃ HÓA VÀ GIẢI MÃ DỮ LIỆU BẰNG RSA KẾT HỢP MỘT HỆ MẬT ĐỐI XỨNG BẰNG NET FRAMEWORK 9
2.1 Yêu cầu bài toán .9
2.2 Ý tưởng .9
2.3 Mô tả hoạt động 10
2.3.1 Chương trình sinh cặp khóa công khai 10
2.3.2 Chương trình mã hóa 10
2.3.3 Chương trình giải mã 11
2.4 Hướng dẫn sử dụng chương trình 12
2.4.1 Sinh cặp Public Key và Private Key sử dụng RSA 12
2.4.2 Mã hóa 13
2.4.3 Giải mã 14
KẾT LUẬN 15
TÀI LIỆU THAM KHẢO 16
Trang 2MỞ ĐẦU
Ngày nay, với sự phát triển mạnh mẽ của công nghệ thông tin, mạng máy tính đã trở thành phương tiện hữu dụng phục vụ công tác điều hành, trao đổi thông tin trong mọi lĩnh vực của xã hội Song song với việc ứng dụng công nghệ thông tin trong cuộc sống, đặc biệt là việc sử dụng mạng internet như một môi trường giao tiếp thì vấn đề an toàn thông tin/dữ liệu trong quá trình gửi và nhận thông qua mạng
có một vai trò hết sức quan trọng
Trên thế giới đã có rất nhiều hội nghị thường niên của Hiệp hội quốc tế về
mã mật liên tục được tổ chức; các hội nghị Euro Crypt tại Châu Âu và Crypto tại
Mỹ luôn thu hút sự quan tâm trên toàn thế giới của các chuyên gia an ninh thông tin Các công nghệ mã hoá (mã mật) hiện đại đều không bảo mật công nghệ mã hoá (thuật toán mã hoá công khai), mà chỉ dựa vào bí mật chìa khoá giải mã (giải mã mật) Một hệ như vậy đáp ứng đầy đủ các yêu cầu bảo mật thông tin, phù hợp với
xu hướng trao đổi thông tin qua mạng máy tính
Năm 1976, ý tưởng về hệ mật khoá công khai đã được Diffie và Hellman đưa ra, sau đó Rivest, Shamir và Adleman đưa ra hệ mật nổi tiếng RSA vào 1977 Tiếp đó đã ra đời một số hệ mật dựa trên các thuật toán khác nhau như: hệ mật xếp
ba lô Markle-Hellman, hệ mật McElice, hệ mật Elgamal, hệ mật Chor-Rivest; hệ mật đường cong Elliptic,…
Trong các hệ mật khoá công khai trên, có hệ mật RSA là hệ mật mã được xây dựng đầu tiên (ra đời năm 1977 tại MIT) RSA được liệt vào một trong các giải thuật mã hóa bất đối xứng được dùng thông dụng nhất cho đến ngày hôm nay, RSA được đặt tên từ ba nhà khoa học phát minh ra nó: Ron Rivest, Adi Shamir, và Leonard Adleman Hệ mật RSA được ứng dụng rộng rãi trong mã hóa và lập trình mật mã
Trong thực tế, một kịch bản phổ biến trong trường hợp cần mã hóa thông tin khối lượng lớn là mã hóa thông tin này bằng một giải thuật đối xứng, và sử dụng giải thuật bất đối xứng(như RSA) để mã hóa khóa của giải thuật đối xứng đó (khi
mã hóa đối xứng, khóa mã cần được gửi đi kèm với thông tin đã mã hóa để bên nhận
có thể giải mã Việc mã hóa khóa này giúp đảm bảo an toàn Khi đó bên nhận sẽ sử dụng private key của mình để giải mã khóa mã, rồi dùng khóa mã này giải mã thông tin cần nhận)
Vì vậy, nhóm nghiên cứu chọn đề tài “Trình bày hệ mật RSA Viết chương trình mã hóa, giải mã dữ liệu (file) bằng RSA kết hợp một hệ mật đối xứng sử dụng NET Framework.” Nhằm hiểu rõ hơn về hệ RSA cũng như cách mà các thông điệp
được mã hóa để gửi đi trong thực tế
Trang 3CHƯƠNG 1 TỔNG QUAN VỀ CÁC HỆ MẬT MÃ
1.1 Lịch sử
Do 3 tác giả Ron Rivest (R), Adi Shamir(S) và Len Adleman(A) của Học
viện Công nghệ Massachusetts (MIT) đưa ra năm 1977
Được MIT đăng ký bằng sáng chế tại Hoa Kỳ vào năm 1983 (Số đăng ký
4,405,829)
1.2 Mô tả hoạt động
Thuật toán RSA có hai khóa:
- khóa công khai (Public Key): Khóa công khai được công bố rộng rãi cho mọi người và được dùng để mã hóa
- khóa bí mật ( Private Key): Khóa bí mật được cá nhân giữ kín và dùng
để giải mã
Ví dụ: Bob muốn gửi cho Alice một thông tin mật “m” mà Bob muốn duy nhất Alice có thể đọc được Bob sẽ mã hóa “m” bằng Public Key của Alice thu được bản mã “c” và gửi cho Alice Còn Alice sẽ giải mã “c” bằng Private Key của mình
để được bản ro “m”
1.2.1 Tạo khóa
Giả sử Alice và Bob cần trao đổi thông tin bí mật thông qua một kênh không
an toàn (ví dụ như Internet) Với thuật toán RSA, Alice đầu tiên cần tạo ra cho mình cặp khóa gồm khóa công khai và khóa bí mật theo các bước sau:
Các bước tạo khóa:
1 Chọn 2 số nguyên tố lớn p và q , với p≠ q, lựa chọn ngẫu nhiên và độc lập
2 Tính: n = p.q
3 Tính: giá trị hàm số Ơle ф(n) = (p-1)(q-1)
4 Chọn một số tự nhiên e sao cho 1 < e < ф(n), và là số nguyên tố cùng nhau với ф(n)
5 Tính: d sao cho d.e ≡ 1 (mod ф(n).)
Bộ ba (n; e; d) là chìa khóa của hệ mã
Khóa công khai: (e, n)
Trang 41.2.2 Mã hóa
Giả sử Bob muốn gửi đoạn thông tin “M” cho Alice Đầu tiên Bob chuyển
“M” thành một số m < n theo một hàm có thể đảo ngược(từ m có thể xác định lại M) được thỏa thuận trước
Lúc này Bob có m và biết n cũng như e do Alice gửi Bob sẽ tính c là bản mã hóa của m theo công thức: c = me mod n
Hàm trên có thể tính dễ dàng sử dụng phương pháp tính hàm mũ (môđun) bằng phương pháp bình phương (exponentiation by squaring)
Cuối cùng Bob gửi c cho Alice
1.2.3 Giải mã
Alice nhận c từ Bob và biết khóa bí mật d Alice có thể tìm được m từ c theo công thức sau: m = cd mod n
Biết m, Alice tìm lại M theo phương pháp đã thỏa thuận trước Quá trình giải
mã hoạt động vì ta có: cd ≡ (me)d ≡ me.d (mod n)
Do e.d ≡ 1 (mod p-1) và e.d ≡ 1 (mod q-1), (theo Định lý Fermat nhỏ) nên:
me.d ≡ m (mod p) và me.d ≡ m (mod q)
Do p và q là hai số nguyên tố cùng nhau, áp dụng định lý số dư Trung Hoa,
ta có: me.d ≡ m (mod p.q) hay: cd ≡ m (mod n)
1.3 Ví dụ
Lấy: p = 61 - số nguyên tố thứ nhất (giữ bí mật hoặc hủy sau khi tạo khóa)
q = 53 - số nguyên tố thứ hai (giữ bí mật hoặc hủy sau khi tạo khóa)
n = p.q = 61.53 = 3233 - môđun (công bố công khai)
e = 17 - số mũ công khai
d = 2753 - số mũ bí mật
Khóa công khai là (e, n)
Khóa bí mật là (d,n)
Hàm mã hóa là: encrypt(m) = m e mod n = m 17 mod 3233 ( với m là bản rõ) Hàm giải mã là: decrypt(c) = c d mod n = c 2753 mod 3233 (với c là bản mã)
Để mã hóa văn bản có giá trị 123, ta thực hiện phép tính:
encrypt(123) = 123 17 mod 3233 = 855
Trang 5Để giải mã văn bản có giá trị 855, ta thực hiện phép tính:
decrypt(855) = 855 2753 mod 3233 = 123
Cả hai phép tính trên đều có thể được thực hiện hiệu quả nhờ giải thuật bình phương và nhân
1.4 Đặc trưng của hệ mật RSA
Hệ mật RSA có các đặc trưng sau:
- Không cần phải thiết lập một kênh bảo vệ phức tạp để truyền khóa như trong hệ mật khóa bí mật
- Cặp khóa công khai được tạo ra theo một phương pháp đặc biệt có quan hệ với nhau và được chọn trong nhiều khóa có thể ( trong đó nếu khóa này dùng để mã hóa thì khóa kia dùng để giải mã)
- Ứng với một cặp p, q có thể chọn được nhiều bộ khóa công khai (n;e;d)
- Mọi người trong hệ thống nếu nhận được bản mật C thì cũng không thể biết được bản rõ P Với việc chỉ biết khóa mã hóa ke và căn cứ vào các thông tin về thuật toán thì không thể tìm ra khóa giải mã kd trong thời gian chấp nhận được (kể cả dùng hệ thống hiện đại nhất để tính toán)
Khóa công khai Khóa bí mật
C = Pebmod n p= Cdbmod n
Hình 2.1 Quá trình mã hóa công khai RSA
Quá trình gửi và nhận thông điệp (bản tin) được thực hiện như sau:
- Mỗi thành viên sinh một cặp khóa (n; e) và (n; d)
- Công khai khóa (n; e); giữ bí mật khóa (n; d)
- A gửi thông điệp cho B thì A mã hóa thông điệp bằng khóa công khai (n; eb) của B
Nguồn cặp khóa của B
Bên gửi
A
Bên nhận
Trang 6- B giải mã thông điệp bằng khóa riêng (n; db) Không một người nào khác có thể giải mã thông điệp ngoài B, vì chỉ có B mới biết khóa riêng của mình
1.5 Độ an toàn của hệ mật RSA
Độ an toàn của hệ mật RSA thể hiện qua hai yếu tố:
- Tính mật của hệ RSA, chủ yếu dựa vào việc bảo vệ khóa riêng d và giữ bí mật các số nguyên tố p và q
- Tính an toàn của hệ RSA dựa vào độ khó của bài toán RSA và độ phức tạp của bài toán phân tích một số thành các thừa số nguyên tố
Với người thám mã có thể tấn công vào hệ mã RSA theo các hình thức:
- Vét cạn: không gian khóa của RSA là rất lớn vì vậy tấn công theo hướng này là không thể thực hiện được
- Dựa trên cơ sở toán học để tìm cách phân tích modulo n thành các thừa số nguyên tố
1.6 Quản lý khóa công của hệ mật RSA
1.6.1 Phân phối khóa công khai
Phương pháp khai báo công khai: Bất kỳ thành viên nào cũng có thể thông báo khóa công khai của mình để cho các thành viên khác được biết Giải pháp này
có nhược điểm là bất kỳ ai cũng có thể giả mạo một khóa công khai
Phương pháp sử dụng thư mục công khai: Việc duy trì và tổ chức một thư mục công khai thuộc về một tổ chức được tin cậy nào đó Một lược đồ như vậy bao gồm các yếu tố sau:
- Tổ chức có nhiệm vụ duy trì thư mục, mỗi thành viên có một entry(định danh, khóa) trong thư mục
- Mỗi thành viên đăng ký một khóa công khai với tổ chức quản lý thư mục
- Mỗi thành viên có thể thay thế một khóa công khai bất cứ lúc nào khi cảm thấy khóa riêng bị lộ
- Cơ quan quản lý công bố toàn bộ thư mụ và có nhiệm vụ cập nhật thư mục một cách định kỳ
- Mọi thành viên đều có thể truy nhập vào thư mục bất cứ lúc nào, vì thế việc truyền thông xác thực an toàn (từ cơ quan quản lý đến các thành viên) phải mang tính chất bắt buộc
Trang 71.6.2 Trung tâm quản lý khóa công khai
Một cơ quan trung tâm duy trì một thư mục khóa công khai Mỗi thành viên đều biết khóa công khai của trung tâm quản lý khóa công khai, nhưng chỉ trung tâm
này biết khóa riêng cùng cặp
Quá trình trao đổi thông tin bí mật diễn ra như sau:
- A gửi một thông điệp có gán nhãn thời gian cho cơ quan quản lý khóa công khai, yêu cầu khóa công khai hiện thời của B
- Cơ quan quản lý trả lời bằng một thông điệp Thông điệp này được
mã hóa bằng khóa riêng dauth của cơ quan quản lý bao gồm:
Khóa công khai eb của B (A có thể dùng nó để mã hóa các thông điệp gửi cho B)
Yêu cầu gốc (request)- A so khớp yêu cầu này với yêu cầu A
đã gửi đi trước đó, nhờ đó A có thể biết yêu cầu gốc có bị sửa đổi trước khi cơ quan quản lý nhận được hay không
Nhãn thời gian gốc- cho phép A xác định được rằng đây không phải là một thông điệp cũ mà là thông điệp có chứa khóa công khai hiện thời của B
- A lưu giữ khóa công khai của B và sử dụng nó để mã hóa một thông điệp gửi cho B, thông điệp này chứa tên của A(IDA) và một giá trị (gọi là nonce) để nhận dạng giao dịch này
- B lấy khóa công khai của A từ cơ quan quản lý khóa (tương tự như A
đã lấy khóa công khai của B)
- Như thế là A và B đã chuyển giao khóa công khai cho nhau một cách
an toàn, và họ có thể gửi và nhận tin của nhau
1.6.3 Phương pháp sử dụng chứng chỉ khóa công khai
Các thành viên sử dụng chứng chỉ để trao đổi khóa mà không cần liên lạc với
cơ quan quản lý khóa công khai Mỗi chứng chỉ chứa một khóa công khai và các thông tin khác Nó được một cơ quan quản lý chứng chỉ tạo ra và phát hành cho các thành viên Mỗi thành viên thông báo khóa công khai của mình cho các thành viên khác thông qua chứng chỉ
Đặc trưng quan trọng của chứng chỉ là: “Các chứng chỉ có thể được phát hành
mà không cần bảo vệ thông tin qua các dịch vụ an toàn truyền thông để đảm bảo tính bí mật, xác thực và toàn vẹn” Bởi vì các chứng chỉ có khả năng tự bảo vệ bằng chữ ký số của CA
Trang 8Lợi ích của chứng chỉ khóa công khai là một người sử dụng có thể có được một số lượng lớn các khóa công khai của các thành viên khác một cách tin cậy chỉ cần thông qua khóa công khai CA
1.6.4 Sử dụng mã hóa công khai để phân phối khóa mật
Lược đồ Merkle: thủ tục A trao đổi thông tin mật với B:
- A tạo ra một cặp khóa (ea, da) và truyền cho B khóa công khai ea và tên của A (IDA)
- B tạo ra một khóa bí mật Ks và gửi cho A: E ea (Ks)
- A tính toán để biết khóa bí mật Ks : Dda (Eea (K)) = Ks
- A hủy bỏ ea, da và B hủy bỏ ea
Bây giờ A và B có thể trao đổi với nhau bằng khóa phiên Ks Sau khi trao đổi xong cả A và B cùng hủy bỏ Ks, như vậy theo cách này thì việc đảm bảo tính bí mật
là rất tốt vì trước và sau khi liên lạc không khóa nào tồn tại
Trang 9CHƯƠNG 2 LẬP TRÌNH MÃ HÓA VÀ GIẢI MÃ DỮ LIỆU BẰNG RSA KẾT HỢP MỘT HỆ MẬT ĐỐI XỨNG BẰNG NET FRAMEWORK
2.1 Yêu cầu bài toán
Viết chương trình mã hóa, giải mã dữ liệu (file) bằng RSA kết hợp một hệ mật đối xứng sử dụng NET Framework
Yêu cầu:
- Sinh viên được chọn hệ mật đối xứng
- Chương trình có chức năng sinh cặp khóa RSA với kích thước khóa
do người dùng chọn, xuất khóa công khai ra file XML, xuất cặp khóa
ra file XML;
- Khóa mã hóa (đối xứng) được sinh ngẫu nhiên, được mã hóa bằng khóa công khai lưu trong file XML do người dùng chỉ định
- Tất cả thông tin cần thiết để giải mã (ngoại trừ khóa bí mật) được lưu trong cùng một file với bản mã
2.2 Ý tưởng
Bài toán là mô tả cách mà người dùng mã hóa dữ liệu và gửi đi trong thực tế Trong thực tế, người ta sẽ sử dụng RSA kết hợp một hệ mật đối xứng để mã hóa và giải mã dữ liệu với khối lượng lớn Người dùng sẽ dùng khóa mã hóa(đối xứng) để
mã hóa dữ liệu cần gửi đi Sau đó, dùng hệ mật RSA để mã khóa khóa đối xứng đó bằng khóa công khai(Plublic Key) của người nhận và đính kèm vào bản và gửi đi Người nhận sử dụng khóa riêng(Private Key)của mình để giải mã ra khóa đối xứng Tiếp đó dùng khóa đối xứng này để giải bản mã
Đầu tiên, sinh cặp khóa RSA với kích thước khóa do người dùng chọn Dùng
lệnh gcnew để sinh ra một cặp khóa Để có thể cho người dùng chọn độ dài khóa ta
sử dụng Constructor:
RSACryptoServiceProvider(
int dwKeySize)
Sau khi sinh cặp khóa công khai thành công, xuất cặp khóa ra file xml Chức năng thứ hai, mã hóa dữ liệu bằng một thuật toán đối xứng(ở đây nhóm chọn DES) để mã hóa dữ liệu và mã hóa khóa đối xứng bằng khóa công khai(Public Key) vừa sinh ra ở trên Thuật toán đối xứng sinh khóa sử dụng lớp
DESCryptoServiceProvider bằng các phương thức:
void GenerateIV() void GenerateKey()
Tiếp theo, sau khi sinh khóa đối xứng xong, ta mã hóa key, iv của DES bằng khóa
công khai(Public Key) dùng RSACryptoServiceProvider() và mã hóa dữ liệu bằng
thuật toán DES sử dụng key, iv vừa sinh ra
Chức năng thứ ba, thực hiện giải mã sử dụng khóa riêng(Private Key) của người nhận
Trang 102.3 Mô tả hoạt động
2.3.1 Chương trình sinh cặp khóa công khai
a Sinh khóa
String^ pubkey=txtPublicKey->Text;
String^ prikey=txtPrivateKey->Text;
keysize= trbKeySize->Value * 8;
rsa = gcnew RSACryptoServiceProvider(keysize);
b Xuất publicKey ra file XML
String^ publicKey = rsa->ToXmlString( false );
TextWriter^ streamWriter = gcnew StreamWriter( pubkey ); streamWriter->Write(publicKey);
streamWriter->Close();
c Xuất PrivateKey ra file XML
String^ privateKey = rsa->ToXmlString( true );
streamWriter = gcnew StreamWriter(prikey);
streamWriter->Write(privateKey);
streamWriter->Close();
2.3.2 Chương trình mã hóa
a Tạo khóa đối xứng
algSym->GenerateKey();
tạo IV
algSym->GenerateIV();
b Tạo Stream đọc file nguồn, nghi file mã hóa
FileStream^ fsOriginal= gcnew
FileStream(stOriginalFile,FileMode::Open, FileAccess::Read); fsEncrypted= gcnew FileStream(stEncrypted,FileMode::Create);
c Mã hóa key, iv của DES
rsa = gcnew RSACryptoServiceProvider();
TextReader^ streamReader = gcnew StreamReader(pubkeyfile); String^ publicKey = streamReader->ReadToEnd();
streamReader->Close();
rsa->FromXmlString(publicKey);
EncryptedSymmetricKey = rsa->Encrypt( algSym->Key, false );
fsEncrypted->Write(EncryptedSymmetricKey,0,EncryptedSymmetricKey->Length);
EncryptedSymmetricIV = rsa->Encrypt( algSym->IV, false );
fsEncrypted->Write(EncryptedSymmetricIV,0,EncryptedSymmetricIV->Length);