رمزنگاری RSA
کلید عمومی (e, n) و خصوصی (d, n) را از دو عدد اول میسازد، پیام را با توان پیمانهای رمز میکند و دوباره برمیگرداند.
RSA (ریوست، شمیر و ادلمن، ۱۹۷۷) رمزنگاری با کلید عمومی است: هر کسی میتواند با کلید عمومی رمز کند، ولی فقط صاحب کلید خصوصی میتواند رمز را باز کند.
ادامهی توضیح ↓- زمان:
O(log e + log d) multiplications - حافظه:
O(1) - CLRS، بخش ۳۱.۷
- گریمالدی، فصل ۱۴
- جانسونباو، فصل ۵
p = ۶۱ و q = ۵۳؛ n = ۳۲۳۳، φ = ۳۱۲۰، e = ۱۷ و d = ۲۷۵۳. پیام ۶۵ به ۲۷۹۰ رمز میشود و دوباره ۶۵ برمیگردد.
def rsa(p, q, e, message):if not is_prime(p) or not is_prime(q) or p == q:return Nonen = p * qphi = (p - 1) * (q - 1)g, d = inverse(e, phi)if g != 1:return Noneprivate = (d, n)if message >= n:return None# pow(x, k, n) is modular exponentiation by repeated squaring (it has its own page).cipher = pow(message, e, n)back = pow(cipher, d, n)return cipher, backdef is_prime(n):if n < 2:return Falsed = 2while d * d <= n:if n % d == 0:return Falsed = d + 1return Truedef inverse(a, n):# gcd(a, n) and the inverse of a mod n, by the extended Euclidean algorithm.r0, r1 = a, ns0, s1 = 1, 0while r1 != 0:q = r0 // r1r0, r1 = r1, r0 - q * r1s0, s1 = s1, s0 - q * s1return r0, s0 % n
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
Call stack
- rsa()خط 1
توضیح
ایده
RSA (ریوست، شمیر و ادلمن، ۱۹۷۷) رمزنگاری با کلید عمومی است: هر کسی میتواند با کلید عمومی رمز کند، ولی فقط صاحب کلید خصوصی میتواند رمز را باز کند.
ساختن کلیدها
- دو عدد اول
pوqانتخاب کن وn = p·q. φ = (p − 1)(q − 1).eرا طوری انتخاب کن که باφنسبت به هم اول باشد؛dوارونeبه پیمانهیφاست (با اقلیدس توسعهیافته).
کلید عمومی (e, n) و کلید خصوصی (d, n) است.
رمز و رمزگشایی
C = Mᵉ mod n و M = Cᵈ mod n (با توان پیمانهای). چون e·d ≡ 1 (mod φ)، طبق قضیهی اویلر جواب دوباره M میشود.
چرا امن است؟
برای پیدا کردن d باید φ را دانست، یعنی n را به p و q تجزیه کرد. برای عددهای چندصدرقمی هیچ روش سریعی شناخته نشده. عددهای اینجا عمداً کوچکاند تا بشود دنبالشان کرد.