Giáo trình Lập trình An toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng
#include
#include
int password_cb(char *buf, int len, int rwqlag, void *cb_arg)
{
strcpy(buf,"hello");
return strlen(buf);
}
BIO * mem = BIO_new(BIO_s_mem());
BUF_MEM * bp;
BIO_get_mem_ptr(mem,&bp);
PEM_write_bio_RSAPrivateKey(mem,key,EVP_aes_256_cbc(),
0,0,password_cb,0)
17 trang |
Chia sẻ: huongthu9 | Lượt xem: 446 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Giáo trình Lập trình An toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Lương
Ánh
Hoàng
hoangla@soict.hut.edu.vn
Chương
6.
Mã
hóa
công
khai
Public
Key
Cryptography
6.1
Mã
hóa
với
OpenSSL
RSA
6.2
Chữ
ký
số
6.3
Biểu
diễn
khóa
6.4
Kết
nối
SSL
6.5
Hạ
tầng
khóa
công
khai
Nội
dung
102
• Mã
hóa
bất
đối
xứng
• Là
các
giải
thuật
sử
dụng
một
cặp
khóa
cho
việc
mã
hóa
và
giải
mã
• Dữ
liệu
được
mã
hóa
bằng
khóa
công
khai
sẽ
được
giải
mã
bằng
khóa
bí
mật
và
ngược
lại.
• Các
giải
thuật
thông
dụng:
RSA,
DSA,
Dif}ie-‐Hellman.
• Không
sử
dụng
trực
tiếp
để
mã
hóa
dữ
liệu
vì
tốc
độ
rất
chậm.
• Thường
được
sử
dụng
để
• Trao
đổi
khóa
đối
xứng
trong
phiên
truyền
mật
• Chữ
ký
số
• Xác
nhận
danh
tính
•
6.1
Mã
hóa
với
OpenSSL
RSA
103
• OpenSSL
RSA
• Thường
được
sử
dụng
trao
đổi
khóa
• Lưu
trữ
tất
cả
thông
tin
về
một
khóa
dưới
cấu
trúc
RSA.
• Tệp
tiêu
đề
rsa.h
• Sinh
cặp
khóa
đối
xứng
bằng
hàm
RSA
*RSA_generate_key(int
bits,
//
Kích
thước
khóa:
1024,2048
unsigned
long
exp,//
Số
mũ:
3,
17,
65537
void
(*cb)(int,
int,
void),
//
Callback
void
*cb_arg);
6.1
Mã
hóa
với
OpenSSL
RSA
104
• Mã
hóa
với
khóa
công
khai
• Sử
dụng
hàm
RSA_public_encrypt:
int
RSA_public_encrypt(int
l,
//
Chiều
dài
dữ
liệu
unsigned
char
*pt,
//
Xâu/số
cần
mã
unsigned
char
*ct,
//
Kết
quả
RSA
*r,
//
Cấu
trúc
RSA
int
p);
//
Kiểu
padding
Kết
quả
trả
về:
chiều
dài
xâu
mã
được.
6.1
Mã
hóa
với
OpenSSL
RSA
105
• Giải
mã
với
khóa
bí
mật
• Sử
dụng
hàm
RSA_private_decrypt:
int
RSA_private_decrypt(int
l,
unsigned
char
*ct,
unsigned
char
*pt,
RSA
*r,
int
p);
Kết
quả
trả
về:
chiều
dài
xâu
giải
mã
được
6.1
Mã
hóa
với
OpenSSL
RSA
106
• Bài
tập
– Viết
chương
trình
chat
console
client-‐server
sử
dụng
giải
thuật
RSA.
Chỉ
chia
sẻ
public
key
trên
đường
truyền.
6.1
Mã
hóa
với
OpenSSL
RSA
107
• Chữ
ký
số
dữ
liệu
nhằm
xác
thực
danh
tính
của
người
gửi,
tương
tự
như
HMAC
nhưng
sử
dụng
giải
thuật
RSA
• Quá
trình
ký
số
dữ
liệu
nhận
đầu
vào
là
giá
trị
băm
của
thông
điệp,
khóa
bí
mật
của
người
gửi,
đầu
ra
là
giá
trị
hàm
băm
đã
được
mã
hóa.
• Bên
nhận
thực
hiện
quá
trình
ngược
lại:
tính
giá
trị
băm
của
thông
điệp,
giải
mã
giá
trị
băm
đã
mã
hóa
của
bên
gửi
bằng
khóa
công
khai
và
so
sánh
hai
giá
trị
băm
này.
• Hacker
không
thể
giả
mạo
giá
trị
băm
vì
không
có
khóa
bí
mật
của
bên
gửi.
6.2
Chữ
ký
số
108
• Sơ
đồ
ký
6.2
Chữ
ký
số
109
Dữ
liệu
Giá
trị
băm
(MD)
H
as
h
(S
H
A1
)
Chữ
ký
Khóa
bí
mật
Mã
hóa
Dữ
liệu
+
Chữ
ký
• Thực
hiện
bằng
OpenSSL
RSA
– Hàm
RSA_sign
là
hàm
mức
thấp
của
OpenSSL
thực
hiện
ký
số
dữ
liệu
6.2
Chữ
ký
số
110
int
RSA_sign(int
md_type,
//
Loại
Message
Digest:
SHA1,
MD5
unsigned
char
*dgst,
//
Bản
thân
dữ
liệu
(Message
Digest)
unsigned
int
dlen,
//
Kích
thước
unsigned
char
*sig,
//
Chữ
ký
unsigned
int
*siglen,
//
Chiều
dài
chữ
ký
RSA
*r);
//
Khóa
bí
mật
• Thực
hiện
bằng
OpenSSL
RSA
– Hàm
RSA_verify
thực
hiện
công
việc
ngược
lại:
kiểm
tra
tính
hợp
lệ
của
chữ
ký
• Thực
hiện
bằng
OpenSSL
DSA
– Xem
thêm
trong
sách
(phần
7.15)
6.2
Chữ
ký
số
111
int
RSA_verify(int
md_type,
//Loại
message
digest:
md5,sha1,
unsigned
char
*dgst,
//
message
digest
unsigned
int
dlen,
//
kích
thước
message
digest
unsigned
char
*sig,
//
Chữ
ký
unsigned
int
siglen,
//
Chiều
dài
chữ
ký
RSA
*r);
//
Khóa
công
khai
• Biểu
diễn
khóa
và
chứng
thực
– DER
(Binary)
– PEM
(Plaintext)
• Biểu
diễn
DER
– Chuẩn
quốc
tế
thông
dụng
– Các
hàm
OpenSSL
tương
ứng:
i2d
và
d2i
(internal
representation
ó
DER)
– Ví
dụ
chuyển
khóa
công
khai
RSA
sang
lưu
trữ
dưới
dạng
DER
6.3
Biểu
diễn
khóa
112
unsigned
char
*DER_encode_RSA_public(RSA
*rsa,
int
*len)
{
unsigned
char
*buf,
*next;
*len
=
i2d_RSAPublicKey(rsa,
0);
if
(!(buf
=
next
=
(unsigned
char
*)malloc(*len)))
return
0;
i2d_RSAPublicKey(rsa,
&next);
/*
If
we
use
buf
here,
return
buf;
becomes
wrong
*/
return
buf;
}
• Biểu
diễn
DER
– Ví
dụ
chuyển
khóa
từ
dạng
DER
sang
dạng
khóa
công
khai
RSA
6.3
Biểu
diễn
khóa
công
khai
113
RSA
*DER_decode_RSA_public(unsigned
char
*buf,
long
len)
{
return
d2i_RSAPublicKey(0,
&buf,
len);
}
• Biểu
diễn
PEM
(Privacy
Enhanced
Mail)
– Thực
chất
là
biểu
diễn
DER
dưới
dạng
Base64
và
có
thêm
phần
header,
footer
và
có
thể
mã
hóa
– Ví
dụ
-‐-‐-‐-‐-‐BEGIN
RSA
PRIVATE
KEY-‐-‐-‐-‐-‐
Proc-‐Type:
4,ENCRYPTED
DEK-‐Info:
DES-‐EDE3-‐CBC,F2D4E6438DBD4EA8
LjKQ2r1Yt9foxbHdLKZeClqZuzN7PoEmy+b+dKq9qibaH4pRcwATuWt4/Jzl6y85
NHM6CM4bOV1MHkyD01tFsT4kJ0GwRPg4tKAiTNjE4Yrz9V3rESiQKridtXMOToEp
Mj2nSvVKRSNEeG33GNIYUeMfSSc3oTmZVOlHNp9f8LEYWNmIjfzlHExvgJaPrixX
QiPGJ6K05kV5FJWRPET9vI+kyouAm6DBcyAhmR80NYRvaBbXGM/MxBgQ7koFVaI5
zoJ/NBdEIMdHNUh0h11GQCXAQXOSL6Fx2hRdcicm6j1CPd3AFrTt9EATmd4Hj+D4
91jDYXElALfdSbiO0A9Mz6USUepTXwlfVV/cbBpLRz5Rqnyg2EwI2tZRU+E+Cusb
/b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w==
-‐-‐-‐-‐-‐END
RSA
PRIVATE
KEY-‐-‐-‐-‐-‐
6.3
Biểu
diễn
khóa
công
khai
114
• Biểu
diễn
PEM
(Privacy
Enhanced
Mail)
– Các
hàm
OpenSSL:
• Tệp
tiêu
đề
• PEM_read_***
• PEM_write_***
– Ví
dụ
ghi
ra
bộ
nhớ
khóa
bí
mật
RSA
được
mã
hóa
dưới
dạng
PEM
–
AES256-‐CBC
6.3
Biểu
diễn
khóa
công
khai
115
#include
#include
int
password_cb(char
*buf,
int
len,
int
rwqlag,
void
*cb_arg)
{
strcpy(buf,"hello");
return
strlen(buf);
}
BIO
*
mem
=
BIO_new(BIO_s_mem());
BUF_MEM
*
bp;
BIO_get_mem_ptr(mem,&bp);
PEM_write_bio_RSAPrivateKey(mem,key,EVP_aes_256_cbc(),
0,0,password_cb,0);
• Secure
Socket
Layer
(SSL)
là
giao
thức
ở
tầng
ứng
dụng
cung
cấp
dịch
vụ
kết
nối
an
toàn
giữa
hai
ứng
dụng
trên
cơ
sở
hạ
tầng
khóa
công
khai.
• OpenSSL
cung
cấp
SSL
API
để
có
thể
viết
ứng
dụng
SSL
nhanh
chóng.
• ‐openssl/index.html#ibm-‐pcon
• OpenSSL
common
commands
–
NSA
Cyber
Security
6.4
Kết
nối
SSL
116
• Sử
dụng
bên
thứ
ba
để
chứng
thực
danh
tính
các
bên.
• Chống
được
hình
thức
tấn
công
Man-‐In-‐The
Middle
• Một
số
lệnh
thông
dụng
với
OpenSSL
– ‐howtos/usefulopenssl.html
6.5
Hạ
tầng
khóa
công
khai
117
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_an_toan_chuong_6_ma_hoa_cong_khai_luong.pdf