RSA Training

  • Bài viết này sẽ giới thiệu cho các bạn về những kiến thức basic nhất mà các bạn cần nắm được khi đụng vào RSA.

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

khả năng cao ảnh này sẽ lặp lại vào section ecc training 😅

Pre requisites

How it works

  • RSA được chia ra làm 3 phase chính:

    • Sinh khóa (Key generation)
    • Mã hóa (Encrypt)
    • Giải mã (Decrypt)
  • Trước tiên là phase sinh khóa:

    • Bước 1: Ta chọn 2 số nguyên tố p và q.
    • Bước 2: Tính n = p*q.
    • Bước 3: Tính phi hàm Euler của n
      ->
      ϕ(n)=lcm(ϕ(p),ϕ(q))=lcm(p1,q1)
    • Bước 4: Chọn 1 số e trong khoảng
      (1,ϕ(n))
      sao cho
      gcd(e,ϕ(n))=1
    • Bước 5: Tính nghịch đảo modulo của e trên modulo
      ϕ(n)

      ->
      de1 (mod ϕ(n))
    • Khi này, cặp số (n, e) là public key và cặp số (n, d) là private key.
  • Tiếp theo là phase mã hóa có thể được biểu diễn ngắn gọn bằng công thức sau:

    cme (mod n)

  • Tương tự như trên, phase giải mã cũng được biểu diễn thành công thức sau:

    mcd (mod n)trong đó, m chính là bản rõ (plaintext), c là bản mã (ciphertext), e là số mũ công khai (public exponent), d là số mũ bí mật (secret exponent) và n là modulo.

ex.py

import math from Crypto.Util.number import * #pip install pycryptodome def key_gen(bits): p, q = getPrime(bits), getPrime(bits) n = p*q phi = math.lcm(p-1, q-1) #phi = (p-1)*(q-1) works also e = 65537 d = inverse(e, phi) #d = pow(e, -1, phi) works also return (n, e), (n, d) def encrypt(m, pubkey): n, e = pubkey return pow(m, e, n) def decrypt(c, privkey): n, d = privkey return pow(c, d, n)

Explaination

  • Sau khi đã trình bày 1 loạt công thức, ta cùng đi chứng minh các công thức đó để hiểu rõ hơn bản chất của RSA.

Q.1: Tại sao lại chọn e trong khoảng

(1,ϕ(n)) sao cho
gcd(e,ϕ(n))=1
?
A.1:

  • Đầu tiên là tại sao e nằm trong khoảng
    (1,ϕ(n))
    , dễ dàng thấy rằng
    ee (mod ϕ(n)) vi e<ϕ(n)
    . Vậy nếu
    e>ϕ(n)
    , ta có
    ee (mod ϕ(n))
    .
    Khi này, hủy bỏ phép modulo, ta có công thức
    e=e+kϕ(n) vi kZ
    .
    Phương trình mã hóa sẽ được viết lại thành
    cme (mod n)=me+kϕ(n) (mod n)=memkϕ(n) (mod n)=me1k (mod n)
    Như vậy có thể thấy, việc chọn 1 số e >
    ϕ(n)
    đều sẽ được mod xuống thành 1 số trong khoảng [0,
    ϕ(n)
    )
  • Tiếp theo là tại sao lại chọn
    gcd(e,ϕ(n))=1
    , đây chính là điều kiện để tồn tại số mũ bí mật d, nếu bạn đã biết về kiến thức nghịch đảo modulo hẳn bạn sẽ nhìn ra. Cụ thể;
    Để tính nghịch đảo modulo, ta sẽ cần sử dụng thuật toán Euclid mở rộng (Extended Euclid), Euclid mở rộng được phát biểu rằng ta sẽ tìm được a, b trong phương trình
    ax+by=gcd(x,y)
    .
    Mình sẽ thay đổi các giá trị để giống với câu hỏi của chúng ta trong RSA
    ae+bϕ(n)=gcd(e,ϕ(n))

    Nếu lấy phương trình trên xét trên mod
    ϕ(n)
    , ta có:
    ae1 (mod ϕ(n))
    hay
    ae1 (mod ϕ(n))
    . Vậy nên, theo định nghĩa nghịch đảo modulo, ta kết luận a chính là nghịch đảo modulo của e, (trường hợp của chúng ta thì a = d).

Q.2: Tại sao để giải mã ta lại lấy

mcd (mod n)?
A.2: Ta biết rằng
de1 (mod ϕ(n))
->
ed1 (mod ϕ(n))
. Đồng thời cũng có
cme (mod n)
->
cdmed (mod n)

Đến đây, ta sử dụng định lý Euler ->
medm1+kϕ(n) (mod n)m1k (mod n)

Q.3: Độ khó của bài toán RSA phụ thuộc vào thứ gì?
A.3: Độ khó của RSA phụ thuộc hoàn toàn vào việc bạn có khả năng phân tích modulo n ra thành tích các thừa số nguyên tố hay không.
decrypt(c) <- known d <- known phi(n) <- known p, q

  • Về cơ bản, ta đã đi qua hết mọi phần basic trong hệ mã RSA. Nếu bạn có thắc mắc về bất cứ điều gì liên quan đến RSA, bạn có thể hỏi 1 trong các trainer hoặc liên hệ với mình qua discord tranminhprvt01

Extra information

  • Khi cài đặt trong thực tế, đa số đều áp dụng định lý đồng dư Trung Hoa (Chinese Remainder Theorem) vào hệ mã RSA, mục đích là tăng tốc độ tính toán lên vì các modulo chính là p, q chứ không còn là p*q. Các bạn có thể tìm hiểu thêm với keyword là RSA CRT.
  • Khi nói về chữ kí số áp dụng hệ mã RSA (RSA signature), ý tưởng cũng chỉ đơn giản là RSA, nhưng thay bản mã m thành giá trị băm của nó hash(m), cũng như sử dụng số mũ bí mật d để kí, và số mũ công khai e để xác thực.

Resources & Tools

Practice & Homework

  • Các bạn làm các bài tập sau trong Cryptohack:
set 1:
RSA Starter 1 - 5

set 2:
factoring
inferius prime
monoprime
square eyes
manyprimes
salty
modulus inutlilis

set 3:
Endless Email
infinite descent
everythings is big
cross wired
  • Deadline trước buổi training sau; hình thức nộp bài: link account của các bạn trong Cryptohack kèm 1 file giải thích cách làm của các bài đã nói trên, gửi cho mình thông qua discord tranminhprvt01.
  • Ngoài ra, các bạn có thể luyện thêm RSA ở các platform khác như Dreamhack, cũng như thực chiến trong CTF.
  • Cuối cùng, nếu gặp bất kì khó khăn gì, trong việc hiểu bài blog này, hoặc trong việc giải bài tập, các bạn có thể hỏi 1 trong các trainer hoặc liên hệ với mình qua discord tranminhprvt01 .

The end.

  • Vì 1 vài lí do kĩ thuật nên bài viết này đã được speedrun trong 2h, nên nếu có xuất hiện bất cứ vấn đề nào, mong các bạn thông cảm và feedback lại với mình.

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →