# **Các loại tấn công RSA** **Nếu bạn chưa biết gì về RSA, đề nghị quay ra, và tìm hiểu về RSA, hoặc có thể đọc write_ups tại đây https://github.com/trananhnhatviet/CryptoHack/blob/main/RSA/00_RSA_Knowledge_Basic.md** - Trường hợp 1: Nếu như Alice người muốn giao tiếp với nhiều người với cùng 1 nội dung tin nhắn, nhưng Alice lại quá lười để thay đổi hai số nguyên tố p và q, thì đây có thể là 1 cách tấn công của Eve để biết được nội dung tin nhắn - Giả sử, Alice muốn gửi 1 tin nhắn cho Bob và Carl với nội dung: message = b'i love you so much !' - Chuyển sang dạng long sẽ là m = 600167100838453472459358035297984386711465500705 - Alice nhận 2 số e từ Bob và Carl là: e1 = 31 và e2 = 71 và chỉ có 1 số N = 19085995833312192524007220630153244389942263922006889142154298425751808612835625879164268530070480609 - Và Alice sẽ gửi cho Bob và Carl 2 ciphertext: c1=7248000011746393608920764478555324889797098623177063575022710990560749986650254745111540462514063633 c2=11182172287733531215626356979925885819483390539286301041874693701292216053376480402307816910743778627 - Cụ thể sẽ có dạng như thế này:![](https://i.imgur.com/xWfqdFB.png) - Khi đó Eve sẽ có được cả c1, c2, e1, e2, n - Các bước sẽ như sau: + Nếu gcd(e1,e2) = 1 và tồn tại e1*a + e2*b = 1 (tìm a,b bằng thuật toán extended Euclidean) + Khi đó, ![](https://i.imgur.com/9jbVRLB.png) + Ta thấy a = -16 và b = 7, vì a âm nên ta cần phải tìm inverse của c1 với N: c1_inverse = pow(c1,-1,N) + Qua đó, m = ( pow(c1_inverse,a,n) * pow(c2,b,N) ) % N + Chuyển về bytes, ta sẽ được message ban đầu ``` from Crypto.Util.number import * def egcd(a, b): x,y, u,v = 0,1, 1,0 while a != 0: q, remainder = b//a, b%a m, n = x-u*q, y-v*q b,a, x,y, u,v = a,remainder, u,v, m,n gcd = b return gcd, x, y gcd,x,y=egcd(31,71) N = 19085995833312192524007220630153244389942263922006889142154298425751808612835625879164268530070480609 c1=7248000011746393608920764478555324889797098623177063575022710990560749986650254745111540462514063633 c2=11182172287733531215626356979925885819483390539286301041874693701292216053376480402307816910743778627 c1in = pow(c1,-1,N) print(long_to_bytes((pow(c1in,-x,N)*pow(c2,y,N))%N)) #output b'i love you so much !' ```