[r]
(1)Lương Ánh Hoàng
hoangla@soict.hut.edu.vn
Chương 4 Mã hóa đối xứng
(2)4.1 Biểu diễn khóa
4.2 Chuyển đổi chuỗi hexa và khóa nhị phân 4.3 Mã hóa và giải mã Base64
4.4 Các phương pháp mã hóa đối xứng 4.5 Mã hóa đối xứng với OpenSSL
(3)• Khóa đối xứng: Một số rất lớn sử dụng để mã hóa và giải mã thơng
điệp
• Biểu diễn khóa:
• Phân tách thành các byte và lưu dưới dạng một mảng
unsigned char key[KEYLEN_BYTES]
• Biểu diễn dưới dạng số nguyên lớn nếu khóa có chiều dài 64-‐bit
long long key
• Biểu diễn dưới dạng chuỗi chữ số hexa
char key[]=“AF12B5C7E0…”
• Biểu diễn dưới dạng xâu ASCII (mật khẩu)
char key[]=“secret!!!”
• Lưu ý về tính “endian” của máy thực hiện mã hóa
4.1 Biểu diễn khóa
(4)• Chuyển đổi khóa nhị phân sang dạng chuỗi chữ số hexa
#define MAX_KEY_LEN 32 unsigned char key[MAX_KEY_LEN]; char result[MAX_KEY_LEN*2+1]; for (int i=0;i<MAX_KEY_LEN;i++)
sprintf(result+i*2,"%2X",key[i]); printf("Key:%s",result);
(5)
• Chuyển đổi chuỗi hexa sang khóa
nhị phân
char Hex2Dec(char c) {
if (('a'<=c)&&(c<='z')) return c -‐ 'a'+10; if (('A'<=c)&&(c<='Z')) return c -‐ 'A'+10; if (('0'<=c)&&(c<='9')) return c -‐ '0'; return -‐1;
} …
#define MAX_KEY_LENGTH 32 char hexa[]="AF125C4D8E";
unsigned char key[MAX_KEY_LENGTH]; int keylen = strlen(hexa);
char c1,c2;
if ((keylen%2!=0)||(keylen/2 >
MAX_KEY_LENGTH))
printf("Invalid key length"); keylen = keylen/2;
for (int i=0;i<keylen;i++) {
c1 = Hex2Dec(hexa[i*2]); c2 = Hex2Dec(hexa[i*2+1]); if ((c1==-‐1)||(c2==-‐1))
{
printf("Invalid character !!!"); break;
};
key[i] = (c1<<4)|c2; };
4.2 Chuyển đổi chuỗi hexa và khóa nhị phân
(6)• Mã hóa Base64
• Sử dụng 6-‐bit để mã hóa dữ liệu và biểu diễn dưới dạng các chữ cái ASCII
• Cứ 3 byte dữ liệu vào sẽ được biểu diễn thành 4 byte dữ liệu ra
• Các ký tự ra nằm trong khoảng:
• ‘A’ – ‘Z’ tương đương các giá trị của từ mã từ 0-‐25
• ‘a’ – ‘z’ tương đương các giá trị của từ mã từ 26-‐51
• ‘0’-‐ ‘9’ tương đương các giá trị từ mã từ 52-‐61
• ‘+’ , ‘-‐’ tương ứng với các giá trị mã 62,63
• Nếu dữ liệu vào có kích thước khơng chia hết cho 3 sẽ thì được thêm vào bằng ký tự
‘=‘
• VD
Dữ liệu gốc: ‘A’ – 0100.0001
Dữ liệu mã hóa dạng Base64: 010000.010000.000000.000000 ~ QQ== Dữ liệu gốc: ‘AA’ – 0100.0001.0100.0001
Dữ liệu mã hóa dạng Base64: 010000.010100.000100.000000 ~ QUE= Dữ liệu gốc: ‘AAA’ – 0100.0001.0100.0001.0100.0001
Dữ liệu dạng mã hóa Base64: 010000.010100.000101.000001 ~ QUFB
(7)
• Mã hóa Base64
4.3 Mã hóa và giải mã Base64
61
Value Char
Value Char
Value Char
Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
(8)• Đoạn chương trình mã hóa Base64: P4.5 – Secure C Programming
Cookbook
• Đoạn chương trình giải mã Base64: P4.6 – Secure C Programming
Cookbook
(9)• Mã hóa đối xứng: Sử dụng chung một khóa cho mã hóa và giải mã
• Có hai loại: Mã khối và mã dịng
• Có nhiều chế độ mã hóa: ECB, CBC, CFB, OFB, CTR, CWC…
• Có nhiều giải thuật:
4.4 Các phương pháp mã hóa đối xứng
63
Cipher Key size Speed[4] Implementation Notes
AES 128 bits[5] 14.1 cpb in asm, 22.6 cpb in
C Brian Gladman's[6]
The assembly version currently works only on Windows
AES 128 bits 41.3 cpb OpenSSL
Triple DES 192 bits[7] 108.2 cpb OpenSSL
SNOW 2.0 128 or 256 bits 6.4 cpb Fast reference
implementation[8] This implementation is written in C
RC4 Up to 256 bits
(usually 128 bits) 10.7 cpb OpenSSL
Serpent 128, 192, or 256 bits 35.6 cpb Fast reference
implementation
It gets a lot faster on 64-‐bit platforms and is at least as fast as AES in hardware
Blowfish Up to 256 bits
(10)• Thư viện OpenSSL: Thư viện mã nguồn mở, mạnh mẽ và dễ sử dụng
• OpenSSL hỗ trợ:
• Nhiều thuật tốn mã hóa: AES, DES , 3DES, Blow}ish, CAST, Idea, RC2, RC5
• Nhiều chế độ mã hóa: ECB, CBC, CFB, OFB, CTR…
• Mã hóa dịng: RC4
• Các giải thuật băm: MD2, MD4, MD5,SHA-‐1,SHA-‐224,SHA-‐256…
• MAC: HMAC MDC2
• Các giải thuật mã hóa cơng khai: DH, DSA, RSA, ECC
• Sử dụng thư viện:
• Trên Unix/Linux: Tải source về và biên dịch Kết quả là }ile libcrypto.[so/
a], libssl.[so/a] và các }ile .h để include vào chương trình
• Trên Windows: Tải bản binary đã biên dịch sẵn: libeay32.dll, ssleay32.dll,
tệp tiêu đề (.h) và tệp thư viện (.lib) Link http://www.ie7pro.com/
openssl.html