---
# System prepended metadata

title: '**Các loại tấn công RSA**'

---

# **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 !'
        ```
        