CÀI ĐẶT CHƢƠNG TRèNH Kí SỐ RSA

Một phần của tài liệu tìm hiểu nguyên nhân gây tổn thất dữ liệu và phương pháp bảo vệ thông tin trong chuyển giao hồ sơ y tế điện tử (Trang 64 - 81)

3.3.1. Cài đặt chức năng ký số

3.3.1.1. Hàm sinh khúa bớ mật và khúa cụng khai (Phụ lục 1)

3.3.1.2. Hàm thực hiện việc ký văn bản (Phụ lục 2)

3.3.2. Cài đặt chức năng xỏc thực chữ ký số (Phụ lục 3) 3.3.3. Cài đặt chức năng mó húa (Phụ lục 4) 3.3.3. Cài đặt chức năng mó húa (Phụ lục 4)

3.3.4. Cài đặt chức năng giải mó (Phụ lục 5) 3.4. CẤU HèNH HỆ THỐNG 3.4. CẤU HèNH HỆ THỐNG

3.4.1. Yờu cầu hệ thống - Về phần cứng: - Về phần cứng:

Computer with a 1.6GHz or faster processor

* 1024 MB RAM (1.5 GB if running in a virtual machine) * 3 GB of available hard-disk space

* 5400 RPM hard drive

* DirectX 9 capable video card running at 1024 x 768 or higher-resolution display

* DVD-ROM Drive

- Về phần mềm

+ Thư viện mó nguồn mở OpenSSL

+ Cài đặt Visual Studio 2008/2010, trờn hệ điều hành Windows XP/7/Vista. + Cài đặt Dotnet Frame 3.5

3.4.2. Yờu cầu chức năng

- Cho phộp thành viờn nạp tệp soạn thảo văn bản (vớ dụ: đơn thuốc, kết quả xột nghiệm…) và ký.

- Từ văn bản trờn cú thể sử dụng chức năng xỏc thực, mó húa rồi giải mó.

3.4.3. Yờu cầu về kiến trỳc hệ thống

- Cơ sở dữ liệu SQL thiết kế an toàn, hợp lý, khụng dư thừa dữ liệu. - Cú khả năng mở rộng khi cần thiết.

3.4.4. Yờu cầu giao diện

- Giao diện Tiếng việt. - Tổ chức hợp lý, dễ sử dụng

3.4.5. Phõn tớch cỏc tớnh năng

- Chương trỡnh cú 4 tớnh năng:

+ Mó húa: Người gửi sử dụng tớnh năng mó hoỏ và ký.

+ Ký: Người gửi đăng nhập hệ thống, bằng cỏch khai bỏo thụng tin hệ thống

là tờn và đường dẫn văn bản đăng nhập, sau đú hệ thống sẽ kiểm tra tớnh hợp lệ của tờn văn bản được chỉ đến để hoàn thiện cụng việc ký.

+ Xỏc thực: Người nhận xỏc thực chữ ký của file văn bản đó nhận xem cú đỳng chữ ký của người gửi cho mỡnh hay khụng?

+ Giải mó: Người nhận giải mó file văn bản của người gửi.

3.5. THIẾT KẾ HỆ THỐNG 3.5.1. Xỏc định cỏc tỏc nhõn

Hệ thống cú 2 tỏc nhõn chớnh, được cung cấp những chức năng sau: - Người gửi:

- Người nhận: (adsbygoogle = window.adsbygoogle || []).push({});

3.5.2. Biểu đồ trỡnh tự

1) Load và mó húa thụng điệp

2) Ký thụng điệp Ký Mó húa Xỏc thực Giải mó Người gửi Hệ thống 1. Load văn bản 2. Văn bản mó húa

3) Xỏc thực ký

4) Giải mó thụng điệp

2. Gửi kết quả văn bản mó húa cú chữ ký Người gửi Hệ thống 1. Ký lờn văn bản mó húa Hỡnh 3.4. Ký thụng điệp 2. Gửi kết quả xỏc thực (True/False) Người nhận Hệ thống 1. Xỏc thực chữ ký Hỡnh 3.5. Xỏc thực ký Người nhận Hệ thống 1. Giải mó văn bản 2. Văn bản giải mó Hỡnh 3.6. Mó húa thụng điệp

3.6. HƢỚNG DẪN SỬ DỤNG CHƢƠNG TRèNH

- Cài đặt chương trỡnh Visual Studio 2008/2010 trờn nền Win XP/7/Vista. - Kớch đỳp file chạy chương trỡnh chữ ký số RSA: RSA_Vi.exe

3.6.1. Chức năng ký số RSA - Ký

Hỡnh 3.7. Giao diện chức năng ký số

Chương trỡnh sẽ sinh ra khúa RSA ngẫu nhiờn cú độ dài 512 bit hoặc 1024 bit (theo lựa chọn cỡ khúa 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.

Người sử dụng lựa chọn cỏc thụng tin sau:

 Cỡ khúa (cú 2 lựa chọn 512 bit và 1024 bit)

 File văn bản: đường dẫn tuyệt đối của văn bản cần ký

 File khúa cụng khai: đường dẫn tuyệt đối của file sẽ lưu khúa cụng khai  File khúa bớ mật: đường dẫn tuyệt đối của file sẽ lưu khúa bớ mật

 File chứa bản băm: đường dẫn tuyệt đối của file sẽ lưu đại diện của văn bản  File chứa chữ ký: đường dẫn tuyệt đối của file chứa chữ ký

Trong chương trỡnh, khúa cụng khai, khúa bớ mật, đại diện văn bả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ự.

3.6.2. Chức năng xỏc thực chữ ký số RSA

Hỡnh 3.8. Giao diện Xỏc thực chữ ký số trờn văn bản

Người nhận nhập vào cỏc thụng tin sau để xỏc thực văn bản  File văn bản: đường dẫn tuyệt đối chứa file văn bản

 File chứa chữ ký: đường dẫn tuyệt đối chứa file chữ ký của người gửi  File chứa khúa cụng khai: đường dẫn chứa khúa cụng khai của người gửi Kết quả trả về là Chữ ký đỳng nếu file văn bản khụng bị chỉnh sửa hoặc Chữ ký sai nếu file văn bản bị chỉnh sửa

3.6.3. Chức năng mó húa

Người sử dụng lựa chọn cỏc thụng tin sau để mó húa văn bản  File văn bản: đường dẫn tuyệt đối chứa file văn bản cần mó húa  File chữ ký: đường dẫn tuyệt đối chứa file chữ ký của người gửi  Pass phrase: mật khẩu

 Bản mó file văn bản: đường dẫn tuyệt đối chứa file lưu bản mó  Bản mó chữ ký: đường dẫn tuyệt đối tới file lưu chữ ký.

Kớch chọn mó húa cho tới khi hiển thị “Mó húa thành cụng”.

3.6.4. Chức năng giải mó

Hỡnh 3.10. Giao diện Giải mó văn bản

Người nhận nhập vào cỏc thụng tin sau để giải mó văn bản

 Bản mó văn bản: đường dẫn tuyệt đối chứa file văn bản đó mó húa  Bản mó chữ ký: đường dẫn tuyệt đối chứa file chữ ký của người gửi  Pass phrase: mật khẩu

 Bản rừ văn bản: đường dẫn chứa bản rừ  Bản rừ chữ ký: đường dẫn chứa bản rừ chữ ký (adsbygoogle = window.adsbygoogle || []).push({});

Kớch chọn Giải mó cho tới khi hiển thị “Giải mó xong”.

Kết quả trả về là Giải mó đỳng nếu file văn bản mó húa khụng bị chỉnh sửa hoặc Giải mó sai nếu file văn bản bị chỉnh sửa “Khụng tồn tại”.

3.7. KẾT LUẬN CHƢƠNG

Nội dung chương 3 đó trỡnh bày cỏch xõy dựng, cài đặt và hướng dẫn sử dụng chương trỡnh ký số đối với tệp văn bản trong hệ thống bảo mật thụng tin. Chương trỡnh mụ phỏng việc sử dụng cặp khúa bớ mật, cụng khai để ký và mó húa cũng như giải mó và xỏc thực thụng tin. Việc ứng dụng cơ sở hạ tầng khúa cụng khai trong cỏc giao dịch thương mại, y tế điện tử, đăng nhập hệ thống, xỏc minh danh tớnh của chủ thể, kờ khai cỏc hồ sơ điện tử…. ngày càng phổ biến và phỏt triển nhanh chúng. Với sự cải tiến của cỏc thuật toỏn mó húa nhằm giải quyết vấn đề ATTT của chương trỡnh sẽ ngày càng đem lại sự tin tưởng cho người dựng sự an toàn, tin tưởng hơn nữa vào việc sử dụng chữ ký số và hạ tầng cơ sở khúa cụng khai trong cụng việc, giao dịch hàng ngàycủa mỡnh.

KẾT LUẬN

Vấn đề chữ ký số là một trong những vấn đề được đề cập nhiều trong lĩnh vực bảo mật thụng tin. Nú là một vấn đề khụng mới, đang được phỏt triển ở nước ta hiện nay và cú nhiều cụng việc cần giải quyết nếu muốn xõy dựng một hệ thống chữ ký số đạt tiờu chuẩn quốc gia. Hướng tiếp cận theo mật mó học khúa cụng khai là hướng tiếp cận dựa vào yờu cầu thực tế cụng nghệ là cụng khai và khúa mới là cỏi bớ mật, độ an toàn của hệ thống khụng dựa vào độ an toàn của cụng nghệ mà chớnh là khúa.

Kết quả đó đạt được của luận văn:

Luận văn tập trung nghiờn cứu một số phương phỏp bảo mật thụng tin. Đõy là nội dung bao quỏt nhiều vấn đề quan trọng trong bảo mật và đảm bảo an toàn thụng tin trong điều kiện người sử dụng tớch hợp nhiều thiết bị mới như mỏy tớnh bảng, điện thoại thụng minh,… vào cỏc mỏy tớnh cỏ nhõn kết nối mạng.

Luận văn đó giới thiệu và làm rừ được bài toỏn chữ ký số cú đảm bảo tớnh bớ mật, tớnh xỏc thực, tớnh toàn vẹn, tớnh khụng chối bỏ. Đồng thời luận văn cũng đó trỡnh bày một số giải phỏp, một số thuật toỏn và phương phỏp bảo vệ thụng tin trong chuyển giao hồ sơ Y tế điện tử.

Luận văn dành chương 1 để giới thiệu tổng quan về an toàn thụng tin bao gồm: cơ sở toỏn học, khỏi niệm, cỏc yờu cầu và cỏc giải phỏp đảm bảo an toàn thụng tin. Chương 2 tập trung vào bài toỏn cụ thể là tỡm hiểu một số nguyờn nhõn gõy tổn thất dữ liệu và phương phỏp bảo vệ thụng tin trong y tế điện tử. Phần phương phỏp luận được mụ tả chi tiết trong hai chương này là cỏc biện phỏp cơ sở cho cài đặt thử nghiệm ở chương 3 với bài toỏn dựng chữ ký số để bảo vệ thụng tin văn bản của hệ thống thụng tin. Toàn bộ nội dung của luận văn là những đúng gúp chớnh của tỏc giả dưới sự hướng dẫn trực tiếp của PGS.TS. Trịnh Nhật Tiến. Luận văn đó đạt được hai kết quả chớnh sau:

1. Nghiờn cứu tài liệu để Hệ thống lại cỏc vấn đề Tổng quan về an toàn thụng tin; Một số phương phỏp bảo vệ thụng tin phổ biến hiện nay.

2. Thử nghiệm dựng Chữ ký số để Kí và XÁC THỰC; MÃ HểA và GIẢI MÃ nội dung tệp văn bản.

Đảm bảo an toàn và bảo mật thụng tin trong mụi trường truyền thụng đa phương tiện hiện nay là vấn đề cốt lừi trong cuộc chiến tranh mạng núng bỏng mang tầm vúc quốc gia.

Trong quỏ trỡnh học tập, tỡm hiểu và nghiờn cứu cựng với khoảng thời gian làm luận văn, tụi đó cố gắng tập trung tỡm hiểu và tham khảo cỏc tài liệu liờn quan. Tuy nhiờn, do thời gian nghiờn cứu cũng như năng lực cú hạn nờn khú trỏnh khỏi nhưng sai sút cần bổ sung, kớnh mong sẽ nhận được sự đúng gúp ý kiến của cỏc thầy cụ giỏo và cỏc anh chị, cỏc bạn học viờn.

Em xin được gửi lời biết ơn chõn thành tới PGS.TS.Trịnh Nhật Tiến, người đó định hướng nghiờn cứu và hướng dẫn em thực hiện luận văn này !

Thỏi Nguyờn, thỏng 09 năm 2014

TÀI LIỆU THAM KHẢO Tiếng Việt

[1] Trịnh Nhật Tiến, “Giỏo trỡnh an toàn dữ liệu”, Trường Đại Học Cụng Nghệ, Đại Học Quốc Gia Hà Nội, 2008.

[2] Nguyễn Đỡnh Thỳc, Bựi Doón Khanh, Hoàng Đức Hải, “Giỏo trỡnh mó húa

thụng tin Lý thuyết và ứng dụng”, NXB Lao động xó hội, năm 2006.

[3] Phạm Huy Điển, Hà Huy Khoỏi, “Mó húa thụng tin cơ sở toỏn học và ứng

dụng”, Viện toỏn học, năm 2004.

Tiếng Anh

[4] R.L. Rivest, A. Shamir, and L. Adleman, A Method for Obtaining Digital

Signatures and Public-Key Cryptosystems, Communications of the ACM, 21 (2), pp.

120-126, Feb 1978.

[5] Y. Dakroury, I. A. El-ghafar and A. Tammam, Protecting GIS Data Using

Cryptography and Digital Watermarking, International Journal of Computer

Science and Network Security, VOL.10 No.1, 2010

[6] N. Goots, B. Izotoz, A. Moldovyan, N. Moldovyan, Modern Cryptography- (adsbygoogle = window.adsbygoogle || []).push({});

Protect Your Data with Fast Block Ciphers”, 2003.

Tài liệu trờn Internet

[7] http://spiroupharmablog.blogspot.com/2010/08/y-te-ien-tu-e-health-la-gi.html [8] http://luanvan.net.vn/luan-van/do-an-giau-va-phat-hien-anh-co-giau-thong-tin- tren-mien-du-lieu-anh-bang-ses-31640/

[9] http://www.cryptography.com [10] http://www.codeproject.com

PHỤ LỤC

Code cài đặt chƣơng trỡnh chữ ký số RSA - chức năng ký số

1). Code hàm sinh khúa bớ mật và khúa cụng khai

(ghi cỏc khúa này vào file dưới dạng thập phõn) private: RSA* generateKey (String^ klen){ r = RSA_new();

int len = Convert::ToInt32(klen);

r = RSA_generate_key(len, RSA_F4, NULL , NULL); priKey = gcnew String(BN_bn2dec(r->d));

unsigned char* next1; unsigned char* buffer1;

int len1 = i2d_RSAPrivateKey(r,0);

buffer1 = next1 = (unsigned char* )malloc(len1); i2d_RSAPrivateKey(r,&next1);

String^ pri = uncharArrtoStrASCII(buffer1,len1);

StreamWriter^ sw = gcnew StreamWriter(txtPriv->Text); sw->Write(pri); sw->Close();

unsigned char* next; unsigned char* buffer;

len = i2d_RSAPublicKey(r,0);

buffer = next = (unsigned char* )malloc(len); i2d_RSAPublicKey(r,&next);

String^ pubFile = txtPubKey->Text; sw = gcnew StreamWriter(pubFile);

String^ pub = uncharArrtoStrASCII(buffer,len); sw->Write(pub); sw->Close(); return r; }

2). Code hàm thực hiện việc ký văn bản

private: void hSign(RSA* r ){ r = generateKey(keySize); String^ iFile = inputFile->Text; String^ oFile = sigFile->Text; //Đọc nội dung vào 1 mảng wchar_t long int numOfElems;

String^ ext = iFile->Substring(iFile->Length - 3); wchar_t* buffer = NULL;

if( fileIsLocked(iFile) == false ){ if ( ext == "doc"){

buffer = readFileDoc(inputFile->Text, numOfElems); } else{

buffer = readFileText(inputFile->Text, numOfElems); } String^ mesStr = wchartoUni(buffer, numOfElems); unsigned char* buf = (unsigned char*) str2Char(mesStr) unsigned int slen;

unsigned char* signature = (unsigned char*) malloc(RSA_size(r)); unsigned char hash[20];

if (SHA1(buf, mesStr->Length,hash)){

int i = RSA_sign(NID_sha1,hash, 20,signature, &slen, r); //Ky signature[RSA_size(r)] = '\0';

//Ghi giỏ trị băm ra file thập phõn (adsbygoogle = window.adsbygoogle || []).push({});

String^ digestDec = uncharArrtoStrASCII(hash,20); StreamWriter^ sw = gcnew StreamWriter(txtDig->Text); sw->Write(digestDec);

sw->Close();

//Ghi chữ ký ra file dưới dạng thập phõn

String^ sigDec = uncharArrtoStrASCII(signature,slen); sw = gcnew StreamWriter(oFile); sw->Write(sigDec); sw->Close(); } MessageBox::Show( "Ký thành cụng !!!"); } }

3). Code Cài đặt chức năng xỏc thực chữ ký số

private: System::Void btnVerify_Click(System::Object^ sender, System::EventArgs^ e) {

String^ iFile = inFile->Text; String^ oFile = sFile ->Text;

String^ pubKey = publicKey->Text;

if (iFile == "" || oFile == "" || pubKey == "")

MessageBox::Show( L"Bạn phải nhập đầy đủ tất cả cỏc thụng tin !!!"); else if (!File::Exists(iFile))

MessageBox::Show("File" + iFile + L" khụng tồn tại"); else if (!File::Exists(oFile))

MessageBox::Show("File" + oFile + L" khụng tồn tại"); else if (!File::Exists(pubKey))

MessageBox::Show("File" + pubKey + L" khụng tồn tại"); else{

wchar_t* wbuffer = NULL;

//doc noi dung file thong diep vao 1 long int numOfElems;

//wbuffer = readFileText( inFile->Text, numOfElems); if( fileIsLocked(iFile) == false ){

String^ ext = iFile->Substring(iFile->Length - 3); if (ext == "doc"){

wbuffer = readFileDoc(iFile, numOfElems); }

else{

wbuffer = readFileText(iFile, numOfElems); }

String^ mesStr =wchartoUni(wbuffer,numOfElems); char* msg = str2Char(mesStr);

//doc noi dung file chu ky vao mot mang char char* sig = readFile(sFile->Text);

int sigLen = strlen(sig)/3;

unsigned char* signature = conDecToUnchar(sig); //thuc hien xu ly file chu ky

char* pub = readFile(publicKey->Text); int kLen = strlen(pub)/3;

unsigned char* buffer = conDecToUnchar(pub);

RSA* rsa = d2i_RSAPublicKey(0,(const unsigned char**)&buffer, kLen); //verify chu ky

unsigned char hash[20];

SHA1((unsigned char*)msg, strlen(msg),hash); int res;

res = RSA_verify(NID_sha1, hash,20,signature,sigLen,rsa); if (res == 1) (adsbygoogle = window.adsbygoogle || []).push({});

verRes->Text = L"Chữ ký đỳng"; else verRes->Text = L"Chữ ký sai"; }}}

4). Code Cài đặt chức năng mó húa

private: System::Void onEncryptClick(System::Object^ sender, System::EventArgs^ e) {

long int numOfElems;

if (!File::Exists(txtMesE->Text))

MessageBox::Show( "File " + txtMesE->Text + L" khụng tồn tại" ); else if (!File::Exists(txtSigE->Text))

MessageBox::Show( "File " + txtSigE->Text + L" khụng tồn tại" ); else{

String^ ext = txtMesE->Text->Substring(txtMesE->Text->Length - 3); wchar_t* buffer = NULL;

if( fileIsLocked(txtMesE->Text) == false ){ if ( ext == "doc"){

buffer = readFileDoc(txtMesE->Text, numOfElems); }

else{

buffer = readFileText(txtMesE->Text, numOfElems); }

String^ mesStr = wchartoUni(buffer,numOfElems); //MessageBox::Show(mesStr);

unsigned char* mes = (unsigned char*) str2Char(mesStr); //ma hoa file message

char* key = str2Char(txtKeyE->Text); int n = 0;

DES_cblock key2;

DES_key_schedule schedule; memcpy(key2,key,8);

DES_set_odd_parity(&key2);

DES_set_key_checked(&key2,&schedule); //ma hoa file message

int size = strlen((char*)mes);

unsigned char* resMes = (unsigned char*) malloc(size); DES_cfb64_encrypt(mes,resMes,size,&schedule,&key2,&n, DES_ENCRYPT);

//ghi thong diep da duoc ma hoa ra file duoi dang thap phan //String^ strMes = uncharArrToStr01(resMes,size);

String^ strMes = uncharArrtoStrASCII(resMes,size);

StreamWriter^ sw = gcnew StreamWriter( txtEMesE->Text); sw->Write(strMes);

sw->Close(); //doc file chu ky

long sizeSig;

unsigned char* sig = readFileUnchar(txtSigE->Text, sizeSig); //ma hoa chu ky va ghi chu ky ra file

unsigned char* resSig = (unsigned char*) malloc(sizeSig);

DES_cfb64_encrypt(sig,resSig,sizeSig,&schedule,&key2, &n, DES_ENCRYPT); //ghi chu ky da ma hoa ra file duoi dang thap phan

String^ sigMes = uncharArrtoStrASCII(resSig,sizeSig); sw = gcnew StreamWriter(txtESigE->Text); (adsbygoogle = window.adsbygoogle || []).push({});

sw->Write(sigMes); sw->Close();

MessageBox::Show("Mó húa thành cụng"); }

}

5). Code Cài đặt chức năng giải mó

private: System::Void onDecryptClick(System::Object^ sender, System::EventArgs^ e) {

if(!File::Exists(txtEMesD->Text)){

MessageBox::Show("File " + txtEMesD->Text + L" khụng tồn tại"); }

else if(!File::Exists(txtESigD->Text)){

MessageBox::Show("File " + txtESigD->Text + L" khụng tồn tại"); }

else{

//doc du lieu tu file thong diep da ma hoa vao mang unsigned char char* temp1 = readFile(txtEMesD->Text);

long size = strlen(temp1)/3;

unsigned char* enFileArr = conDecToUnchar(temp1); //giai ma

DES_cblock key2;

DES_key_schedule schedule; int n = 0;

unsigned char* res = (unsigned char*) malloc(size); char* key = str2Char(txtKeyD->Text);

memcpy(key2,key,8);

DES_set_odd_parity(&key2);

DES_set_key_checked(&key2, &schedule);

DES_cfb64_encrypt(enFileArr,res,size,&schedule, &key2,&n, DES_DECRYPT); res[size] = '\0';

String^ mesStr = gcnew String((char*)res); //doi day 01 thanh mang wchar_t

wchar_t* originalMes = conUniToWchar(mesStr,mesLen); int trueLen;

for (trueLen = mesLen - 1; trueLen > 0; trueLen-- ){ if ( originalMes[ trueLen ] != L'췍')

break;

} trueLen = trueLen + 1;

FILE* pFile = _wfsopen(str2Wchar(txtMesD->Text), L"wt,ccs=Unicode", _SH_DENYNO);

fwrite(originalMes,sizeof(wchar_t),trueLen,pFile); fclose(pFile);

char* temp2 = readFile(txtESigD->Text); long sizeSig = strlen(temp2)/3;

unsigned char* enSigArr = conDecToUnchar(temp2); unsigned char* resSig = (unsigned char*) malloc(sizeSig);

DES_cfb64_encrypt(enSigArr,resSig,sizeSig,&schedule,&key2,&n, DES_DECRYPT); (adsbygoogle = window.adsbygoogle || []).push({});

resSig[sizeSig] = '\0';

String^ sigStr = gcnew String((char*)resSig);

StreamWriter^ sw = gcnew StreamWriter( txtSigD->Text); sw->Write(sigStr->ToString()); sw->Close();

MessageBox::Show( L"Giải mó xong !!!"); }

Một phần của tài liệu tìm hiểu nguyên nhân gây tổn thất dữ liệu và phương pháp bảo vệ thông tin trong chuyển giao hồ sơ y tế điện tử (Trang 64 - 81)