이 필기는 Elgamal Encryption(엘가말 암호화)의 작동 원리와 그것이 본질적으로 Diffie-Hellman(D-H) 키 교환과 얼마나 똑같은지를 증명하는 아주 중요한 내용입니다.
"Very similar to D-H, but w/ reordering of steps."
(Elgamal은 D-H와 매우 비슷하지만, 순서만 살짝 바꾼 것이다.)
엘가말 암호화는 기본적으로 Diffie-Hellman Key Exchange의 순서를 재배치(Reordering)하고 암호화 과정을 추가한 형태입니다.
가장 중요한 장점 (Probabilistic Encryption):
동일한 평문(Plaintext)을 암호화하더라도, 매번 난수 를 다르게 선택하면 생성되는 Ephemeral Key가 달라집니다. 결과적으로 암호문(Ciphertext)이 매번 다르게 생성되는 확률적 암호화(Probabilistic Encryption)가 가능해집니다. 이는 블록 암호의 ECB 모드가 가진 취약점을 극복하고 OFB 모드처럼 패턴을 숨겨주는 강력한 이점입니다.

[상단: 원래의 Diffie-Hellman + 암호화 과정]
보통은 D-H로 공통 키()를 만든 다음, 그 키를 이용해 AES 같은 대칭키 알고리즘으로 메시지 를 암호화()합니다.
하지만 교수님이 노란색 형광펜으로 칠하신 Encryption 부분을 보면, AES를 안 쓰고 그냥 메시지 에 생성된 키 를 곱해버립니다.
[하단: Elgamal 암호화 프로토콜 (D-H의 변형)]
이 과정을 통신 프로토콜로 깔끔하게 정리한 것이 Elgamal입니다.
Bob의 준비 (Key Generation): Bob이 개인키 를 고르고, 공개키 를 만들어 Alice에게 줍니다. (D-H에서 Bob이 를 보내는 것과 똑같습니다.)
Alice의 암호화 준비 (Encryption):

[Bob의 복호화 과정]
Bob은 Alice에게서 를 받았습니다.
Bob은 자신의 개인키 를 알고 있습니다.
Bob은 먼저 에 자신의 개인키 를 승수하여 마스킹 키 을 스스로 복원해냅니다.
그런 다음, 암호문 에 이 마스킹 키의 역원()을 곱해서 평문 를 얻어냅니다.
[증명 전개]
교수님 필기의 식을 하나씩 풀어보면 다음과 같습니다.
암호문 자리에 원래 식()을 대입합니다.
는 Bob의 공개키였으므로 로 바꿔 씁니다.
지수 법칙에 의해 앞의 항은 가 됩니다.
노란색 형광펜으로 칠해진 부분인 와 은 서로 역원 관계이므로 곱하면 이 되어 완벽하게 상쇄됩니다.

결정론적 암호화 (Deterministic) vs 확률론적 암호화 (Probabilistic)
교수님이 가장 강조하시는 엘가말의 핵심 특징입니다. 하단에 빨간펜으로 쓰인 Probabilistic Encryption(확률론적 암호화)이라는 단어는 무조건 외우셔야 합니다.
문제 제기: RSA나 초기 설정이 없는 일반 AES의 경우, 똑같은 평문()을 암호화하면 항상 똑같은 암호문()이 나옵니다 (Deterministic). 해커가 암호문을 보고 "어? 아까 본 패턴이랑 똑같네?" 하고 평문을 유추할 위험이 있습니다.
엘가말의 해결책: 엘가말은 암호화할 때마다 송신자(Alice)가 무작위 난수 를 새로 뽑습니다.
결론 (): 똑같은 메시지()를 두 번 연속으로 보내더라도, 곱해지는 일회용 키()와 마스킹 키()가 매번 달라지기 때문에 완전히 다른 암호문()이 생성됩니다. * 비교: 교수님은 이것이 마치 블록 암호의 OFB mode에서 매번 다른 IV(초기화 벡터)를 써서 패턴을 숨기는 것과 완벽히 같은 원리라고 설명하신 겁니다. (아까 우리가 정리했던 OFB 모드의 장점이 여기서 그대로 쓰이네요!)

그렇다면 1024 bits가 넘는 어마어마한 숫자들을 어떻게 매번 거듭제곱()해서 키를 만들어낼까요?
S-A-M Alg (Square-and-Multiply Algorithm):아무리 지수가 커도 제곱과 곱하기만 반복하면 매우 빠르게 값을 구할 수 있습니다.
하드웨어 최적화: 실제로 나중에 실무에서 암호화 가속기나 컨트롤러를 설계하실 때, 이런 모듈러 거듭제곱 연산들은 S-A-M 알고리즘을 활용해 하드웨어 로직(게이트) 단에서 병렬 처리하도록 최적화합니다. 수학적으로는 복잡해 보여도 회로상으로는 매우 효율적으로 돌아가도록 설계할 수 있습니다.
우측 상단 수식: 부분은, 방금 전 우리가 보았던 복호화 증명 과정에서 역원을 곱해 지수를 상쇄시키는 원리가 실제 숫자를 넣었을 때도 똑같이 작동한다는 것을 보여주는 간단한 예시일 뿐입니다.

Bob이 복호화()를 하려면 마스킹 키의 모듈러 역원인 을 구해야 합니다. 원래 역원을 구하려면 복잡한 EEA (Extended Euclidean Algorithm, 확장 유클리드 호제법)를 써야 하는데, 교수님은 페르마의 소정리(Fermat's Little Theorem)를 이용해 연산을 획기적으로 최적화합니다.
Fermat's Little Theorem: (소수 에 대해, 어떤 수의 승은 무조건 이 됩니다.)
증명 과정:
(여기에 1을 곱해도 값은 같습니다.)
여기서 대신 페르마 소정리 공식인 을 대입합니다.
결론 (왜 이 짓을 했는가?): 역원()을 구하는 어려운 수식이, 단순한 거듭제곱( 승) 수식으로 바뀌었습니다! 즉, 복잡한 EEA 알고리즘을 짤 필요 없이 우리가 앞서 배운 S-A-M (Square-and-Multiply) 알고리즘 하나만 재활용하면 복호화까지 초고속으로 끝낼 수 있다는 뜻입니다. (하드웨어 구현 관점에서 엄청난 이점입니다.)

네트워크를 도청만 하는 해커(Trudy)가 엘가말을 깨려고 시도하는 내용입니다.

앞서 엘가말은 매번 난수 를 뽑아 일회용 키()를 만들기 때문에 안전하다고(Probabilistic Encryption) 했습니다. 그런데 만약 개발자가 귀찮아서 값을 재사용한다면?
상황: 난수 를 재사용하면, 가 똑같이 만들어지고, 결과적으로 마스킹 키 도 동일하게 고정됩니다.
Known Plaintext Attack (알려진 평문 공격):
해커가 수많은 암호문()을 가로채던 중, 우연히 첫 번째 암호문 의 원본 평문이 이라는 사실을 하나 알아냈다고 가정합시다. (예: 이메일 헤더 등 뻔한 데이터)
해커의 계산:해커는 이라는 식을 이용해, 을 계산하여 비밀 마스킹 키 을 통째로 알아내 버립니다.
결과:이제 해커는 다른 모든 암호문()에 알아낸 키의 역원()을 곱해서 모든 평문()을 다 뚫어버릴 수 있습니다. ()
핵심 키워드: "Elgamal에서 Ephemeral key 를 재사용하면 Known Plaintext Attack에 의해 시스템이 완전히 붕괴된다." (이건 우리가 앞서 OFB 모드에서 IV를 재사용했을 때 벌어진 Two-Time Pad 공격과 본질적으로 완벽히 똑같은 치명타입니다!)