Thư viện mật mã cung cấp các thuật toán chomật mã khóa đối xứng, mật mã khóa công khai, hàm băm mật mã, tạo ra số ngẫu nhiên giả lập và xử lý chứng thư số.. Các chức năng đơn giản của ch
Trang 1MỤC LỤC
Trang 2DANH MỤC HÌNH VẼ
Trang 3Chính vì điều đó, chúng em đã lựa chọn đề tài “ Viết chương trình mãhóa file dữ liệu sử dụng OpenSSL” để tìm hiểu Đề tài được trình bàytrong 3 chương:
Chương 1 Tổng quan về OpenSSL Chương này chỉ ra lịch sử ra
đời cũng như những ứng dụng được sử dụng trong OpenSSL
Chương 2 Giới thiệu về các nhóm hàm chính trong OpenSSL.
Những chức năng cơ bản của các nhóm hàm
Chương 3 Các hàm được sử dụng trong chương trình Trình
bày chi tiết việc khởi tạo cũng như vai trò của các hàm được trình bày.Với hiểu biết và kinh nghiệm còn hạn chế nên chắc chắn vẫn khôngthể tránh khỏi những thiếu sót, chúng em mong nhận được sự đóng góp ýkiến của thầy, cô và các bạn để đề tài được hoàn thiện hơn
Tháng 2 năm 2014
Nhóm báo cáo
Trang 4CHƯƠNG 1 TỔNG QUAN VỀ OPENSSL
1.1 Giới thiệu về OpenSSL
Trong thế giới mạng ngày nay, nhiều ứng dụng cần bảo mật, mật mã làmột trong những công cụ chính để cung cấp bảo mật Các mục tiêu chínhcủa mật mã: bảo mật dữ liệu, toàn vẹn dữ liệu, xác thực và chống chối bỏ
có thể được sử dụng để ngăn chặn nhiều loại tấn công dựa trên mạng nhưnghe trộm, giả mạo IP, cướp kết nối và giả mạo
Và OpenSSL là một thư viện mã nguồn mở nổi tiếng nhất cho truyềnthông bảo mật có nguồn gốc từ SSLeay SSLeay ban đầu được viết bởiEric A Young và Tim J Hudson bắt đầu vào năm 1995 Vào tháng 12năm 1998, phiên bản đầu tiên của OpenSSL đã được phát hành là 0.9.1cnhư điểm khởi đầu OpenSSL cơ bản là bộ công cụ hai trong một: một làthư viện mật mã và một là bộ công cụ SSL
Thư viện SSL kế thừa tất cả các tính năng của tất cả các phiên bản củagiao thức SSL và TLSv1 Thư viện mật mã cung cấp các thuật toán chomật mã khóa đối xứng, mật mã khóa công khai, hàm băm mật mã, tạo ra
số ngẫu nhiên giả lập và xử lý chứng thư số Các dịch vụ được cung cấpbởi thư viện này được sử dụng bởi các công cụ của SSL, TLS và S/MINE
và chúng cũng được sử dụng để bổ sung cho SSH, OpenPGP và các chuẩnmật mã khác
1.2 Các phiên bản của OpenSSL
Các thư viện của OpenSSL được viết bằng ngôn ngữ lập trình C, nóhoạt động trên tất cả các nền tảng lớn, bao gồm tất các các hệ điều hànhUnix ( Linux, Solaris) và tất cả các phiên bản của Microsoft Windows( Windows XP, Vista, 7)
Trang 51.3 Các chức năng đơn giản của chương trình OpenSSL
Chương trình OpenSSL là một công cụ dòng lệnh để sử dụng các chứcnăng mật mã của các thư viện Crypto của OpenSSL
Trang 6• -in: tệp tin cần mã hóa
• -out: tệp tin sẽ tạo ra
• -e: mã hóa
• -d: giải mã
• -des, -des3, -aes256… là các thuật toán dùng để mã hóa
Ví dụ: openssl end –e –aes256 –in demo.txt –out demo.txt.ae.
1.3.3 Tạo mật khẩu đã được mã hóa
Lệnh này hữu ích khi cần sửa chửa trực tiếp các file chứa mật khẩucủa Linux chẳng hạn như /etc/passwd chẳng hạn Cú pháp lệnh là:
openssl passwd [Chuỗi cần mã hóa]
Các tùy chọn cơ bản:
• -crypt: chuẩn Linux
• -1: mã hóa dựa trên md5
Ví dụ: openssl passwd “password123”
Trang 71.3.5 Tạo khóa RSA , DSA hay EC
Để tạo khóa bí mật RSA ta có thể dùng lệnh:
openssl genrsa-out mykey.pem 1024
Trong đó mykey.pem là file lưu khóa, 1024 là số bit khóa Nếu muốn
mã hóa luôn file chứa khóa ta có thể dùng lệnh sau:
openssl genrsa-des3 ra mykey.pem 1024
Tạo khóa công khai RSA từ khóa bí mật:
openssl genrsa-in mykey.pem –pubout –out mykey.pub
Tạo các thông số cho khóa DSA:
openssl dsaparam ra dsaparam.pem 1024
Tạo khóa DSA thứ nhất:
openssl gendsa ra key1.pem dsaparam.pem
Tạo khóa DSA thứ hai:
openssl gendsa key2.pem dsaparam.pem
1.3.6 Kiểm tra số nguyên tố
Chúng ta có thể kiểm tra xem một số phải là số nguyên tố hay khôngbằng lệnh:
openssl prime –option [number]
Trang 8Trong đó:
• –option có thể là hex , dec
• [number] số cần kiểm tra
1.3.7 Kiểm tra hiệu suất phần cứng của hệ thống
Chúng ta có thể đo hiệu suất hoạt động của hệ thống phần cứng bằngcách dùng lệnh:
openssl speed
Cách đo ở đây là OpenSSL sẽ kiểm tra xem trong một thời điểm hệthống có thể chạy được bao nhiêu thuật toán chứ không phải kiểm tra xemmột thuật toán thì hệ thống chạy hết bao nhiêu thời gian
Ngoài ra, OpenSSL còn hỗ trợ các chức năng khác như thiết lập kếtnối với một máy chủ SMTP an toàn , thiết lập một máy chủ SSL từ dònglệnh, xác minh, mã hóa và ký một thông điệp S/MIME
Trang 9CHƯƠNG 2 GIỚI THIỆU CÁC NHÓM HÀM CHÍNH
TRONG OPENSSL2.1 Hàm băm - MD5, SHA1, HMAC – md5.h, sha.h, hmac.h
MD5_Init () , SHA1_Init() , HMAC_Init () : khởi tạo một cấutrúc MD5_CTX , SHA_CTX Trả về giá trị 1 nếu thành công , 0 nếu thất bại
MD5_Update () , SHA1_Update () , HMAC_Update () : bămchuỗi đầu vào
MD5_Final() , SHA1_Final() , HMAC_Final () : đặt bản tóm
lược trong md Trả về giá trị 1 nếu thành công , 0 nếu thất bại.
md là không gian do SHA_DIGEST_LENGTH == 20bytes đầu ra tạo ra
HMAC_cleanup () : xóa các khóa và dữ liệu từ HMAC_CTX.
2.2 Mật mã khóa công khai
RSA_public_encrypt () : mã hóa các bytes đầu vào sử dụng khóacông khai Nếu RSA_public_encrypt () trả về giá trị -1 thì mã hóa đã
bị lỗi
RSA_sign () : ký lên thông điệp m kích thước m_len bằng cách sử
dụng khóa bí mật RSA RSA_sign () trả về giá trị 1 là thành công , 0 làthất bại
Trang 10RSA_verify () : xác nhận chữ ký sigbuf kích thước siglen phù hợp với thông điệp m RSA_verify() trả về 1 là xác nhận đúng , 0 là sai.
RSA_size() : cho biết kích thước modulus RSA Nó có thể được sửdụng để xác định một giá trị mã hóa RSA cần bao nhiêu bộ nhớ
RSA_generate_key () : tạo ra một cặp khóa và lưu trữ nó trong cấutrúc RSA Nếu việc tạo cặp key bị lỗi, RSA_generate_key() sẽ trả về giátrị NULL Hàm RSA_generate_key_ex () cũng có chức năng tương tự
RSA_check_key () : kiểm tra cặp khóa do RSA_generate_key() tạo
ra có hợp lệ hay không Nó trả về giá trị 1 là hợp lệ, 0 là không hợp lệ, -1
là kiểm tra khóa bị lỗi
RSA_get_ex_new_index () : được dùng để đăng ký một số dữ liệucho ứng dụng cụ thể RSA_get_ex_new_index () trả về giá trị -1 là thấtbại
RSA_set_ex_data (): được sử dụng để thiết lập dữ liệu cho ứngdụng RSA_set_ex_data () trả về giá trị 1 là thành công, 0 là thất bại
RSA_get_ex_data () : được sử dụng để lấy dữ liệu Trả về giá trị 0
DSA_size () : kích thước chữ ký DSA
DSA_generate_parameters_ex() : tạo ra các số nguyên tố p và q để
sử dụng trong DSA và lưu giữ kết quả trong biến dsa Trả về giá trị 1 nếu
thành công , 0 nếu thất bại
Trang 11DSA_dup_DH () : tạo ra một cấu trúc DH Trả về giá trị NULL là thất
DSA_get_ex_new_index () , DSA_set_ex_data () , DSA_get_ex_data () : thêm dữ liệu cụ thể cho các cấu trúc DSA
2.3 Mật mã khóa đối xứng
2.3.1 DES – des.h
Có 2 giai đoạn với việc sử dụng mã hóa DES Đầu tiên sinh ra một
DES_key_chedule() từ một khóa, thứ 2 là mã hóa DES_cblock () làmột loại khóa của DES Loại này bao gồm 8 byte với số chẵn lẻ
DES_random_key () : Tạo một khóa ngẫu nhiên Nếu khóa ngẫunhiên không an toàn, giá trị trả về sẽ là 0
DES_set_key_checked() : kiểm tra khóa thông qua tính chẵn lẻ Nếutính chẵn lẻ sai, nó được trả về giá trị -1 Nếu khóa yếu thì trả về giá trị -2
DES_set_odd_parity () : thiết lập cân bằng khóa qua các bit 1
DES_ecb_encrypt() là mã hóa cơ bản của DES mã hóa hay giải mã8-byte DES_cblock Nó luôn thay đổi dữ liệu đầu vào
DES_ecb3_encrypt() mã hóa, giải mã khối đầu vào sử dụng 3 khóa
mã hóa triple-DES trong chế độ ECB
Hàm DES_ecb2_encrypt () được cung cấp để thực hiện 2 mã hóaTriple-DES bằng cách sử dụng KS1 để mã hóa cuối cùng
Trang 12DES_ncbc_encrypt () mã hóa/giải mã bằng cách sử dụng thuật toán
mã hóa khối xâu chuỗi (CBC) của DES
DES_xcbc_encrypt () là chế độ DESX RSA của DES Nó sử dụng
inw và outw để “làm trắng” mật mã Inw và outw là bí mật (không như iv)và được coi là một phần của khóa Vì vậy khóa là sắp xếp của 24 byte.
Điều này tốt hơn so với CBC DES
DES_ede3_cbc_encrypt () thực hiện 3 mã hóa DES CBC với 3khóa Điều này có nghĩa mỗi hoạt động DES trong chế độ CBC làC=E(ks3,D,KS2,E(KS1,M)) Chế độ này được sử dụng bởi SSL
DES_ede2_cbc_encrypt () thực hiện 2 khóa Triple –DES bằng cách
sử dụng lại KS1 cho mã hóa thức C=E(KS1,D (KS2,E(KS1,M)) Hìnhthức triple-DES được sử dụng bởi các thư viện RSAREF
DES_pcbc_encrypt () mã hóa/giải mã bằng cách sử dụng chế độ mãhóa khối chaining được sử dụng bởi Kerberos.v4 Các thông số của nócũng giống như DES_ncbc_encrypt ().
DES_cfb_encrypt () mã hóa / giải mã bằng cách sử dụng chế độphản hồi mật mã Cách thức này thực hiện với các mảng kí tự như mảng
kí tự đầu ra, đầu vào
DES_cfb64_encrypt () thực hiện chế độ CFB của DES với 64bit
so với IDEA hoặc RC2
BF_set_key (): thiết lập khóa BF_key
Trang 13BF_ecb_encrypt() : chức năng mã hóa và giải mã Nó mã hóa hoặc
giải mã 64 bít đầu tiên Enc sẽ quyết định nếu là mã hóa (BF_ENCRYPT)
hay giải mã (BF_DECRYPT)
BF_cbc_encrypt () là hàm chuỗi mã hóa khối cho Blowfish
BF_cfb64_encrypt() là chế độ OFB cho blowfish với thông tin phảnhồi 64bit Nó sử dụng các thông số tượng tự như BF_ecb_encrypt(), vàphải được tạo theo cùng một cách
BF_ofb64_encrypt() là chế độ CFB cho Blowfish với thông tin phảnhồi 64 bit
2.3.3 RC4 – rc4.h
Thư viện này thực hiện các thuật toán mã hóa RC4 Nó được cho làtương thích với RC4[TM], một thuật toán mã hóa độc quyền của RSASecurity Inc
RC4 là một mật mã dòng với chiều dài khác nhau Thông thường ,sửdụng khóa 128 bit(16 byte) để mã hóa mạnh, RC4 bao gồm một giai đoạnthiết lập khóa, mã hóa và giải mã
RC4_set_key (): thiết lập khóa RC4_KEY
RC4 () : mã hóa hoặc giải mã
Từ RC4 là một mật mã dòng(đầu vào được XOR với một dòng khóagiả ngẫu nhiên để tạo đầu ra) Giải mã sử dụng như các hàm gọi mã hóa
RC4_set_key () và RC4 () không trả về giá trị
2.4 Chứng thực x509 – x509.h , x509_vfy.h , x509v3.h
Chứng thực X.509 là một nhóm có cấu trúc thông tin về một cá nhân,một thiết bị, hoặc bất cứ điều gì Một X.509 CRL (Certificate RevocationList – danh sách thu hồi chứng thực) là một công cụ để giúp xác định xemmột chứng chỉ còn hiệu lực hay không?
Trang 14X509_NAME_ENTRY_get_object () : lấy tên trường ne với cấu trúc
ASN1_OBJECT
X509_NAME_ENTRY_get_data () : lấy giá trị trường ne với cấu trúc
ASN1_STRING
X509_NAME_ENTRY_set_object () : đặt trường ne kiểu obj.
X509_NAME_ENTRY_set_data () : đặt giá trị trường ne kiểu string
và giá trị xác định bằng bytes và len.
X509_NAME_add_entry_by_txt(),X509_NAME_add_entry_by_OBJ (), X509_NAME_add_entry_by_NID () : thêm một trường có tên được
xác định bởi một chuỗi field, một đối tượng obj hoặc một NID nid tương
ứng
X509_NAME_delete_entry () : xóa một mục từ name ở vị tríloc Các mục đã xóa được trả lại và phải được giải phóng
X509_NAME_add_entry_by_txt(),X509_NAME_add_entry_by_OBJ (), X509_NAME_add_entry_by_NID(), X509_NAME_add_entry(): trả
về giá trị 1 nếu thành công, 0 nếu thất bại
2.5 Vào/ra , mã hóa dữ liệu
2.5.1 EVP – evp.h
Thư viện EVP cung cấp một giao diện cấp cao với chức năng mã hóa
EVP_PKEY_encrypt_init () : khởi tạo một thuật toán khóa công
khai sử dụng khóa pkey để mã hóa.
EVP_PKEY_encrypt () : thực hiện mã hóa sử dụng ctx Các dữ liệu được giải mã được xác định bằng cách sử dụng đầu vào in và thông số inlen.
EVP_PKEY_encrypt_init () , EVP_PKEY_encrypt () : trả về giátrị 1 nếu thành công , 0 hoặc âm nếu thất bại
Trang 15EVP_PKEY_decrypt_init () : chức năng khởi tạo một thuật toán
khóa công khai sử dụng pkey để giải mã.
EVP_PKEY_decrypt () : thực hiện giải mã sử dụng ctx Các dữ liệu được giải mã được xác định bằng cách sử dụng đầu vào in và thông số inlen.
EVP_PKEY_decrypt_init () , EVP_PKEY_decrypt () : trả về giátrị 1 nếu thành công, 0 hoặc âm nếu thất bại
EVP_PKEY_sign_init () : khởi tạo một thuật toán khóa công khai sử
dụng khóa pkey cho việc tạo chữ ký số.
EVP_PKEY_sign () : thực hiện việc kí kết khóa công khai sử dụng
ctx
EVP_PKEY_sign_init () , EVP_PKEY_sign () trả về giá trị 1 nếuthành công, 0 hoặc âm nếu thất bại
EVP_PKEY_verify_init () : khởi tạo thuật toán mã hóa khóa công
khai sử dụng khóa pkey để xác minh một chữ ký số.
EVP_PKEY_verify () : thực hiện kiểm tra chữ ký số
2.5.2 PEM – pem.h
Các hàm PEM đọc hoặc ghi các cấu trúc trong định dạng PEM Địnhdạng PEM đơn giản là base64 mã hóa dữ liệu bao quanh bởi dòng header
PEM_write_bio_PKCS8PrivateKey() và PEM_write_PKCS8Privat eKey() viết một khóa riêng trong một cấu trúc EVP_PKEY trong PKCS #
8 định dạng EncryptedPrivateKeyInfo sử dụng thuật toán mã hóa dựa trênPKCS # 5 v2.0
PEM_write_bio_PKCS8PrivateKey_nid() và PEM_write_PKCS8Pr ivateKey_nid () cũng viết ra một khóa riêng như một
Trang 16EncryptedPrivateKeyInfo PKCS # 8 tuy nhiên nó sử dụng PKCS # 5 v1.5hoặc PKCS # 12 thuật toán mã hóa thay thế.
2.6 Chức năng phụ error codes – err.h
Khi một hàm được gọi từ thư viện OpenSSL thất bại, điều này thườngđược thể hiện bằng giá trị trả về, và một mã lỗi được lưu trữ trong mộthàng đợi lỗi liên quan đến các chủ đề hiện tại Thư viện err cung cấp cácchức năng để có được các mã lỗi và thông báo lỗi cho chúng ta
ERR_get_error () : trả về mã lỗi sớm nhất từ hàng đợi của chủ đề
ERR_peek_error () : trả về mã lỗi sớm nhất từ hàng đợi của chủ đề
mà không sửa đổi nó
ERR_peek_last_error () : trả về mã lỗi mới nhất từ hàng đợi củachủ đề mà không sửa đổi nó
ERR_GET_LIB (), ERR_GET_FUNC () và ERR_GET_REASON () chochúng ta vị trí và lí do của lỗi ERR_GET_LIB (), ERR_GET_FUNC () và ERR_GET_REASON () là macro
ERR_error_string () : chuyển từ mã lỗi thành các dòng lỗi theongôn ngữ chúng ta có thể hiểu được Dòng lỗi có dạng như sau :
error:[error code]:[library name]:[function name]:[reason string]
• error code là một số có 8 chữ số Đây chính là mã lỗi
• library name , function name , reason string : là văn bản ASCII
Trang 17CHƯƠNG 3 CÁC HÀM ĐƯỢC SỬ DỤNG TRONG
CHƯƠNG TRÌNH
Chương trình được viết bằng ngôn ngữ C++ với 4 tùy chọn, 2 tùy chọnhàm băm bằng MD5 hoặc SHA1, 2 tùy chọn mã hóa, 1 là mật mã đốixứng DES , 2 là mật mã khóa công khai RSA Ở trong DES có 2 lựa chọn
là mã hóa thông điệp hoặc giải mã bản mã Đối với RSA thì có thêm lựachọn tạo cặp key mới
Các file thư viện h được sử dụng bao gồm : des.h , md5.h , sha.h ,rsa.h , evp.h , object.h , x509.h , err.h Đầu vào là một chuỗi được lưutrong file định dạng txt có đường dẫn mặc định là F:\input.txt , đầu ra làbản mã được lưu trong file F:\output.txt Đối với RSA, public key vàprivate key được lưu trong file F:\rsa_public.key và F:\rsa_private.key.Sau đây là các hàm được sử dụng trong chương trình
3.1 MD5 – Message Digest Algorithm 5
Đây là bộ tạo mã Hash mật mã được sử dụng phổ biến với giá trị Hashdài 128bit Bảng băm MD5 thường được diễn tả bằng một chuỗi hệ thậplục phân 32 ký tự Đầu vào của MD5 là không giới hạn
• MD5_Init(MD5_CTX *c) : khởi tạo một cấu trúc MD5_CTX
• MD5_Update(MD5_CTX *c, const void *data, size_t len) :băm chuỗi đầu vào sử dụng thuật toán MD5
o MD5_CTX *c : cấu trúc MD5_CTX
o const void *data : chuỗi đầu vào
o size_t len : độ dài chuỗi đầu vào
• MD5_Final(unsigned char *md, MD5_CTX *c) : đặt bản tóm
lược trong md.
o unsigned char *md : bản tóm lược được gán vào biến md.
Trang 18o MD5_CTX *c : bản tóm lược của chuỗi đầu.
3.2 SHA1 – Secure Hash Algorithm 1
SHA là thuật toán băm 1 chiều dùng trong rất nhiều hệ thống quantrọng SHA có 5 thuật giải là SHA1 (160bit) , SHA 224 (224bit) , SHA
256 (256bit) , SHA 384 (384bit) , SHA 512 (512bit) SHA1 nhận chuỗiđầu vào có độ dài tối đa 264 bit và chuỗi đầu ra có độ dài 160 bit tức là 40
ký tự
• SHA1(const unsigned char *d, size_t n, unsigned char
*md) : băm chuỗi đầu vào sử dụng SHA1
o const unsigned char *d : chuỗi đầu vào
o size_t n : độ dài chuỗi đầu vào
o unsigned char *md : bản tóm lược sẽ được gán vào biến md.
Code:
SHA1(( unsigned char *)&msg, strlen(msg), ( unsigned char *)&digest); .
3.3 DES – Data Encrypt Standard
Là chuẩn mã hóa được FIPS chọn làm chuẩn chính thức năm 1976.Hiện nay DES được xem là không an toàn do độ dài khóa 56bit là quánhỏ
• DES_set_odd_parity(DES_cblock *key) : thiết lập cân bằngcủa khóa qua các bit 1
• DES_cblock *key : khóa loại DES_cblock