RSA

公開鍵暗号方式の一つ。典型的には以下のようなコードが登場する

from Crypto.Util.number import getPrime, isPrime, inverse
import os

def keygen():
    p = getPrime(512)
    q = getPrime(512)
    n = p*q
    e = 65537
    d = inverse(e, (p-1)*(q-1))
    return (n, e), (n, d)

def enc(m, pubkey):
    n, e = pubkey
    c = pow(m, e, n)
    return c
    
def dec(c, privkey):
    n, d = privkey
    m = pow(c, d, n)
    return m

m = int.from_bytes(b"hello", "big")
pubkey, privkey = keygen()
c = enc(m, pubkey)
m2 = dec(c, privkey)
assert m == m2

RSAで一部の値がわかっている時

how to factorize N given d

How to recover cryptographic keys from partial information

https://www.isg.rhul.ac.uk/~sdg/full-tunable-rsa.pdf

n = p2のとき

 \phi(n) = p * (p - 1)

任意の平文に対する暗号化ができるとき、nを求める

 m^e \equiv c \mod n

なので  m^e = c + k*nになる。ここで平文 m_1 m_2を渡すと m_1^e - c_1 = k_1 * n,  m_2^e - c_2 = k_2 * nとなるから

 gcd(m_1^e - c_1, m_2^e - c_2) = n

RSAのパラメータ同士の関係

RSA-CRTの場合も参照

 ed \equiv 1 \mod (p-1)(q-1)

 ed = 1 + k(p-1)(q-1) = 1 + k(N - (p+q) + 1) where  k < e

 \to k \simeq \lceil (ed-1)/N \rceil

 p = gcd((p+q)-(p-q), N)

 2\sqrt{N} \le p + q\le 3 \sqrt{N / 2}