Tải bản đầy đủ (.docx) (28 trang)

tìm hiểu OpenSSL trong mã hóa dữ liệu

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (297.43 KB, 28 trang )

MỤC LỤC

1

1


DANH MỤC HÌNH VẼ

2

2


MỞ ĐẦU
Ngày nay, thông tin liên lạc đã trở nên rất phổ biến và vô cùng thuận
lợi. Song song với điều này, nhu cầu bảo mật thông tin ngày càng được đặt
ra cấp thiết hơn. Vì vậy, mật mã được nghiên cứu rộng rãi, được ứng dụng
nhiều hơn và được nói đến nhiều hơn bao giờ hết. Và OpenSSL là thư viện
mật mã, miễn phí, cung cấp các thuật toán, các hàm băm mật mã,… đã
được ứng dụng rộng rãi trong thực tế.
Chí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ày
trong 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ông


thể 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

3

3


CHƯƠ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ính
củ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ền
thông bảo mật có nguồn gốc từ SSLeay. SSLeay ban đầu được viết bởi
Eric A. Young và Tim J. Hudson bắt đầu vào năm 1995. Vào tháng 12
năm 1998, phiên bản đầu tiên của OpenSSL đã được phát hành là 0.9.1c
như đ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ủa
giao thức SSL và TLSv1. Thư viện mật mã cung cấp các thuật toán cho
mậ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ấp
bở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ẩn
mậ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ành
Unix ( Linux, Solaris) và tất cả các phiên bản của Microsoft Windows
( Windows XP, Vista, 7).

4

4


Các phiên bản phát hành chính :
Phiên bản

Ngày phát hành

0.9.1c

23/12/1998

0.9.2b

22/03/1999

0.9.3

25/05/1999

0.9.4


09/08/1999

0.9.5

28/02/2000

0.9.6

24/09/2000

0.9.7

31/12/2002

0.9.8

05/07/2005

1.0.0

29/03/2010

1.0.1

14/03/2012

1.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ức
năng mật mã của các thư viện Crypto của OpenSSL.
1.3.1. Sử dụng để băm dữ liệu

OpenSSL hỗ trợ rất nhiều thuật toán băm: MD5, SHA, MDC2,
RIPEMD160,… Để băm dữ liệu, sử dụng lệnh: “dgst”.
Cú pháp: openssl dgst [Kiểu băm] [Tên file]
5

5


Ví dụ: openssl dgst –md5 demo.txt
Các kiểu băm được hỗ trợ là: md2, md4, md5, sha, sha1, sha256,
sha512, mdc2.
1.3.2. Mã hóa dữ liệu
Dữ liệu có thể mã hóa bằng các thuật toán mã hóa đối xứng như: aes,
base64, des, blowfish… bằng cách sử dụng lệnh “enc”.
Cú pháp: openssl enc [Các tùy chọn]
Các tùy chọn cơ bản là:
• -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ẩu
củ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”
6

6


1.3.4. Ký và xác thực chữ ký
Để ký cho file demo.tar.gz ta sẽ dùng khóa riêng. Lệnh sau sẽ cho ra
file demo.tar.gz.sha1.
openssl dgst -sha1 -sign mykey.pem -out demo.tar.gz.sha1
demo.tar.gz

Khi xác thực bạn sử dụng lệnh sau:
openssl dgst -sha1 -verify pubkey.pem -signature \
demo.tar.gz.sha1 demo.tar.gz.


1.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ông
bằng lệnh:
openssl prime –option [number]
7

7



Trong đó:
• –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ằng
cá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 xem
mộ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ết
nối với một máy chủ SMTP an toàn , thiết lập một máy chủ SSL từ dòng
lệnh, xác minh, mã hóa và ký một thông điệp S/MIME.

8

8


CHƯƠNG 2. GIỚI THIỆU CÁC NHÓM HÀM CHÍNH
TRONG OPENSSL
2.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ấu

trú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ăm

chuỗ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
2.2.1. RSA – rsa.h
RSA_new () : khởi tạo và cấp phát một cấu trúc RSA. Hàm này cũng

tương đương với hàm RSA_new_method(NULL).
RSA_free () : giải phóng cấu trúc RSA và các thành phần của nó.

Hàm này được gọi sẽ xóa vùng nhớ dành cho cấu trúc RSA trước khi được
trả lại cho hệ thống.
RSA_public_encrypt () : mã hóa các bytes đầu vào sử dụng khóa

cô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.

9

9



RSA_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ấu

trú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ệu

cho ứng dụng cụ thể. RSA_get_ex_new_index () trả về giá trị -1 là thất
bại.
RSA_set_ex_data (): được sử dụng để thiết lập dữ liệu cho ứng

dụ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

là thất bại.
RSA_private_decrypt () : được sử dụng để giải mã bản mã. Trả về

giá trị -1 là thất bại.
2.2.2. DSA – dsa.h
DSA_new () : cấp phát và khởi tạo một cấu trúc DSA. Nó tương


đương với hàm DSA_new_method (NULL).
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.
10

10


DSA_dup_DH () : tạo ra một cấu trúc DH. Trả về giá trị NULL là thất

bại.
DSA_generate_key () : tạo ra cặp khóa DSA. Trả về giá trị 1 nếu

thành công, 0 nếu không thành công.
DSA_sign () , DSA_sign_setup () , DSA_verify () : các hàm

chữ ký của DSA. DSA_sign () và DSA_sign_setup () trả về giá trị 1
nếu thành công , 0 nếu thất bại. DSA_verify () trả về giá trị 1 cho chữ ký
hợp lệ, 0 cho chữ ký không hợp lệ và -1 là thất bại.
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ẫu

nhiê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ếu

tí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óa
Triple-DES bằng cách sử dụng KS1 để mã hóa cuối cùng.
11

11



DES_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 3

khó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ình
thứ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.

2.3.2. Blowfish – blowfish.h
Blowfish là một thuật toán mã hóa khối hoạt động trên 64bit(8byte)

khối dữ liệu. Nó sử dụng các độ dài khóa khác nhau, nhưng thông thường
sử dụng 128 bit(16byte) khóa thì sẽ tốt cho mã hóa mạnh mẽ. Blowfish có
thể được sử dụng trong chế độ tương tự như DES. Blowfish hiện là một
trong những thuật toán mã hóa khối nhanh hơn DES và nhanh hơn nhiều
so với IDEA hoặc RC2.
BF_set_key (): thiết lập khóa BF_key.
12

12


BF_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ản

hồ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ản

hồ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 RSA
Security 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ạn
thiế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óa
giả 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 Revocation
List – danh sách thu hồi chứng thực) là một công cụ để giúp xác định xem
một chứng chỉ còn hiệu lực hay không?
13

13


X509_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.
14

14


EVP_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ếu

thà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. Định
dạ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ên
PKCS # 5 v2.0
PEM_write_bio_PKCS8PrivateKey_nid() và PEM_write_PKCS8Pr

ivateKey_nid

() cũng

viết

15

ra

một

khóa

riêng

như

một

15


EncryptedPrivateKeyInfo PKCS # 8 tuy nhiên nó sử dụng PKCS # 5 v1.5
hoặ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ột
hàng đợi lỗi liên quan đến các chủ đề hiện tại. Thư viện err cung cấp các
chứ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ủa

chủ đề mà không sửa đổi nó.
ERR_GET_LIB (), ERR_GET_FUNC () và ERR_GET_REASON () cho

chú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 theo

ngô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.

16

16


CHƯƠ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ọn
hàm băm bằng MD5 hoặc SHA1, 2 tùy chọn mã hóa, 1 là mật mã đối
xứ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ựa
chọ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ưu
trong 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ị Hash
dài 128bit. Bảng băm MD5 thường được diễn tả bằng một chuỗi hệ thập
lụ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.
17

17


o MD5_CTX *c : bản tóm lược của chuỗi đầu.
Code:
...

MD5_CTX ctx;
MD5_Init(&ctx);

MD5_Update(&ctx, msg, strlen(msg));
MD5_Final(digest, &ctx);
...

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 quan
trọ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ằng
của khóa qua các bit 1.
• DES_cblock *key : khóa loại DES_cblock.


18

18


• DES_set_key_checked(const_DES_cblock
*key,DES_key_schedule *schedule) : kiểm tra tính chẵn lẻ và

độ mạnh mẽ của khóa. Nếu giá trị trả về là -1 thì tính chẵn lẻ bị sai,
trả về -2 là khóa yếu.
o const_DES_cblock *key : khóa loại DES_cblock.
o DES_key_schedule *schedule : thời hạn của khóa.
Code : DES_set_key_checked( &Key2, &schedule );

Hình 1. Sơ đồ khối mã hóa DES
DES_cfb64_encrypt(const unsigned char *in,unsigned char
*out, long length, DES_key_schedule *schedule, DES_cblock
*ivec,int *num,int enc) : thực hiện chế độ CFB của DES với 64bit

thông tin phản hồi.
19

19


o const unsigned char *in : thông điệp cần mã hóa.
o unsigned char *out : biến được trả về bản mã.
o long length : độ dài của thông điệp.
o DES_key_schedule *schedule : thời hạn của khóa.

o DES_cblock *ivec : khóa.
o DES_ENCRYPT : hàm mã hóa.
Code : DES_cfb64_encrypt( ( unsigned char * ) Msg, (
unsigned char * ) Res, size, &schedule, &Key2, &n,
DES_ENCRYPT );

Hình 2: Sơ đồ khối giải mã DES
• DES_cfb64_encrypt(const

unsigned char *in,unsigned
char *out, long length, DES_key_schedule *schedule,
20

20


DES_cblock *ivec,int *num,int enc) : thực hiện chế độ CFB

của DES với 64bit thông tin phản hồi.
o const unsigned char *in : thông điệp cần giải mã.
o unsigned char *out : biến được trả về bản rõ.
o long length : độ dài của bản mã.
o DES_key_schedule *schedule : thời hạn của khóa.
o DES_cblock *ivec : khóa
o DES_DECRYPT : hàm giải mã.
Code : DES_cfb64_encrypt( ( unsigned char * ) Msg, (
unsigned char * ) Res, size, &schedule, &Key2, &n,
DES_DECRYPT );

3.4. RSA

RSA là một thuật toán mật mã khóa công khai. Độ dài khóa có thể từ
1024 đến 4096 bit. Hiện nay khóa 1024 đã có thể bị phá vỡ vì vậy chúng
ta nên dùng khóa có độ dài từ 2048bit trở lên.

21

21


Hình 3. Sơ đồ khối quá trình tạo cặp key RSA
• RSA_generate_key(int

bits,

unsigned

long

e,void

(*callback)(int,int,void *),void *cb_arg) : tạo cặp khóa.

o int bits : độ dài khóa.
Code : RSA *keypair = RSA_generate_key(RSA_KEY_LENGTH,
PUB_EXP, NULL, NULL);

• RSA_check_key(const RSA *) : kiểm tra cặp khóa tạo ra có hợp
lệ hay không , nếu nó trả về giát trị 1 là cặp khóa hợp lệ, 0 là không
hợp lệ.
22


22


o const RSA * : cặp khóa vừa được tạo ra.
Code : RSA_check_key(keypair));

• PEM_write_RSAPublicKey(FILE *fp , const RSA *x) : ghi
khóa công khai vào file.
o FILE *fp : file chứa khóa công khai.
o const RSA *x : khóa công khai do RSA_geneate_key () tạo ra.
Code:PEM_write_RSAPublicKey(rsa_pubkey_file, keypair);

• PEM_write_RSAPrivateKey(FILE *fp , RSA *x , const
EVP_CIPHER *enc , unsigned char *kstr , int klen ,
pem_password_cb *cb , void *u) : ghi khóa bí mật vào file.

o FILE *fp : file chứa khóa bí mật.
o RSA *x : khóa bí mật do RSA_geneate_key () tạo ra.
Code : PEM_write_RSAPrivateKey(rsa_privkey_file, keypair,
NULL, NULL, 0, 0,NULL);

23

23


Hình 4: Sơ đồ khối mã hóa RSA
• PEM_read_RSAPublicKey(


FILE

*fp

,

RSA

*x

,

pem_password_cb *cb , void * u ) : đọc khóa công khai từ

file.
o FILE *fp : file lưu giữ khóa công khai
o RSA *x : biến chứa khóa công khai sau khi đọc từ file ( kiểu
RSA).
Code: PEM_read_RSAPublicKey(rsa_pubkey_file,
&rsa_pubkey, NULL, NULL);

• RSA_public_encrypt(int

flen,

const

unsigned

char


*from, unsigned char *to, RSA *rsa,int padding) : mã

hóa thông điệp sử dụng khóa công khai.
24

24


o int flen : độ dài thông điệp.
o const unsigned char *from : chuỗi thông điệp.
o unsigned char *to : biến chứa bản mã sau khi đã mã hóa.
o RSA *rsa : khóa công khai.
o int padding : lược đồ chuyển đổi bản rõ.
Code : RSA_public_encrypt((int)strlen(msg),(unsigned
char*)msg, (unsigned char*)encrypt, rsa_pubkey,
RSA_PKCS1_OAEP_PADDING);

Hình 5. Sơ đồ khối giải mã RSA
• PEM_read_RSAPrivateKey(

FILE

*fp

,

RSA

*x


,

pem_password_cb *cb , void * u ) : đọc khóa bí mật từ file.

o FILE *fp : file lưu giữ khóa bí mật.
25

25


×