113. RSA-PSS (Probabilistic Signature Scheme)

⚠️ 이 문서는 RSA를 '전자서명' 용도로 쓸 때 발생하는 과거 구형 서명 방식(PKCS#1 v1.5)의 취약점을 해결하기 위해, 서명을 할 때마다 난수(Salt)를 주입하여 매번 서명 결과가 다르게 튀어나오게 만드는 현대 전자서명의 최강자이자 국제 표준인 RSA-PSS를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: RSA-PSS(확률적 서명 체계)는 평문 문서의 해시 지문을 뜬 뒤, 그 지문에 **랜덤한 난수(Salt)**를 한 움큼 섞고 특수 패딩을 덧댄 다음 내 개인키($d$)로 암호화하여 서명 도장을 찍는 혁신적인 디지털 서명 규격이다.
  2. 가치: 기존 서명 방식은 똑같은 문서에 100번 서명하면 도장 모양이 100번 다 똑같이 찍히는 '결정론적' 방식이라 해커의 수학적 유추(위조 공격)에 털렸다. PSS는 100번 서명하면 도장 모양이 100번 다 다르게 찍히는 확률적(Probabilistic) 성질을 부여하여 위조를 원천 봉쇄했다.
  3. 융합: TLS 1.3 표준에서 서버가 신분을 증명할 때 필수적으로 융합되는 가장 안전한 서명 알고리즘이며, 방금 배운 암호화 패딩인 'OAEP'의 철학(난수 섞기)을 전자서명(Signature)의 세계로 그대로 이식한 완벽한 형제 기술이다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

디지털 서명(Digital Signature)은 문서가 변조되지 않았음(해시)을 보장하고, 내가 보냈다는 것(개인키 서명)을 부인하지 못하게 하는 보안의 꽃이다.

과거 개발자들은 1GB짜리 문서를 SHA-256 믹서기에 돌려 해시 지문을 뽑고, 그 짧은 해시 지문 앞에 00 01 FF FF... 같은 뻔한 규격 찌꺼기(PKCS#1 v1.5 패딩)를 붙인 뒤 내 RSA 개인키로 암호화($M^d \pmod N$)하여 도장을 쾅 찍었다. 이것은 치명적인 문제를 안고 있었다. 문서가 똑같으면 도장 모양이 항상 똑같았다.

  • 해커의 위조 (Bleichenbacher 서명 위조 공격): 똑같은 도장 모양이 계속 반복되면, 해커는 그 서명 덩어리들을 수집해 이리저리 수학적으로 쪼개고 곱해서(연성, Malleability) 완전히 새로운 가짜 서류에 딱 맞아떨어지는 '위조된 도장'을 만들어 내는 수학적 편법을 찾아냈다.

이 재앙을 막기 위해 1996년 등장한 구원자가 바로 RSA-PSS다. "서명할 때마다 무작위로 소금(Salt)을 쳐서, 똑같은 서류에 서명해도 매번 도장 모양이 다르게 찍히게 만들자!"

📢 섹션 요약 비유: 옛날 인감도장(구형 서명)은 언제 찍어도 모양이 똑같아서 사기꾼이 고무찰흙으로 모양을 그대로 본떠 위조(결정론적 한계)할 수 있었습니다. PSS 서명은 도장을 꾹 누를 때마다 도장 안의 글씨 폰트와 크기가 요리조리 다르게 바뀌어 찍히는(확률적) 스마트 전자 도장이라 위조가 불가능합니다.


Ⅱ. RSA-PSS의 작동 원리: 솔트(Salt)와 MGF의 향연

RSA-PSS는 암호화를 위한 OAEP 패딩과 거의 쌍둥이처럼 닮아 있다. 둘 다 '난수(Random)'를 섞어 비빔밥을 만든다는 철학이 똑같기 때문이다.

PSS 서명 생성 4단계 (Signing)

  1. 원본 해시 뜨기: 원본 파일(10GB 동영상)을 SHA-256으로 돌려 256비트짜리 $mHash$를 만든다.
  2. 솔트(Salt) 난수 섞기 (핵심!): 매번 서명할 때마다 컴퓨터가 새로운 임의의 난수 $Salt$를 뱉어낸다. 그리고 아까 만든 $mHash$와 이 난수 $Salt$를 나란히 이어 붙이고 다시 한번 해시 믹서기에 넣고 돌려 최종 지문 $H$를 뽑아낸다. (이제 이 지문은 난수 때문에 매번 모양이 바뀐다!)
  3. MGF 마스킹 (섞기): 이 최종 지문 $H$를 MGF(마스크 생성 함수)에 넣고 부풀린 뒤, 아까 썼던 $Salt$ 덩어리와 마구잡이로 XOR ⊕ 연산하여 형체를 알아볼 수 없게 섞어버린다 (패딩 완료).
  4. 개인키 서명 ($d$ 승): 이렇게 엉망으로 섞인 패딩 덩어리를 나의 RSA 개인키($d$)로 서명($^d \pmod N$)하면, 매번 완전히 다르게 생긴 궁극의 PSS 서명이 탄생한다.
┌───────────────────────────────────────────────────────────────────────────────┐
│           RSA-PSS (확률적 전자서명)의 샌드위치 구조 시각화                    │
├───────────────────────────────────────────────────────────────────────────────┤
│                                                                               │
│ [ 준비물 ] 원본 파일 해시 (mHash), 무작위 난수 (Salt)                         │
│                                                                               │
│ [ PSS 믹서기 내부 ]                                                           │
│                                                                               │
│  (1) mHash  +  Salt ───▶ [ 해시 함수 (SHA) ] ───▶ 최종 지문(H)                │
│                                                     │                         │
│             ┌───────────────────────────────────────┘                         │
│             ▼                                                                 │
│  (2) [ 마스크 함수 (MGF) ]                                                    │
│             │                                                                 │
│             ▼                                                                 │
│          ( XOR ⊕ ) ◀────── ( 원래의 Salt 덩어리 )                             │
│             │                                                                 │
│             ▼                                                                 │
│      [ 마스킹된 더미 데이터 ]    +    [ 최종 지문(H) ]                        │
│             └────────────────┬────────────────┘                               │
│                              ▼                                                │
│      [ 최종적으로 이 덩어리를 밥의 개인키(d)로 암호화하여 도장 쾅! ]          │
│                                                                               │
│ ★ 위조 방어의 핵심: 해커가 수조 원짜리 슈퍼컴퓨터로 이 도장을 위조하려 해도,  │
│   안에 어떤 Salt(난수)가 섞여 들어갔는지 역산할 방법이 없어 100% 막힘!        │
└───────────────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 수신자(검증자)는 이 서명이 진짜인지 어떻게 알까? 수신자는 밥의 공개키($e$)로 이 도장을 열어서 껍데기를 벗긴다. 그러면 안에 숨어있던 최종 지문(H)마스킹된 덩어리가 튀어나온다. 수신자는 MGF 함수를 돌려 마스킹을 벗겨내어 안에 숨어있던 진짜 $Salt$를 역으로 끄집어낸다. 그리고 자기가 직접 받은 원본 파일의 해시와 이 $Salt$를 섞어서 해시를 돌려보고, 그 결과가 껍데기에서 본 최종 지문(H)과 똑같으면 "이 도장 진짜 밥이 쾅 찍은 거 맞네!" 하고 100% 확신하게 된다. (수학의 대칭성 마법)

  • 📢 섹션 요약 비유: PSS 서명은 도장을 찍기 전에 매번 다른 무작위 '투명 잉크(Salt)'를 바르고 찍는 겁니다. 도장 모양은 매번 번지면서 다르게 찍히지만, 감식반(수신자)이 특수 손전등(공개키)을 비춰보면 그 투명 잉크가 섞여 만들어진 무늬가 원래 문서와 완벽하게 일치한다는 것을 알아낼 수 있는 초첨단 위조 방지 기술입니다.

Ⅲ. 실무 적용 및 강제 표준화 (TLS 1.3)

"아직도 구형 PKCS#1 v1.5 서명을 쓰고 계십니까? 당장 바꾸십시오." 보안 업계에서 PSS로의 전환은 암호화에서 OAEP로 전환하는 것만큼이나 시급하고 중대한 과제였다.

  1. TLS 1.3 서버 인증서의 의무화
    • 2018년 제정된 TLS 1.3 규격에서는 서버가 "나 네이버 진짜 맞어!"라고 신분증(인증서)을 보낼 때, 서명 알고리즘으로 더 이상 취약한 구형(v1.5) 방식을 쓸 수 없게 막아버렸다.
    • 무조건 rsa_pss_rsae_sha256 와 같이 PSS 구조가 강제된 인증서 서명만 받아들이도록 인터넷 생태계의 법을 뜯어고쳤다.
  2. 전자서명법과 공인인증서 (PKI)
    • 대한민국의 공인인증서(공동인증서) 모듈이나 FIDO 기반의 스마트폰 생체인증(지문 결제)을 처리하는 백엔드 서버 모듈에서도, 서명 생성 및 검증 코어 알고리즘은 모두 이 RSA-PSS 또는 타원곡선 기반의 ECDSA를 사용하도록 전면 교체되었다.

Ⅳ. 결론

"완벽한 예측 불가능성(Randomness)만이 완벽한 신뢰를 담보한다." RSA-PSS는 '전자서명은 똑같은 문서면 도장도 똑같아야 한다'는 고정관념을 파괴하고, '확률론적 서명(Probabilistic Signature)'이라는 신세계를 열었다. 서명에 난수(Salt)를 치는 이 우아한 수학적 타협 덕분에, 해커는 서명된 데이터를 아무리 많이 모아도 패턴을 분석할 수 없게 되었고, RSA는 양자 컴퓨터가 도래하기 전까지 전자상거래와 신원 인증 체계(PKI)의 제왕으로 그 수명을 온전히 누릴 수 있게 되었다.


📌 관련 개념 맵

  • 전체 분류: 비대칭키 암호 기반 전자서명 (Digital Signature)
  • 대비 개념 (폐기 대상): PKCS#1 v1.5 (결정론적 구형 서명, 위조에 취약)
  • 영혼의 짝꿍 (형제 기술): RSA-OAEP (암호화를 위한 확률적 패딩 기술)
  • 핵심 무기 (방어 원리): Salt (난수 주입), MGF (마스크 생성 함수로 데이터 뒤섞기)

👶 어린이를 위한 3줄 비유 설명

  1. 내가 쓴 숙제에 "내가 진짜로 풀었음!" 하고 도장을 찍을 때, 옛날엔 매일 똑같은 토끼 도장을 찍었어요.
  2. 그랬더니 나쁜 친구가 지우개로 그 토끼 도장을 모양 그대로 본떠서 자기 숙제에 찍는(서명 위조) 나쁜 장난을 쳤죠.
  3. RSA-PSS는 도장을 꾹 누를 때마다 컴퓨터 주사위(난수)가 굴러가서 토끼가 웃기도 하고 찡그리기도 하는 매번 다르게 찍히는 마법 도장이에요! 모양은 매번 다르지만 선생님(공개키)은 신기하게 "이거 철수가 찍은 진짜 도장 맞네!" 하고 100% 알아볼 수 있답니다.