Dec 18, 2009

Mã hóa thông tin với thư viện mở Botan.

Bài này viết với mục đích giới thiệu bạn sử dụng một thư viện mã nguồn mở viết bằng C++ để mã hóa thông tin đó là sử dụng thư viện Botan.

Chuẩn bị
Mã hóa thông tin là gì ?
Mã hóa thông tin đơn giản là việc bạn làm thay đổi dạng thức ban đầu của dư liệu khiên chẳng ai có thể biết nó là cái gì. Nếu không có giải mã

Mã công khai và mã cá nhân là gì ?
công khai và mã cá nhân là một cặp được sử dụng trong các giao dịch trên mạng. Giao dịch ở đây bạn có thể hiểu theo nghĩa là một giao thức ví dụ https hoặc việc thanh toán trong thương mại điện tử.

Đầu tiên bạn tham gia giao dịch bạn sẽ được cung cấp một mã công khai và một mã cá nhân, các mã này được các giải thuật mã hóa sinh ra cho bạn (RSA hoặc SHA... ) có nghĩa là công khai của bạn ai cũng biết, nhưng cá nhân của bạn thì chỉ mình bạn biết.

Khi giao dịch thông tin người khác gửi cho bạn họ sẽ dùng mã công khai của bạn để mã hóa lại, và hiển nhiên thông tin đo khi gửi đi có thể bị người khác đọc nhưng người đó sẽ không để biết được nội dung của thông tin nếu họ không có mã cá nhân để giải mã. Chỉ mình bạn có mã đó và bảo đảm rằng mình bạn có thể giải mã và đọc được nội dung bằng mã cá nhân của bạn

Ứng dụng của chúng ta là tìm hiểu cơ chế làm việc và mã hóa thông tin theo nội dung trên

Giới thiệu thêm.
RSA là một giải thuật nổi tiếng sử dụng để sinh ra mã công khai và mã cá nhân nó cũng có thể dùng để mã hóa bình thường.

SHA cũng là giải thuật sinh mã giống như RSA.

MD5: Giải thuật mã hóa một chiều mạnh và gần như không thể phá hoặc trong tình huống nếu có giải mã được thì cũng không mấy có ý nghĩa. Giải mã được không có nghĩa là từ chỗi mã hóa của MD5 bạn dùng một giải thuật ngược để suy ra chỗi ban đâu, việc giải mã MD5 chỉ sử dụng những máy chủ cực mạnh với một database không lồ chứa nội dung của rất nhiều các tổ hợp được mã hóa để tìm ra chuỗi ban đầu. :) nghe có vể cụ trâu nhưng việc giải mã này là hoàn toàn có thể và nó gần như chinh phục mọi giải thuật mã hóa.


Trang bị :
- Môi trường phát triển (VS 2008, CodeBlock,...) vì đã là C++ thì không kén chọn lắm ban thoải mái cho công cụ phát triển và tự do về mục đích. Trong bài viết này tôi sử dụng môi trường .NET VS 2008 để phát triển. các code sử dụng theo chuẩn Opent bạn có thể build trong những môi trường khác tương tự mà không phải lo về việc chỉnh lại code.

Nội dung thực hiện.






Check password

// file password
std::string filePath = _name + PERSON_PASSWORD_FILE;
UFile inFile(filePath);
inFile.CreateInFileStream();
if(!true)
{
return false;
}
else
{
// giai thuat hash (SHA-512)
std::string hash = PERSON_PASSWORD_HASH;
// tao bo su ly ma hoa
/*
pipe la mot thanh phan rat quan trong cua Botan su dung de ma hoa du lieu
tu cac nguon dau vao khac nhau. ban tuong tuong no nhu mot factory partten
*/
Botan::Pipe pipe(new Botan::Hash_Filter(hash),new Botan::Hex_Encoder);
pipe.start_msg();
// chuyen vao bo su ly ma hoa voi pass nhan dc cua user.
pipe.write(_pass);
pipe.end_msg();
// doc pass da dc ma hoa luu tren UserName\password.txt
std::string storedPass = inFile.ReadString();

// lay lai gia tri _pass sau khi ma hoa.
_pass = pipe.read_all_as_string(0);

if(_pass.compare(storedPass)!=0)
return false;
}


Tạo public key và private key.
// chon so bit ma hoa
std::string strBits = PERSON_BITS_FOR_RSA;
Botan::u32bit bits = std::atoi(strBits.c_str());
std::string strPubFile = _name + PERSON_FILEPATH_PUBLIC_KEY;
std::string strPriFile = _name + PERSON_FILEPATH_PRIVATE_KEY;

// fiel public key
std::ofstream pub(strPubFile.c_str());
// fiel private key
std::ofstream priv(strPriFile.c_str());

try
{
// sinh tu dong doi tuong.
Botan::AutoSeeded_RNG rng;
// sinh key kieu RSA
Botan::RSA_PrivateKey rsaKey(rng,bits);
// sinh ma public rsa
pub <<>
// sinh ma private rsa
priv <<>
pub.close();
priv.close();
}
catch(std::exception& e)
{
if(pub.is_open())
pub.close();
if(priv.is_open())
priv.close();
throw "Khong the tao key";
return false;
}

...>>

đã hoàn thành song chương trình. Bạn nào có nhu cầu tìm hiểu liên hệ mình gửi code cho.

.../...

2 comments:

  1. Bạn ơi, mình đang tìm hiểu về cách mã hóa để một chương trình (VC++) tự động lưu password vào file và tự động đăng nhập lần sau. Không biết mã hóa với thư viện Botan có dùng được không nhỉ?
    - Nếu không thì ta nên dùng thuật toán mã hóa nào cho hợp lý?
    - Nếu có: mong bạn gửi tài liệu và code cho mình để tìm hiểu thêm. mail: thuchoangvan1701@gmail.com
    Cám ơn bạn nhiều!

    ReplyDelete
  2. Chào anh. Em cũng đang tìm hiểu về vấn đề này. A có thể cho em xin tài liệu và code tham khảo không? Em làm trên C#. Về thuật toán Sha512 em tìm trên mạng mà không có. :(

    Yahoo : quyen_suki_forever221@yahoo.com
    Gmail : quyen.tranvan221@gmail.com

    Cảm ơn anh trước !

    ReplyDelete

 
Bạn có thể dùng bài viết của tôi tùy ý bạn nhưng vui lòng ghi lại rõ nguồn cung cấp
The world in a click_
Copyright © 2008 linhdkl