Bước 5: Tính nghịch đảo modulo của e trên modulo ->
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:
Tương tự như trên, phase giải mã cũng được biểu diễn thành công thức sau: 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.
import math
from Crypto.Util.number import * #pip install pycryptodomedefkey_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 alsoreturn (n, e), (n, d)
defencrypt(m, pubkey):
n, e = pubkey
returnpow(m, e, n)
defdecrypt(c, privkey):
n, d = privkey
returnpow(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 sao cho ? A.1:
Đầu tiên là tại sao e nằm trong khoảng , dễ dàng thấy rằng ớ. Vậy nếu , ta có . Khi này, hủy bỏ phép modulo, ta có công thức ớ. Phương trình mã hóa sẽ được viết lại thành Như vậy có thể thấy, việc chọn 1 số e > đều sẽ được mod xuống thành 1 số trong khoảng [0, )
Tiếp theo là tại sao lại chọn , đâ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 . Mình sẽ thay đổi các giá trị để giống với câu hỏi của chúng ta trong RSA Nếu lấy phương trình trên xét trên mod , ta có: hay . 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 ? A.2: Ta biết rằng -> . Đồng thời cũng có -> Đến đây, ta sử dụng định lý Euler ->
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.
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 ShowingPossible 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