RSA LSB Oracle Attack

2020년 5월 11일

암호문을 복호화해서 맨 마지막 비트(least significant bit)를 알려주는 RSA Oracle이 주어졌을 때 적용할 수 있는 공격법이다.

RSA의 평문(plaintext)을 pp, 암호문(ciphertext)을 cc라고 놓았을 때, 복호화는 다음과 같이 진행된다:

pcdmodn p \equiv c^d \mod n

c2ec\cdot 2^e를 같은 방식으로 복호화시켜보자.

(c2e)d=cd2ed=cd2kϕ(n)+12cd2pmodn (c \cdot 2^e)^d = c^d \cdot 2^{ed} = c^d \cdot 2^{k\phi(n)+1} \equiv 2 c^d \equiv 2p \mod n

(2kϕ(n)+12modn2^{k\phi(n)+1} \equiv 2 \mod n이 되는 부분은 편의를 위해 생략했다. RSA를 설명한 글의 복호화 증명과 완전히 동일하다.)

즉, RSA Oracle에 c2ec \cdot 2^e를 입력하면 2p2pnn으로 나눈 나머지를 계산하고 맨 마지막 비트를 알려준다. 평문은 nn보다 작다고 가정되므로 두 가지 경우를 고려할 수 있다.

  1. n<2p<2nn < 2p < 2n 2p2pnn으로 나눈 나머지는 2pn2p-n으로, n은 언제나 홀수이기 때문에(짝수이면 n의 두 소수 인수 중 하나는 2로 고정되기 때문에 매우 위험한 RSA이므로 사용되지 않는다!) 2pn2p-n은 홀수이고, LSB는 1이다.
  2. 0<2p<n0 < 2p < n 2p2pnn으로 나눈 나머지가 2p2p이기 떄문에 짝수이므로 LSB가 0이다.

똑같은 방식으로 c4ec \cdot 4^e를 입력하면 4p4pnn으로 나눈 나머지를 계산하고 맨 마지막 비트를 알려준다. 이전 결과에 이어서 총 네 가지 경우로 나눌 수 있다.

  1. n<2p<2nn < 2p < 2n 1-1. 3n<4p<4n3n < 4p < 4n : 4p4pnn으로 나눈 나머지는 4p3n4p-3n으로, LSB가 1이다. 1-2. 2n<4p<3n2n < 4p < 3n : 4p4pnn으로 나눈 나머지는 4p2n4p-2n으로, LSB가 0이다.

  2. 0<2p<n0 < 2p < n 2-1. n<4p<2nn < 4p < 2n : 4p4p를 n으로 나눈 나머지는 4pn4p-n으로, LSB가 1이다. 2-2. 0<4p<n0 < 4p < n : 4p4pnn으로 나눈 나머지는 4p4p로, LSB가 0이다.

이렇게 두 번의 입력으로 가능한 pp의 범위를 1/4로 줄여놓았다. 이런 식으로 계속 반복하여 가능한 pp의 범위를 반씩 좁혀나가면 평문을 얻을 수 있다.

공격 예는 https://github.com/ashutosh1206/Crypton/blob/master/RSA-encryption/Attack-LSBit-Oracle/README.md에 정리되어 있다.