1 MÃ HÓA CÔNG KHAI Hӊ MÃ HÓA RSA I. Cơ sӣ Toán Hӑc 1. Đӗng dư Modulo: a, b đӗng dư modulo n nӃu |a-b| là bӝi sӕ cӫa n Tӭc: NӃu chia a cho n; b chia cho n thì nhұn cùng sӕ dư Ký hi͏u: a Ł b ( mod n) Ví dө: 13 Ł 3 (mod 10) vì (13 ± 3) = 10 là bӝi sӕ cӫa 10 Modulo có mӕi quan hӋ vӟi sӕ dư trong phép chia, phép toán tìm sӕ dư đôi khi cũng giӕng như phép toán modulo. Ví dө : 2 = 14 (mod 12) , 2 Ł 14 (mod 12) Nhưng: 38 Ł 14 (mod 12) thì đúng nhưng 38 = 14 (mod 12) lҥi không đúng 2. Nghӏch đҧo Modulo: Sӕ nghӏch đҧo cӫa 10 là 1/10, bӣi vì 10 × 1/10=1. Trong sӕ hӑc modulo thì vҩn đӅ nghӏch đҧo phӭc tҥp hơn. 4 × x Ł 1 mod 7 Phương trình trên tương đương vӟi tìm x và k sao cho 4x = 7k+1 vӟi điӅu kiӋn là cҧ x và k đӅu là sӕ nguyên. Vҩn đӅ chung đһt ra tҥi đây là tìm x sao cho 1 = (a × x) mod n có thӇ viӃt lҥi như sau : a -1 Ł x(mod n ) Sӵ thu nhӓ vҩn đӅ Modulo là rҩt khó giҧi quyӃt. Đôi khi nó là mӝt vҩn đӅ, nhưng đôi khi lҥi không phҧi vұy. Ví dө : nghӏch đҧo cӫa 5 modulo 14 là 3 bӣi 5 × 3 = 15 Ł 1 (mod 14). Sӱ dөng thuұt toán Euclic mӣ rӝng đӇ tính nghӏch đҧo Modulo: Giҧi thuұt sau sӁ tính nghӏch đҧo modulo m cӫa a và chӍ thӵc hiӋn vӟi các sӕ nguyên m>a>0, biӇu diӉn bҵng giã mã: 2 Ví dө: Tìm sӕ nghӏch đҧo (nӃu có) cӫa 30 theo môđun 101 Bưӟc i m a r q y0 y1 y 0 101 30 11 3 0 1 -3 1 30 11 8 2 1 -3 7 2 11 8 3 1 -3 7 -10 3 8 3 2 2 7 -10 27 4 3 2 1 1 -10 27 -37 5 2 1 0 . . . . KӃt quҧ tính toán trong bҧng cho ta 37. Lҩy sӕ đӕi cӫa 37 theo mođun 101 đưӧc 64. Vұy 30 -1 mod 101= 64 Procedure Euclid_Extended (a,m) int, y0=0,y1:=1; While a>0 do { r:= m mod a if r=0 then Break q:= m div a y:= y0-y1*q m:=a a:=r y0:=y1 y1:=y } If a>1 Then Return "A không khҥ nghӍch theo mođun m" else Return " NghӍch đҥo modulo m cөa a là y" 3 3. Giҧi bài toán c=b e mod n vӟi sӕ lӟn: Trong đó e là sӕ mũ lӟn, n là sӕ chia đӇ lҩy dư Ví dө: Tính 4 13 (mod 497) Cách tính đơn thuҫn: 413=67108864 67108864 mod 497 =445 NӃu b và e lӟn thì b e sӁ rҩt lӟn và tính b e mod n sӁ mҩt nhiӅu thӡi gian và tӕn bӝ nhӟ. Có mӝt sӕ cách đӇ giҧi quyӃt vҩn đӅ đó. Trong nӝi dung cӫa tiӇu luұn chúng tôi sӱ dөng giҧi pháp như sau: c Ł (a.b)(mod n) => ((a (mod n)).(b (mod n))) (mod n) Áp dөng công thӭc trên ta có thuұt toán Ví dө: Tính 4 13 (mod 497) c=1 , e¶=0 c Ł (b.c) (mod m) e¶=1 c=(4*1)mod 497=4 mod 497 = 4 e¶=2 c=(4*4)mod 497=16 mod 497 = 16 e¶=3 c=(4*16)mod 497 = 64 mod 497 = 64 « «. « «. e¶=12 c=(4*121)mod 497 = 484 mod 497 = 484 e¶=13 c=(4*484)mod 497 = 1936 mod 497 = 445 II. HӋ mã hóa RSA 1. Mã hóa không đӕi xӭng (Mã hóa khóa công khai) a. Đӏnh nghĩa Thuұt toán mã hóa công khai là thuұt toán đưӧc thiӃt kӃ sao cho khóa mã hóa là khác so vӟi khóa giҧi mã. Mà khóa giҧi mã hóa không thӇ tính toán đưӧc tӯ khóa mã hóa. Khóa mã hóa gӑi là khóa công khai (public key ), khóa giҧi mã đưӧc gӑi là khóa riêng (private key). Input: b,e,m Output: cŁ b e (mod m) 1/ Gán c=1, e¶=0 2/ e¶=e¶+1 3/ c Ł (b.c) (mod m) 4/ NӃu e¶<e quay lҥi bưӟc 2. Ngưӧc lҥi, c là kӃt quҧ cҫn tìm. 4 Hình 6: Mã hóa vӟi khóa mã và giҧi mã khác nhau Đһc trưng nәi bұt cӫa hӋ mã hóa công kha i là cҧ khóa công khai (public key) và bҧn tin mã hóa (ciphertext) đӅu có thӇ gӱi đi trên mӝt kênh thông tin không an toàn 2. Các điӅu kiӋn cӫa mӝt hӋ mã hóa công khai : ViӋc tính toán ra cһp khóa công khai KB và bí mұt kB dӵa trên cơ sӣ các điӅu kiӋn ban đҫu phҧi đưӧc thӵc hiӋn mӝt cách dӉ dàng, nghĩa là thӵc hiӋn trong thӡi gian đa thӭc . Ngưӡi gӱi A có đưӧc khóa công khai cӫa ngưӡi nhұn B và có bҧn tin P cҫn gӱi đi có thӇ dӉ dàng tҥo ra đưӧc bҧn mã C. C =E KB (P) = E B (P) Công viӋc này cũng trong thӡi gian đa thӭc. Ngưӡi nhұn B khi nhұn đưӧc bҧn tin mã hóa C vӟi khóa bí mұt kB thì có thӇ giҧi mã bҧn tin trong thӡi gian đa thӭc P =D kB (C) 3. Thuұt toán mã hóa RSA a. Khái ni͏m h͏ mã hóa RSA Khái niӋm hӋ mұt mã RSA đã đưӧc ra đӡi năm 1976 bӣi các tác giҧ R.RivetsK,A.Shamir , và L.Adleman. Trong hӋ mã hóa RSA các bҧn rõ, các bҧn mã và các khóa (public key và private key) là thuӝc tұp sӕ nguyên ZN ={1,«,N-1}. Trong đó tұp Z N vӟi N =pxq là các sӕ nguyên tӕ khác nhau cùng vӟi phép cӝng, phép nhân mođun N tҥo ra mođun sӕ hӑc N. Khóa mã hóa E KB là cһp sӕ nguyên (N, KB) và khóa giҧi mã D kB là cһp sӕ nguyên (N, kB), các sӕ là rҩt lӟn, sӕ N có thӇ lên tӟi hàng trăm chӳ sӕ Các phương pháp mã hóa và giҧi mã hóa là rҩt dӉ dàng. Công viӋc mã hóa là sӵ biӃn đәi bҧn rõ P (Plaintext) thành bҧn mã C (ciphertext) dӵa trên cһp khóa công khai KB và bҧn rõ P theo công thӭc sau đây C = E KB (P) = P KB (mod N) (1) Công viӋc giҧi mã là sӵ biӃn đәi ngưӧc lҥi bҧn mã C thành bҧn rõ P dӵa trên cһp khóa bí mұt kB , mođun N theo công thӭc sau : P =D kB (C) =C kB (mod N) (2) DӉ thҩy rҵng, bҧn rõ ban đҫu cҫn đưӧc biӃn đәi mӝt cách thích hӧp thành bҧn mã, sau đó đӇ có thӇ tái tҥo lҥi bҧn rõ ba n đҫu tӯ chính bҧn mã đó: P =D kB (E KB (P)) (3) Thay thӃ (1) vào (2) ta có: Bҧn rõ Bҧn mã Giҧi mã Bҧn rõ Khoá mã Khoá giҧi 5 ( P KB ) kB =P (mod N) (4) Ta thҩy N =pxq vӟi p, q là sӕ nguyên tӕ. Trong toán hӑc đã chӭng minh đưӧc rҵng, nӃu N là sӕ nguyên tӕ thì công thӭc (4) sӁ có lӡi giҧi khi và chӍ khi: KB.kB Ł1 (mod * N)(5) Trong đó * N =LCM(p-1, q-1 ). (Lest Common Multiple) là bӝi sӕ chung nhӓ nhҩt . Nói mӝt cách khác, đҫu tiên ngưӡi nhұn B lӵa chӑn mӝt khóa công khai KB mӝt cách ngүu nhiên. Khi đó khóa bí mұt kB đưӧc tính ra bҵng công thӭc (5). ĐiӅu này hoàn toàn tính đưӧc vì khi B biӃt đưӧc cһp sӕ nguyên tӕ (p, q) thì sӁ tính đưӧc * N Hình 7: Sơ đӗ các bưӟc thӵc hiӋn mã hóa theo thuұt toán RSA Ví dө: N=11413=101x113, * (N) =100x112 =11200 =2 6 x5 2 x7. KB phҧi chӑn sao cho không chia hӃt cho 2,5, 7. Chӑn, chҷng hҥn KB =3533 khi đó kB = KB -1 mod11200=6597. Và ta có khóa công khai là (N,KB)=(11413,3533) khóa bí mұt là 6597. Phép lұp mã và giҧi mã là Chӑn p và q Tính N = p x q Tính * N Chӑn khóa K B Chӑn khóa k B C = P KB (mod N) P = C kB (mod N) K B k B Bҧn rõ P Bҧn mã C Bҧn rõ gӕc 6 E KB (P) =P KB (mod N) =P 3533 (mod 11413) D kB (C) =C kB (mod N) =C 6579 (mod 11413) III. Cài đһt thuұt toán RSA : y Chương trình đưӧc viӃt bҵng ngôn ngӳ lұp trình C#, có chӭc năng mô phӓng lҥi toàn bӝ quá trình mã hóa và giҧi mã cӫa thuұt toán RSA. y HiӋn tҥi thuұt toán chӍ cài đһt mã hóa các ký tӵ hoa, không dҩu. Giao diӋn cӫa chương trình Quá trình xӱ lý cӫa chương trình như sau: B1: Nhұp văn bҧn cҫn mã hóa vào ô ³Văn bҧn gӕc´ Ví dͭ : CO SO TOAN B2: Chương trình sӁ chuyӇn đәi văn bҧn đó thành chuӛi sӕ bҵng cách dӵa trên sӕ thӭ tӵ cӫa chӳ cái đó trong bҧng chӳ cái. CO SO TOAN -> 03152719152720150114 B3: Mã hóa chuӛi sӕ dӵa trên Khóa mã và sӕ N 03152719152720150114 -> 64241131545795607113154579471131517289 B4: Giҧi mã dӵa trên Khóa giҧi 64241131545795607113154579471131517289 -> 03152719152720150114 B5: Đưa ra văn bҧn gӕc dӵa trên chuӛi sӕ đưӧc giҧi mã . HӋ mã hóa RSA 1. Mã hóa không đӕi xӭng (Mã hóa khóa công khai) a. Đӏnh nghĩa Thuұt toán mã hóa công khai là thuұt toán đưӧc thiӃt kӃ sao cho khóa mã hóa là khác so vӟi khóa giҧi mã. Mà khóa. so vӟi khóa giҧi mã. Mà khóa giҧi mã hóa không thӇ tính toán đưӧc tӯ khóa mã hóa. Khóa mã hóa gӑi là khóa công khai (public key ), khóa giҧi mã đưӧc gӑi là khóa riêng (private key). . 4 Hình 6: Mã hóa vӟi khóa mã và giҧi mã khác nhau Đһc trưng nәi bұt cӫa hӋ mã hóa công kha i là cҧ khóa công khai (public key) và bҧn tin mã hóa (ciphertext) đӅu có thӇ