Lương&Ánh&Hoàng&
hoangla@soict.hut.edu.vn&
Chương&4.&Mã&hóa&đối&xứng&
Symmetric&Crytography&
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&
4.6&Mã&hóa&đối&xứng&với&Microsoft&Crypto&API&
Nội&dung&
56&
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&64tbit&
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&
57&
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);$
&
4.2&Chuyển&đổi&chuỗi&hexa&và&khóa&nhị&
phân&&
58&
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&&
59&