34
1 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ---------------------------------- ----- BÁO CÁO MÔN AN NINH MẠNG Đề tài : : Tìm hiểu và viết phần mềm truyền dữ liệu giữa hai máy sử dụng kỹ thuật mã hóa IDEA Giản viên hướng dẫn : Lê Xuân Thành

An Ninh Mạng

Embed Size (px)

DESCRIPTION

Tìm hiểu và viết phần mềm truyền dữ liệu giữa hai máy sử dụng kỹ thuật mã hóa IDEA

Citation preview

Page 1: An Ninh Mạng

1

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

---------------------------------------

BÁO CÁO MÔN

AN NINH MẠNG

Đề tài : : Tìm hiểu và viết phần mềm truyền dữ liệu giữa hai máy sử dụng kỹ thuật mã hóa IDEA

Giản viên hướng dẫn : Lê Xuân Thành

Sinh viên thực hiện : Đinh Tuấn Hiệp

Phạm QuangTùng

Hà Nội 5-2015

Page 2: An Ninh Mạng

2

Mục LụcI. Lời mở đầu...............................................................3II. Những đặc điểm chính..............................................4III. Các phép toán trong IDEA.......................................5IV. Mã hóa và giải mã trong IDEA................................74.1...................................................................Mã hóa

84.2..................................................................Giải mã

12Phần mềm thử nghiệm...............................................16

Page 3: An Ninh Mạng

3

I. Lời mở đầuPhương pháp IDEA (International Data Encryption Algorithm) là một

phương pháp mã khối. Được phát triển bởi Lai Học Gia và James L.Massey của ETH Zurich và được công bố lần đầu tiên vào năm 1991. Phương pháp này đưa ra như là một sự thay thế cho phương pháp cũ DEA (Data Encryption Standard). Tiền thân của IDEA là phương pháp mã trước đó có tên là PES (Proposed Encryption Standard); lúc đầu IDEA còn có tên là IPES (Improved PES). Sau này IDEA đã trở thành tên thương mại. Nó sẽ hết hạn vào năm 2010-2011. IDEA đã được xác nhập sau khi phiên bản đầu tiên V1.0 được phát hiện là không còn an toàn nữa.

IDEA là hệ mã thao tác trên từng khối 64bit, mã hóa cụm rõ 64bit thành cụm mã 64bit, sử dụng 128bit làm khóa bao gồm 1 chuỗi 8 lần biến đổi liên tiếp và tiếp theo là 1 lần biến đổi đầu ra. Lần biến đổi thứ r sử dụng 6 khối khóa con 16 bit Ki(r), 1<=i<=6, để biến đổi 64bit đầu vào X thành 1 đầu ra với 4 khối 16bit và đầu ra này lại là đầu vào cho lần biến đổi tiếp theo. Đầu ra của lần biến đổi thứ 8 là đầu vào cho lần biến đổi cuối cùng là đầu ra của phương pháp này. Trong lần biến đổi này nó dùng 4 khóa con Ki(9), 1<=i<=4, để tính toán cụm mã cuối cùng Y= (Y1,Y2, Y3, Y4). Tất cả các khóa con nhận được từ K.Một khái niệm trong thiết kế mang tính đột phá của phương pháp IDEA là cách sử dụng hỗn độn các phép toán từ tập 3 phép toán đại số khác nhau của nhóm 2**n phần tử. Các phép toán nhóm thực hiện trên các phần tử biểu diễn bằng 16 bit a và b là: XOR theo từng bit: a ^ b; cộng modulo 2**n: (a+b) mod 2**n, kí hiệu: a [+] b, và nhân modulo 2**n+1, ký hiệu a (*) b.

II. Những đặc điểm chínhIDEA lµ phư¬ng ph¸p m· khèi sö dông 128 bit khãa ®Ó

m· khèi d÷ liÖu 64 bit. IDEA ®ưîc x©y dùng nh»m môc ®Ých kÕt hîp víi nhiÒu yÕu tè kh¸c nhau ®Ó t¨ng ®é an toµn vµ kh¶ n¨ng thùc hiÖn. * §é an toµn: - §é dµi cña khèi: khèi ph¶i cã ®é dµi ®ñ ®Ó chèng l¹i c¸c phư¬ng ph¸p ph©n tÝch thèng kª vµ ng¨n viÖc mét sè khèi nµo ®ã xuÊt hiÖn nhiÒu h¬n c¸c khèi kh¸c. MÆt kh¸c sù

Page 4: An Ninh Mạng

4

phøc t¹p cña thuËt to¸n t¨ng theo hµm mò víi ®é dµi khèi. Víi khèi cã ®é dµi 64 bit lµ ®ñ ®é an toµn. Bªn c¹nh ®ã viÖc sö dông chÕ ®é feedback sÏ lµm t¨ng thªm ®é an toµn cña thuËt to¸n. - §é dµi khãa : Khãa ph¶i ®ñ dµi ®Ó cã thÓ chèng l¹i phư¬ng ph¸p vÐt c¹n khãa. - §é phøc t¹p : B¶n m· ph¶i phô thuéc mét c¸ch phøc t¹p vµo b¶n râ vµ khãa. Môc tiªu ®Æt ra ë ®©y lµ ph¶i lµm phøc t¹p hãa sù phô thuéc cña bé mÆt thèng kª cña b¶n m· vµo b¶n râ. IDEA ®¹t ®ưîc ®iÒu nµy nhê viÖc sö dông 3 phÐp to¸n sÏ tr×nh bµy sau ®©y. - Sù ph©n bè : IDEA ®· ®¹t ®ưîc viÖc mçi bit cña b¶n râ ph¶i cã ¶nh hưëng ®Õn nhiÒu bit cña b¶n m· vµ mçi bÝt khãa còng t¸c ®éng ®Õn nhiÒu bit cña b¶n m·. §iÒu nµy lµm cho cÊu tróc cña b¶n râ sÏ bÞ ph¸ vì trong b¶n m·.

III. Các phép toán trong IDEA- PhÐp XOR theo bit. Ký hiÖu lµ ⊕ - PhÐp céng 2 sè nguyªn lÊy modulo 216 (65536) víi ®Çu vµo vµ ®Çu ra lµ 2 sè nguyªn kh«ng dÊu 16 bit. Ký hiÖu . - PhÐp nh©n 2 sè nguyªn lÊy modulo 216 + 1 víi ®Çu vµo vµ ®Çu ra lµ 2 sè nguyªn kh«ng dÊu 16 bit. Qui −íc lµ khèi toµn sè 0 biÓu thÞ cho 216. Ký hiÖu ⊗.

Ba phÐp to¸n nµy tháa m·n : - Kh«ng cã 2 phÐp to¸n nµo tháa m·n luËt ph©n phèi: a ( b ⊗ c ) ≠ (a b) ⊗ (a c) - Kh«ng cã 2 phÐp to¸n nµo tháa m·n luËt kÕt hîp: a ( b ⊗ c ) ≠ (a b) ⊗ c

ViÖc sö dông kÕt hîp 3 phÐp to¸n nµy t¹o ra mét sù biÕn ®æi phøc t¹p d÷ liÖu ®Çu vµo lµm cho viÖc m· th¸m trë

Page 5: An Ninh Mạng

5

nªn khã kh¨n h¬n so víi viÖc chØ sö dông mét phÐp to¸n ®¬n gi¶n.

Trong IDEA sù ph©n bè ®ưîc t¹o ra dùa trªn khèi thuËt to¸n cã cÊu tróc như h×nh vÏ gäi lµ cÊu tróc MA (Multiplication/Addition)

Khèi nµy nhËn 16 bit tõ b¶n râ vµ 16 bit ®ưîc lÊy tõ khãa ra theo mét qui t¾c nµo ®ã ( 16 bit nµy ®ưîc gäi lµ subkey vµ qui t¾c lÊy subkey tõ khãa sÏ ®ưîc tr×nh bµy ë sau) ®Ó t¹o ra 16 bit ®Çu ra. Mét chư¬ng tr×nh kiÓm tra trªn m¸y tÝnh b»ng phư¬ng ph¸p vÐt c¹n x¸c ®Þnh r»ng mçi bit ë ®Çu ra phô thuéc vµo c¸c bit râ vµ bit subkey ®Çu vµo. CÊu tróc nµy ®ưîc sö dông lÆp l¹i 8 lÇn trong thuËt to¸n vµ t¹o nªn mét sù ph©n bè cã hiÖu qu¶.

IDEA ®ưîc x©y dùng sao cho viÖc thùc hiÖn nã ®ưîc dÔ dµng c¶ trªn phÇn cøng vµ phÇn mÒm. ViÖc thùc hiÖn trªn phÇn cøng, ®iÓn h×nh lµ trªn vi m¹ch VLSI, ®ưîc thiÕt kÕ ®Ó ®¹t ®ưîc tèc ®é cao. ViÖc x©y dùng trªn phÇn mÒm th× thuËn tiÖn vµ gi¸ thµnh thÊp. - Nh÷ng ®iÓm chñ yÕu trong viÖc x©y dùng phÇn mÒm: + Sö dông nh÷ng khèi nhá: nh÷ng phÐp to¸n m· thùc hiÖn trªn nh÷ng khèi cã ®é dµi 8, 16, 32 bit phï hîp víi viÖc xö lý trªn m¸y tÝnh. + Sö dông thuËt to¸n gi¶n ®¬n: PhÐp to¸n m· dÔ dµng trong lËp tr×nh như phÐp céng, phÐp dÞch chuyÓn (shift),...C¶ 3 phÐp to¸n cña IDEA ®Òu tháa m·n nh÷ng yªu cÇu nµy. §iÓm khã kh¨n nhÊt lµ phÐp to¸n nh©n modulo

Page 6: An Ninh Mạng

6

(216 + 1) còng cã thÓ x©y dùng dÔ dµng tõ nh÷ng phÐp to¸n s½n cã. - Nh÷ng ®iÓm chñ yÕu trong viÖc thùc hiÖn trªn phÇn cøng: + Sù tư¬ng tù trong m· hãa vµ gi¶i m·: M· hãa vµ gi¶i m· chØ kh¸c nhau trong viÖc sö dông khãa vµ nhê ®ã mét phư¬ng tiÖn cã thÓ dïng cho c¶ m· hãa vµ gi¶i m·. + CÊu tróc lÆp l¹i: Phư¬ng ph¸p m· nªn cã cÊu tróc modul lÆp l¹i ®Ó c¸c m¹ch VLSI cã thÓ thùc hiÖn ®ưîc dÔ dµng. IDEA ®ưîc x©y dùng tõ hai khèi modulo ®¬n gi¶n vµ sö dông lÆp l¹i nhiÒu lÇn.IV. Mã hóa và giải mã trong IDEA

Mã hóa và giải mã trong IDEAIV.1. Mã hóa

Page 7: An Ninh Mạng

7

Cấu trúc của IDEA

Gièng như c¸c s¬ ®å m· hãa kh¸c, hµm m· hãa cã 2 tham sè ë ®Çu vµo lµ b¶n râ cÇn m· vµ khãa. Trong trõ¬ng hîp nµy lµ 64 bit râ vµ 128 bit khãa.

Tõ ®Çu vµo ®Õn ®Çu ra, c¸c bit râ lÇn lưît ®i qua 8 modul vµ mét hµm biÕn ®æi cuèi cïng. T¸m modul nµy cã cÊu tróc gièng nhau vµ thùc hiÖn c¸c thao t¸c như nhau ®èi víi d÷ liÖu ®Çu vµo. Mçi modul nhËn 4 khèi 16 bit râ ë ®Çu vµo cïng víi c¸c subkey vµ ®ưa ra 4 khèi 16 bit ®· ®ưîc m· hãa. Do ®ã 64 bit râ sÏ ®ưîc chia thµnh 4 khèi nhá gäi lµ c¸c subblock, mçi subblock lµ 16 bit. Cïng víi c¸c subblock nµy lµ 6 khèi subkey còng sÏ ®ưîc ®ưa vµo tõng modul. Như vËy thªm 4 subkey cÇn thiÕt cho hµm biÕn ®æi cuèi cïng, ta cÇn tæng céng 52 khèi subkey cho mét lÇn m·.

Page 8: An Ninh Mạng

8

Cấu trúc 1 modulo

Như ®· tr×nh bÇy ë trªn, c¸c modul cã cÊu tróc gièng nhau vµ chØ kh¸c nhau ë d÷ liÖu ®Çu vµo. Trõ modul ®Çu tiªn nhËn 64 bit râ ®ưa tõ ngoµi vµo, c¸c modul ®øng sau sÏ nhËn 4 khèi subblock 16 bit ®Çu ra cña modul ®øng trưíc nã lµm c¸c bit râ ®Çu vµo. Trong qu¸ tr×nh ®Çu tiªn c¸c modul kÕt hîp 4 subblock víi 4 subkey b»ng c¸c phÐp to¸n. Bèn khèi ®Çu ra cña qu¸ tr×nh nµy XOR víi nhau như trong s¬ ®å ®Ó t¹o ra 2 khèi ®Çu vµo cho cÊu tróc MA vµ cÊu tróc MA sÏ kÕt hîp chóng víi 2 subkey cßn l¹i ®Ó t¹o ra 2 khèi 16 bit míi.

Page 9: An Ninh Mạng

9

Cuèi cïng, 4 khèi ®ưîc t¹o ra tõ qu¸ tr×nh ®Çu tiªn sÏ ®ưîc XOR víi 2 khèi ®Çu ra cña cÊu tróc MA ®Ó t¹o ra 4 khèi ®Çu ra cña modul. Chó ý 2 khèi ®Çu vµo X2 vµ X3 ®ư¬c ho¸n ®æi cho nhau ®Ó t¹o ra 2 khèi W12 vµ W13 ®ưîc ®ưa ra ngoµi. §iÒu nµy lµm t¨ng sù hßa trén cña c¸c bit ®ưîc xö lý vµ t¨ng kh¶ n¨ng chèng l¹i c¸c phư¬ng ph¸p m· th¸m. Hµm biÕn ®æi ë cuèi cïng ta còng cã thÓ coi như lµ mét modul thø 9. Hµm nµy cã cÊu tróc gièng như cÊu tróc ®· thùc hiÖn trong qu¸ tr×nh ®Çu tiªn cña mét modul chØ kh¸c lµ khèi thø 2 vµ thø 3 ë ®Çu vµo ®ù¬c ®æi chç cho nhau trưíc khi ®ược ®ưa tíi c¸c ®¬n vÞ phÐp to¸n. Thùc ra ®©y chØ lµ viÖc tr¶ l¹i thø tù ®· bÞ ®æi sau modul thø 8. Lý do cña viÖc nµy lµ sù gièng nhau vÒ cÊu tróc cña qu¸ tr×nh gi¶i m· qu¸ tr×nh m· hãa.

Hàm biến đổi của IDEA

*Qui t¾c t¹o ra subkey: Như trªn ®· tr×nh bµy, cÇn thiÕt ph¶i cã 52 khèi subkey 16 bit ®ưîc t¹o ra tõ 128 bit khãa. Qui t¾c t¹o như sau:- 8 subkey ®Çu tiªn, Z1...Z8, ®ưîc lÊy trùc tiÕp tõ khãa víi Z1 lµ 16 bit ®Çu (bit cã träng sè cao nhÊt), Z2 lµ 16 bit tiÕp theo vµ cø tiÕp tôc như vËy. Sau ®ã khãa ®ưîc quay

Page 10: An Ninh Mạng

10

tr¸i 25 bit vµ 8 subkey tiÕp theo ®ưîc t¹o ra theo qui t¾c trªn. Thao t¸c nµy ®ưîc lÆp l¹i cho ®Õn khi cã ®ñ 52 khèi subkey. Qui t¾c nµy lµ mét phư¬ng ph¸p hiÖu qu¶ cho viÖc ®a d¹ng hãa c¸c bit khãa dïng cho c¸c modul. Ta nhËn thÊy r»ng nh÷ng subkey ®Çu tiªn dïng trong mçi modul sö dông nh÷ng tËp hîp bit kh¸c nhau cña khãa. NÕu như khãa 128 bit ®ưîc ký hiÖu lµ Z[1..128] th× subkey ®Çu tiªn cña 8 modul sÏ lµ: Z1 = Z[1..16] Z25 = Z[76..91] Z7 = Z[97..112] Z31 = Z[44..59] Z13 = Z[90..105] Z37 = Z[37..52] Z19 = Z[83..98] Z43 = Z[30..45] Như vËy, 96 bit subkey sö dông cho mçi modul, trõ modul thø nhÊt vµ modul thø 8, lµ kh«ng liªn tôc. Do ®ã kh«ng cã mét mèi liªn hÖ dÞch chuyÓn ®¬n gi¶n nµo gi÷a c¸c subkey cña mét modul vµ gi÷a c¸c modul víi nhau. Nguyªn nh©n cã ®ưîc kÕt qu¶ nµy lµ viÖc chØ cã 6 khèi subkey ®ưîc sö dông trong khi cã 8 khèi subkey ®ưîc t¹o ra trong mçi lÇn dÞch chuyÓn khãa.

IV.2. Giải mãQu¸ tr×nh gi¶i m· vÒ c¬ b¶n gièng qu¸ tr×nh m· hãa.

Gi¶i m· nhËn b¶n m· ë ®Çu vµo vµ còng ®i qua nh÷ng cÊu tróc như ë trªn, chØ kh¸c ë sù lùa chän c¸c subkey. C¸c subkey ®Ó gi¶i m· U1, U2,...U52 nhËn ®ưîc tõ khãa m· theo qui t¾c sau: - §èi víi modul gi¶i m· i ta lÊy 4 subkey ®Çu cña modul m· hãa thø (10-i), ë ®©y hµm biÕn ®æi ®ưîc coi như modul thø 9. Sau ®ã lÊy nh©n ®¶o modulo (216 + 1) cña subkey

Page 11: An Ninh Mạng

11

thø 1 vµ thø 4 ®Ó dïng cho subkey gi¶i m· thø 1 vµ thø 4 tư¬ng øng. §èi víi c¸c modul tõ thø 2 ®Õn thø 8, subkey gi¶i m· thø 2 vµ thø 3 lµ céng ®¶o modulo 216 cña subkey thø 3 vµ thø 2 tư¬ng øng. §èi víi c¸c modul thø 1 vµ thø 9, subkey gi¶i m· thø 2 vµ thø 3 lµ céng ®¶o modulo 216 cña subkey thø 2 vµ thø 3 tư¬ng øng. - §èi víi 8 modul ®Çu tiªn, 2 subkey cuèi cña modul i lµ 2 subkey cuèi cña modul m· hãa thø (9 - i).

Ở ®©y nh©n ®¶o Zj-1 cña Zj lµ phÇn tö nghÞch ®¶o cña Zj ®èi víi phÐp to¸n nh©n tøc: Z j ⊗ Zj-1 = 1

V× 216 + 1 lµ mét sè nguyªn tè nªn mçi sè nguyªn Zj < 216 cã mét sè nh©n ®¶o modulo (216 +1) duy nhÊt. Víi céng ®¶o modulo 216 th×: -Z j + Zj = 0

H×nh vÏ sau thÓ hiÖn qu¸ tr×nh m· hãa (theo chiÒu ®i xuèng bªn tr¸i) vµ qu¸ tr×nh gi¶i m· (chiÒu ®i lªn bªn ph¶i) cña thuËt to¸n IDEA.

Mçi modul ®ưîc chia thµnh 2 khèi nhá : khèi biÕn ®æi vµ khèi m· hãa. Khèi biÕn ®æi tư¬ng øng víi qu¸ tr×nh ®Çu tiªn trong mçi modul, cßn khèi m· hãa tư¬ng øng víi c¸c qu¸ tr×nh cßn l¹i. ë phÝa cuèi cña s¬ ®å, bªn m· hãa ta nhËn ®ưîc c¸c mèi quan hÖ sau gi÷a ®Çu ra vµ ®Çu vµo cña hµm biÕn ®æi:

Y1 = W81 ⊗ Z49 Y3 = W82 + Z51 Y2 = W83 + Z50 Y4 = W84 ⊗ Z52 T¹i khèi biÕn ®æi cña modul thø nhÊt trong qu¸ tr×nh

gi¶i m·, ®Çu ra vµ ®Çu vµo cã mèi quan hÖ sau:

Page 12: An Ninh Mạng

12

J11 = Y1 ⊗ U1 J13 = Y3 + U3 J12 = Y2 + U2 J14 = Y4 ⊗ U4 Ta cã: J11 = Y1 ⊗ Z49-1 = W81 ⊗ Z49⊗ Z49-1 = W81 J12 = Y2 + - Z50 = W83 + Z50 + -Z50 = W83 J13 = Y3 + - Z51 = W82 + Z51 + -Z51 = W82 J14 = Y4 ⊗ Z50-1

= W84 ⊗ Z50⊗ Z50-1 = W84 Như vËy, kÕt qu¶ thu ®ưîc sau khèi biÕn ®æi thø nhÊt

cña qu¸ tr×nh gi¶i m· chÝnh lµ d÷ liÖu râ ®ưa vµo khèi m· hãa cuèi cïng cña qu¸ tr×nh m· hãa chØ kh¸c lµ khèi d÷ liÖu thø 2 vµ khèi d÷ liÖu thø 3 ®· ®æi chç cho nhau. B©y giê ta sÏ xÐt ®Õn mèi quan hÖ thu ®ưîc theo s¬ ®å 711:

W81 = I81 + MAR(I81 + I83, I82 + I84 ) W82 = I83 + MAR(I81 + I83, I82 + I84 ) W83 = I82 + MAR(I81 + I83, I82 + I84 ) W84 = I84 + MAR(I81 + I83, I82 + I84 ) trong ®ã MAR(X,Y) lµ ®Çu ra phÝa bªn ph¶i cßn

MAL(X,Y) lµ ®Çu ra phÝa bªn tr¸i cña cÊu tróc MA trong h×nh 79 khi ®Çu vµo lµ X vµ Y. Vµ:

Page 13: An Ninh Mạng

13

V11 = J11 + MAR(J11 + J13, J12 + J14 ) =W81 + MAR(W81 + W82, W83 + W84 ) =I81 + MAR(I81 + I83, I82 + I84 ) +

MAR[I81+MAR(I81+I83,I82+I84)+I83+MAR(I81+I83,I82+I84 ), I82+MAL(I81+I83,I82 +I84) +I84+MAL(I81+I83, I82 + I84 )]

= I81+MAR(I81+I83,I82 +I84) +MAR(I81+I83, I82 + I84 )

= I81

Tư¬ng tù ta cã: V12 = I82 V13 = I83 V14 = I84 Như vËy, kÕt qu¶ thu ®ưîc sau khèi m· hãa thø nhÊt

cña qu¸ tr×nh gi¶i m· l¹i lµ d÷ liÖu ®ưa vµo khèi biÕn ®æi cña modul cuèi cïng cña qu¸ tr×nh m· hãa chØ kh¸c lµ khèi d÷ liÖu thø 2 vµ khèi d÷ liÖu thø 3 ®· ®æi chç cho nhau. Cø như vËy, ta sÏ thu ®ưîc:

V81 = I11 V82 = I13 V83 = I12 V84 = I14 V× hµm biÕn ®æi cuèi cïng cña qu¸ tr×nh gi¶i m·

còng gièng như khèi biÕn ®æi trong modul ®Çu tiªn cña qu¸ tr×nh m· hãa chØ kh¸c lµ cã ®æi chç cña khèi d÷ liÖu thø 2 vµ khèi d÷ liÖu thø 3 nªn ta cã b¶n râ thu ®ưîc sau gi¶i m· gièng b¶n râ ®ưa vµo m· hãa.

Page 14: An Ninh Mạng

14

V. Phần mềm thử nghiệmV.1. Client

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include <winsock2.h>#include <windows.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <idea.h>

#include "osrng.h"using CryptoPP::AutoSeededRandomPool;#include <conio.h>#include <iostream>using std::cout;using std::cerr;using std::endl;

#include <string>using std::string;

#include <cstdlib>using std::exit;

#include "cryptlib.h"using CryptoPP::Exception;

#include "hex.h"using CryptoPP::HexEncoder;using CryptoPP::HexDecoder;

#include "filters.h"using CryptoPP::StringSink;using CryptoPP::StringSource;using CryptoPP::StreamTransformationFilter;

#include "idea.h"using CryptoPP::IDEA;

Page 15: An Ninh Mạng

15

#include "modes.h"using CryptoPP::CBC_Mode;

#include "secblock.h"using CryptoPP::SecByteBlock;

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib#pragma comment (lib, "Ws2_32.lib")#pragma comment (lib, "Mswsock.lib")#pragma comment (lib, "AdvApi32.lib")

#define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"

int __cdecl main(int argc, char **argv) {

AutoSeededRandomPool prng;

SecByteBlock key(IDEA::DEFAULT_KEYLENGTH),keyTest(IDEA::DEFAULT_KEYLENGTH);

prng.GenerateBlock(key, key.size());

byte keyB[IDEA::DEFAULT_KEYLENGTH], cipherB[IDEA::DEFAULT_KEYLENGTH];

for (int i = 0; i < IDEA::DEFAULT_KEYLENGTH; i++){

keyB[i] = key[i];}byte iv[IDEA::BLOCKSIZE];prng.GenerateBlock(iv, sizeof(iv));

string keyS, ivS, cipherS;

// Xau ki tu can ma hoastring plain = "Hello World!!!";string cipher, encoded, recovered;char *keyC, *ivC;const char *cipherC;

Page 16: An Ninh Mạng

16

/*********************************\\*********************************/keyC = (char*)&keyB;

ivC = (char*)&iv;

// Pretty print keyencoded.clear();StringSource(key, key.size(), true,

new HexEncoder(new StringSink(keyS)

) // HexEncoder); // StringSource

cout << "key: " << keyS << endl;

encoded.clear();StringSource(iv, sizeof(iv), true,

new HexEncoder(new StringSink(ivS)

) // HexEncoder); // StringSource

/*********************************\\*********************************/

try{

cout << "plain text: " << plain << endl;CBC_Mode< IDEA >::Encryption e;e.SetKeyWithIV(key, key.size(), iv);

// The StreamTransformationFilter adds padding// as required. ECB and CBC Mode must be padded// to the block size of the cipher.StringSource(plain, true,

new StreamTransformationFilter(e,new StringSink(cipher)

) // StreamTransformationFilter ); // StringSourcecipherC = cipher.c_str();

Page 17: An Ninh Mạng

17

}catch(const CryptoPP::Exception& e){

cerr << e.what() << endl;exit(1);

}

/*********************************\\*********************************/

// Pretty printencoded.clear();StringSource(cipher, true,

new HexEncoder(new StringSink(encoded)

) // HexEncoder); // StringSource

/*********************************\\*********************************/

//////////////////////////////////// WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL, *ptr = NULL, hints; char *sendbuf = "this is a test"; char recvbuf[DEFAULT_BUFLEN]; int iResult; int recvbuflen = DEFAULT_BUFLEN; // Validate the parameters

// Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; }

Page 18: An Ninh Mạng

18

ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP;

// Resolve the server address and port iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; }

// Attempt to connect to an address until one succeeds for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

// Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); WSACleanup(); return 1; }

// Connect to server. iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } break; }

freeaddrinfo(result);

if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; }

Page 19: An Ninh Mạng

19

// Send an initial bufferiResult = send( ConnectSocket, keyC, IDEA::DEFAULT_KEYLENGTH,

0 );if (iResult == SOCKET_ERROR) {

printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; }

iResult = send( ConnectSocket, ivC, IDEA::BLOCKSIZE, 0 );if (iResult == SOCKET_ERROR) {

printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; }

iResult = send( ConnectSocket, cipherC, IDEA::DEFAULT_KEYLENGTH, 0 );

if (iResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; }

printf("Bytes Sent: %ld\n", iResult);

// shutdown the connection since no more data will be sent iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; }

// Receive until the peer closes the connection do {

iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); if ( iResult > 0 )

Page 20: An Ninh Mạng

20

printf("Bytes received: %d\n", iResult); else if ( iResult == 0 ) printf("Connection closed\n"); else printf("recv failed with error: %d\n", WSAGetLastError());

} while( iResult > 0 );

// cleanup closesocket(ConnectSocket); WSACleanup();

_getch(); return 0;}

V.2. Server

#undef UNICODE

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"#include <winsock2.h>#include <windows.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>

#include "osrng.h"using CryptoPP::AutoSeededRandomPool;

#include <iostream>using std::cout;using std::cerr;using std::endl;

#include <string>using std::string;

#include <cstdlib>using std::exit;

Page 21: An Ninh Mạng

21

#include "cryptlib.h"using CryptoPP::Exception;

#include "hex.h"using CryptoPP::HexEncoder;using CryptoPP::HexDecoder;

#include "filters.h"using CryptoPP::StringSink;using CryptoPP::StringSource;using CryptoPP::StreamTransformationFilter;

#include "idea.h"using CryptoPP::IDEA;

#include "modes.h"using CryptoPP::CBC_Mode;

#include "secblock.h"using CryptoPP::SecByteBlock;

// Need to link with Ws2_32.lib#pragma comment (lib, "Ws2_32.lib")#pragma comment (lib, "Mswsock.lib")

#define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"

int __cdecl main(void) {

SecByteBlock key(IDEA::DEFAULT_KEYLENGTH);byte iv[IDEA::BLOCKSIZE];byte cipher[IDEA::DEFAULT_KEYLENGTH];char **data;string cipherS;/////////////////////////////////

WSADATA wsaData; int iResult;

SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET;

struct addrinfo *result = NULL; struct addrinfo hints;

Page 22: An Ninh Mạng

22

int iSendResult; char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; }

ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE;

// Resolve the server address and port iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; }

// Create a SOCKET for connecting to server ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }

// Setup the TCP listening socket iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; }

Page 23: An Ninh Mạng

23

freeaddrinfo(result);

iResult = listen(ListenSocket, SOMAXCONN); if (iResult == SOCKET_ERROR) { printf("listen failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }

// Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; }

// No longer need server socket closesocket(ListenSocket);

// Receive until the peer shuts down the connection do {

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); if (iResult > 0) {

// Echo the buffer back to the sender iSendResult = send( ClientSocket, recvbuf, iResult, 0 ); if (iSendResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } printf("Bytes sent: %d\n", iSendResult); } else if (iResult == 0) printf("Connection closing...\n"); else { printf("recv failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket);

Page 24: An Ninh Mạng

24

WSACleanup(); return 1; }

} while (iResult > 0);

for (int i = 0; i < 16; i++){

key[i] = (byte) recvbuf[i];}string keyS;StringSource(key, key.size(), true,

new HexEncoder(new StringSink(keyS)

) // HexEncoder); // StringSourcecout << "key: " << key << endl;

cout << "key: " << keyS << endl;

for (int i = 16;i< 24; i++){

iv[i-16] = (byte) recvbuf[i];}

string ivS;StringSource(iv, sizeof(iv), true,

new HexEncoder(new StringSink(ivS)

) // HexEncoder); // StringSourcecout << "iv: " << iv << endl;cout << "iv: " << ivS << endl;

for (int i = 24; i < 40; i++){

cipher[i-24] = (byte) recvbuf[i];}string encoded;encoded.clear();StringSource(cipher,sizeof(cipher), true,

new HexEncoder(

Page 25: An Ninh Mạng

25

new StringSink(cipherS)) // HexEncoder

); // StringSourcecout << "cipher: " << cipher << endl;cout << "cipher: " << cipherS << endl;

////////////////////////////string recovered;try{

CBC_Mode< IDEA >::Decryption d;d.SetKeyWithIV(key, key.size(), iv);

// The StreamTransformationFilter removes// padding as required.StringSource s(cipher, sizeof(cipher), true,

new StreamTransformationFilter(d,new StringSink(recovered)

) // StreamTransformationFilter); // StringSource

cout << "recovered text: " << recovered << endl;}catch(const CryptoPP::Exception& e){

cerr << e.what() << endl;exit(1);

}

// shutdown the connection since we're done iResult = shutdown(ClientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; }

// cleanup closesocket(ClientSocket); WSACleanup();

_getch();

Page 26: An Ninh Mạng

26

return 0;}

V.3. Thử nghiệm chương trìnhBước 1: Khởi động server

Bước 2: Khởi động client

- Xâu ký tự cần mã hóa có thể thay đổi trong mã nguồn chương trình.

Ở đây ta có xâu ký tự: “Hello World!!!”

Kết quả:

- Client:

- Server:

Page 27: An Ninh Mạng

27