4.1.2.1. Chức năng ký số ( sử dụng thuật toán ký số RSA )
1/. Mô tả cách dùng
- Mô tả chức năng:
Chƣơng trình sẽ sinh ra khóa ký RSA ngẫu nhiên có độ dài 512 bits hoặc 1024 bits (theo lựa chọn của ngƣời dùng ). Sau đó ghi khóa bí mật và khóa công khai ra các file tƣơng ứng. Trƣớc khi ký, văn bản sẽ đƣợc băm theo thuật toán SHA1.
Hình 2: Giao diện chức năng “Ký”RSA
- Ngƣời dùng nhập vào các thông tin sau
+ Key size ( có 2 lựa chọn 512 bits và 1024 bits ).
+ Input file: Đƣờng dẫn tuyệt đối của văn bản cần ký ( File text Unicode ) + Public key file: đƣờng dẫn tuyệt đối của file sẽ lƣu khóa công khai tạo ra + Private key file: đƣờng dẫn tuyệt đối của file sẽ lƣu khóa bí mật
+ Digest: đƣờng dẫn tuyệt đối của file sẽ lƣu đại diện của văn bản ( giá trị băm của văn bản trƣớc khi ký ).
48
Trong chƣơng trình này, khóa công khai, khóa bí mật, đại diện, chữ ký đƣợc biểu diễn dƣới dạng 1 xâu chứa mã ASCII của các ký tự.
2/. Mô tả cách cài đặt chức năng ký số
Chức năng này có các hàm chính sau:
- Hàm sinh khóa bí mật và công khai phục vụ việc ký
private: RSA* generateKey (String^ klen) đƣợc cài đặt nhƣ sau:
+ Khởi tạo biến RSA* r bằng hàm RSA_generate_key của thƣ viện OpenSSL. Ở đây chúng ta lƣu ý rằng trong thƣ viện OpenSSL, khóa bí mật và khóa công khai đƣợc biểu diễn theo chuẩn PKCS#1.
+ Ghi khóa bí mật vào file khóa bí mật
+ Ghi khóa công khai vào file khóa công khai + Hàm trả lại giá trị r
- Hàm thực hiện việc ký
private: void hSign(RSA* r ) đƣợc cài đặt nhƣ sau:
+ Đọc nội dung file cần ký vào mảng buffer có kiểu wchar_t*
+ Biểu diễn mỗi phần tử trong buffer dƣới dạng mã Unicode của nó. Kết quả thu đƣợc là String mesStr chứa mã Unicode tƣơng ứng của buffer.
+ Gọi đến hàm SHA1 trong thƣ viện OpenSSL để băm string mesStr theo thuật toán băm SHA1, kết quả thu đƣợc lƣu vào mảng unsigned char* hash.
+ Gọi đến hàm RSA_sign trong thƣ viện OpenSSL để ký lên mảng hash ở trên với khóa ký r. Kết quả trả về sau khi ký là là mảng unsigned char* signature. + Biểu diễn 2 mảng kiểu unsigned char* hash và signature dƣới dạng các String
chứa mã ASCII của các ký tự. Ghi các giá trị này tƣơng ứng ra file chứa đại diện và file chứa chữ ký.
+ Khi việc ký kết thúc thành công sẽ hiện lên thông báo “Signing completed successfully!!!”.
49 4.1.2.2. Chức năng xác thực chữ ký số
1/. Mô tả
Hình 3: Giao diện chức năng xác thực chữ ký số RSA
- Ngƣời dùng nhập vào các thông tin sau: + Input file: File văn bản
+ Signature: File chữ ký trên văn bản
+ Public key file: File chứa khóa công khai dùng để xác thực chữ ký.
- Kết quả trả về là “Signature is true” nếu chữ ký là đúng hoặc “Signature is false” nếu chữ ký là sai.
2/. Mô tả cài đặt
Có các hàm chính sau đây:
- Hàm xử lý sự kiện click vào nút Verify
private:System::Void Verify_Click(System::Object^sender,System::EventArgs^ e)
+ Đọc file thông điệp vào 1 mảng wchar_t* wbuffer.
+ Biểu diễn mỗi phần tử trong buffer dƣới dạng mã Unicode của nó. Kết quả thu đƣợc là String mesStr chứa mã Unicode tƣơng ứng của buffer.
50
+ Băm String mesStr theo thuật toán SHA1, giá trị băm đƣợc lƣu vào mảng unsigned char* hash.
+ Đọc nội dung file khóa công khai vào một mảng unsigned char* pubKey. Tạo biến RSA* rsa từ hàm d2i_RSAPublicKey ( trong thƣ viện nguồn mở OpenSSL ) trong đó pubKey là 1 tham số của hàm.
+ Gọi đến hàm RSA_verify trong thƣ viện OpenSSL để xác thực chữ ký là đúng hay sai.
4.1.2.3. Chức năng mã hóa theo hệ mã hóa DES
1/. Mô tả
- Chức năng: mã hóa file văn bản và file chữ ký theo hệ mã hóa DES
Hình 4: Giao diện chức năng mã hóa DES file văn bản và chữ ký
- Ngƣời dùng nhập vào các thông tin sau:
+ Input file: đƣờng dẫn tuyệt đối của file văn bản + Signature: đƣờng dẫn tuyệt đối của file chữ ký + Passphrase
+ Encrypted input file: đƣờng dẫn tuyệt đối file lƣu bản mã văn bản. + Encrypted signature: đƣờng dẫn tuyệt đối file lƣu bản mã chữ ký
51
2/. Mô tả cài đặt
- Hàm mã hóa file thông điệp và file chữ ký theo hệ mã hóa DES
private:System::Void encrypt_Click(System::Object^ sender, System::EventArgs^e) đƣợc cài đặt nhƣ sau:
+ Đọc nội dung file văn bản vào wchar_t* buffer.
+ Biểu diễn mỗi phần tử trong buffer dƣới dạng mã Unicode của nó. Kết quả thu đƣợc là String mesStr chứa mã Unicode tƣơng ứng của buffer.
+ Đọc file chữ ký vào một mảng unsigned char* sig.
+ Tạo khóa mã hóa và giải mã từ passphrase do ngƣời dùng nhập vào.
+ Lần lƣợt dùng hàm DES_cfb64_encrypt với tùy chọn DES_ENCRYPT của thƣ viện OpenSSL để mã hóa 2 mảng buffer và sig thu đƣợc 2 mảng unsigned char lần lƣợt là resMes và resSig.
+ Biểu diễn 2 mảng kiểu unsigned char resMes và resSig dƣới dạng các String chứa mã ASCII của các ký tự. Ghi các giá trị này tƣơng ứng ra file chứa bản mã của văn bản và file chứa bản mã của chữ ký.
4.1.2.4. Chức năng giải mã DES
1/. Mô tả
52
- Chức năng: giải mã bản mã thông điệp và bản mã chữ ký thành bản rõ tƣơng ứng.
- Ngƣời dùng nhập vào các thông tin sau:
+ Encrypted input file: đƣờng dẫn tuyệt đối của file chứa bản mã thông điệp + Encrypted signature: đƣờng dẫn tuyệt đối của file chứa bản mã chữ ký + Passphrase
+ Decrypted input file: đƣờng dẫn tuyệt đối của file sẽ chứa bản rõ thông điệp + Decrypted signature: đƣờng dẫn tuyệt đối của file chứa bản rõ của chữ ký. Sau khi kết thúc quá trình mã hóa, một thông báo “Decryption completed sucessfully!!!” đƣợc đƣa ra.
2/. Mô tả cài đặt
Các hàm chính
- Hàm giải mã bản mã thông điệp và bản mã chữ ký
private:System:: Void decrypt_Click(System::Object^sender, System::EventArgs^e) + Đọc dữ liệu từ file thông điệp đã mã hóa vào mảng unsigned char enFileArr + Đọc dữ liệu từ file chữ ký đã mã hóa vào mảng unsigned char enSigArr. + Tạo khóa DES từ passphrase do ngƣời dùng nhập vào.
+ Dùng hàm DES_cfb64_encrypt với tùy chọn DES_DECRYPT để giải mã file bản mã thông điệp. Tham số của hàm là mảng unsigned char enFileArr. Kết quả trả về của hàm là 1 mảng unsigned char chứa mã Unicode của các ký tự. Từ mảng này ta chuyển sang đƣợc mảng wchar_t chứa các ký tự của văn bản nguyên gốc. Ghi mảng này vào file ta đƣợc file chứa bản rõ thông điệp.
+ Dùng hàm DES_cfb64_encrypt với tùy chọn DES_DECRYPT để giải mã file bản mã chữ ký. Tham số của hàm là mảng unsigned char enSigArr. Kết quả trả về của hàm này là 1 mảng unsigned char chứa mã ASCII của các ký tự. Từ mảng này ta chuyển sang mảng char chứa các ký tự nguyên gốc. Ghi mảng này vào file ta đƣợc file chứa bản rõ chữ ký.
53