- 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:
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ý
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-
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
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)
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);
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);
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 !!!"); }