비대칭 암호화에서 암호화와 서명의 차이점은 무엇입니까?


296

일부 데이터 암호화와 일부 데이터 서명 (RSA 사용)의 차이점은 무엇입니까?

단순히 공개-개인 키의 역할을 역전합니까?

예를 들어 개인 키를 사용하여 메시지를 생성하여 보낸 사람 일 수만 있습니다. 메시지를 읽는 데 공개 키를 사용하기를 원하며 누가 메시지를 읽는지 상관하지 않습니다. 특정 정보를 암호화하여 소프트웨어의 제품 키로 사용하고 싶습니다. 나는 이것들을 생성 할 수있는 유일한 사람임을 신경 쓰고 있습니다. 키 서명을 해독 / 읽기 위해 소프트웨어에 공개 키를 포함하고 싶습니다. 키의 데이터를 읽을 수있는 사람은 신경 쓰지 않으며, 데이터를 생성 할 수있는 유일한 사람인지 확인합니다.

이 시나리오에서 서명이 유용합니까?

답변:


440

암호화 할 때 공개 키 를 사용 하여 메시지를 작성 하고 개인 키 를 사용하여 메시지 를 읽습니다.

서명 할 때 개인 키 를 사용 하여 메시지 서명을 작성하고 공개 키 를 사용 하여 실제 인지 확인합니다.

개인 키를 사용하여 메시지를 생성하여 발신자가 될 수 있습니다.

메시지를 읽는 데 공개 키를 사용하고 싶은데 누가 메시지를 읽는지 상관하지 않습니다.

이다 서명 이 개인 키를 사용하여 수행됩니다.

특정 정보를 암호화하여 소프트웨어의 제품 키로 사용하고 싶습니다.

나는 이것들을 생성 할 수있는 유일한 사람임을 신경 쓰고 있습니다.

자신에게만 알면 키를 엉망으로 만들 필요가 없습니다. 임의의 데이터를 생성하여 데이터베이스에 보관할 수 있습니다.

그러나 사람들이 키가 실제로 자신의 키임을 알고 싶다면 임의의 데이터를 생성하고 데이터베이스에 보관하고 키로 서명해야합니다.

키 서명을 해독 / 읽기 위해 소프트웨어에 공개 키를 포함하고 싶습니다.

Verisign 또는 Thawte와 같은 상용 공급자로부터 공개 키 인증서를 구입해야 사람들이 소프트웨어를 위조하지 않고 공개 키를 대체하지 않았는지 확인할 수 있습니다.


7
기술적으로 말하자면 개인 키가 메시지의 서명을 작성하는 데 사용된다고 말할 때 메시지의 해시가 내 개인 키로 암호화되고 있다고 말하는 것입니까?
Andy Ibanez

4
@AndyIbanez : 암호화 된 것 ( 다이제스트 )에는 타임 스탬프와 임의의 소금이 포함될 수도 있지만 그렇습니다.
Quassnoi

7
@Quassnoi 실제로 '개인 키로 서명'이라고 할 때 '암호화'가 아니라 '암호화'를 의미합니다. 대략적으로 말해서 메시지에 서명하는 것은 개인 키를 사용하여 해독하는 것과 동일하며 수신자에서 공개 키를 사용하여 암호화하면 해시가 동일하게되어 비교 될 수 있습니다.
Johnny Willer

5
@JohnnyWiller : 아래에서 언급 한 @slim에서 수학 코어는 암호화 및 암호 해독 기능에서 동일합니다. 그것들은 별개의 기능이 아니며, 같은 기능 f(key, message)이므로f(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi

2
@ 허니 아니에요. 키 페어 생성은 무료입니다. 비용은 다른 사람들이 서명이 실제로 당신의 것이라고 믿는 데 관여합니다. 그렇게하기 위해, 공개 키 자체를 가지고 있습니다. 공개 키는 무료로 생성했으며,이를 위해 돈을 청구하거나 청구하지 않을 수있는 기관에 의해 서명되었습니다.
Quassnoi

143

RSA 암호화에서는 키 페어를 생성 할 때 공개 키로 선택하는 키와 개인 키 중 어느 것이 든 임의적입니다. 하나를 사용하여 암호화하면 다른 하나도 해독 할 수 있습니다. 양방향으로 작동합니다.

따라서 메시지를 사용하여 메시지를 암호화하는 방법을 보는 것은 매우 간단합니다. 수신기의 공개 수신기가 그것을 해독 할 수 있도록 키 개인 키를 누릅니다.

서명은 서명자가 공개 키와 일치하는 개인 키를 가지고 있음을 증명합니다. 이를 위해서는 발신자의 개인 키로 메시지를 암호화 하고 일반 텍스트 버전과 함께 암호화 된 버전을 포함시키는 것으로 충분합니다 . 발신자를 확인하려면 암호화 된 버전의 암호를 해독하고 일반 텍스트와 동일한 지 확인하십시오.

물론 이것은 귀하의 메시지가 비밀이 아님을 의미합니다. 공개 키가 잘 알려져 있으므로 누구나 암호를 해독 할 수 있습니다. 그러나 그렇게 할 때, 암호문의 작성자는 해당 개인 키를 가지고 있음을 증명했습니다.

그러나 이는 일반 텍스트와 암호 텍스트를 함께 전송 크기를 두 배로 늘려야 함을 의미합니다 (서명 확인에 관심이없는 사람들이 메시지를 읽길 원한다고 가정). 대신 일반적으로 일반 텍스트 의 해시 를 만들어서 서명을 만듭니다 . 가짜 해시는 생성 할 수 없으므로 SHA-2와 같은 암호화 해시 알고리즘이 사용됩니다.

그래서:

  • 서명을 생성하려면 일반 텍스트에서 해시를 만들고 개인 키로 암호화 한 다음 일반 텍스트와 함께 서명하십시오.
  • 서명을 확인하려면 일반 텍스트에서 해시를 만들고 발신자의 공개 키로 서명을 해독 한 다음 두 해시가 동일한 지 확인하십시오.

8
@headcode 비대칭 키 에만 적용됩니다. 대칭 키는 쌍으로 제공되지 않습니다.
날씬한

3
실제로 RSA 키에만 적용됩니다. 예를 들어 ECDSA 키를 사용하면 개인 키에서 공개 키를 간단하게 생성 할 수 있으며 개인 키는 스칼라이고 공개 키는 좌표입니다.
David Schwartz

5
PUBLIC 키를 사용하여 메시지를 어떻게 해독 할 수 있습니까? 메시지는 개인 키로 만 해독되지 않습니까?
daremkd

3
이 답변에 상반되는 5 개의 출처 1 , 2 , 3 , 4 , 5
wha7ever

6
어떤 것을 공개 및 비공개로 부르는지는 임의적이지 않습니다. 개인 키에서 공개 키를 생성 할 수 있지만 공개 키에서 개인 키를 생성 할 수는 없습니다. 큰 차이가 아닌가?
그렉 슈미트

23

안전한 통신을 설정하는 데는 두 가지 뚜렷하지만 밀접한 관련 문제가 있습니다

  1. 권한이있는 사람 만 데이터를 해독하고 읽을 수 있도록 데이터를 암호화하십시오.
  2. 발신자의 신원 / 인증을 확인하십시오.

이 두 가지 문제는 공개 키 암호화를 사용하여 우아하게 해결할 수 있습니다.

I. 데이터의 암호화 및 해독

Alice는 아무도 읽을 수없는 메시지를 Bob에게 보내려고합니다.

  • Alice는 Bob의 공개 키로 메시지를 암호화하여 보냅니다.
  • Bob은 메시지를 받고 개인 키를 사용하여 암호를 해독합니다.

A가 B에게 메시지를 보내려면 A는 누구나 공개적으로 사용할 수있는 B의 공개 키를 사용해야하며 A의 공개 키나 개인 키는 여기에 표시되지 않습니다.

메시지를 보내려면 내가 제공 한 공개 키를 알고 사용해야하며, 해당 개인 키에 액세스 할 수있는 유일한 사람이므로 메시지를 해독 할 수 있습니다.

II. 발신자의 신원 확인 (인증)

Alice가 Bob에게 메시지를 다시 보내려고합니다. 데이터 암호화 문제는 위의 방법으로 해결됩니다.

그러나 Alice와 Bob 사이에 앉아서 Bob에게 '앨리스'라고 소개하고 Alice가 보낸 메시지를 전달하는 대신 Bob에게 내 메시지를 보내면 어떻게 될까요? Alice가 보낸 원본 메시지 (Bob의 개인 키에 액세스해야 함)를 해독하고 읽을 수는 없지만 그 사이의 전체 대화를 가로 채고 있습니다.

Bob이 수신하는 메시지가 Alice가 실제로 보낸 것을 확인할 수있는 방법이 있습니까?

  • Alice는 개인 키를 사용하여 메시지에 서명하고 메시지를 보냅니다. 실제로 서명 된 것은 메시지의 해시입니다 (예 : SHA-256 또는 SHA-512).
  • Bob은이를 수신하고 Alice의 공개 키를 사용하여이를 검증합니다. Alice의 공개 키가 메시지를 성공적으로 확인 했으므로 Bob은 메시지가 Alice에 의해 서명되었다고 결론을 내릴 수 있습니다.

1
메시지에 서명 할 때 실제 메시지 자체 또는 암호화 된 메시지에 서명합니까?
FrostyStraw

21

네, 데이터에 서명하는 것은 다른 사람이 가지고 있지 않은 자신 만의 왁스 도장을주는 것입니다. 무결성과 부인 방지 를 달성하기 위해 수행됩니다 . 암호화는 아무도 데이터를 볼 수 없습니다. 기밀 유지 를 위해 수행됩니다 . Wikipedia 참조 http://en.wikipedia.org/wiki/Information_security#Key_concepts

서명은 개인 키를 사용하여 서명 한 메시지의 해시입니다.


16

서명은 공개 키로 확인할 수있는 개인 키로 "해시"를 생성합니다. 텍스트는 일반으로 보내집니다.

암호화는 수신자의 공개 키를 사용하여 데이터를 암호화합니다. 디코딩은 개인 키로 수행됩니다.

따라서 키 사용은 역전되지 않습니다 (그렇지 않으면 개인 키는 더 이상 개인 키가 아닙니다)!


일반적인 비대칭 암호화에서는 개인 키가 아닌 수신자 공개 키를 사용하여 암호화가 수행됩니다.
mmcdole

이 질문은 키 사용 취소되고 개인 키를 손상시키지 않는 RSA에 관한 것입니다 .
David Schwartz

8

공개 키 암호화에서 서명이 사용되는 방법과 이유를 정확하게 설명합니다. 다른 사람이 제공 한 임의의 메시지에 서명 (또는 암호화)하는 것은 매우 위험하므로 키를 손상시킬 수있는 알고리즘에 대한 공격을 허용합니다.


1
SSL을 사용할 때 웹 브라우저가 임의의 데이터를 암호화하지 않습니까?
Ian Warburton

2
@IanWarburton : 그러나 그들은 비대칭 암호화를 사용하지 않습니다. 실제 데이터 전송은 임의로 생성 된 세션 키와 함께 대칭 암호화를 사용합니다.
Michael Borgwardt

1
@IanWarburton : 아니요 . 공격자 가 선택 하지 않기 때문 입니다. 개인 키에 대한 정보를 공개하거나 서명하지 않은 대상에 유효한 서명을 만들 수 있기 때문에 공격자가 직접 제공 한 것을 암호화하거나 서명하는 것이 위험합니다. 후자의 경우는 RSA 작동 방법에 대한 자세한 내역은 여기에 있습니다 : crypto.stackexchange.com/questions/35644/...
마이클 Borgwardt

2
@IanWarburton : RSA에 패딩이 필요한 이유는 선택한 메시지 ( en.wikipedia.org/wiki/…) 만 암호화하지 않는 것입니다. 그러나 실제로는 선택한 입력에 대해 특히 취약한 개인 키 (서명 등)와 관련된 작업입니다.
Michael Borgwardt

1
@IanWarburton 나는 암호 전문가가 아니지만 내가 이해하는 것에서 아무런 문제가 발생하지 않습니다.
Michael Borgwardt

8

서명은 실제로 서명 한 개체의 출처 또는 보증인임을 나타냅니다. 그러나 누구나 객체를 읽을 수 있습니다.

암호화는 해당 개인 키가있는 사용자 만 키를 읽을 수 있지만 서명하지 않으면 암호화 된 개체 뒤에 있다는 보장이 없습니다.


메시지가 내 음모 키로 해독되면 메시지를 보낼 수만있었습니다. (개인 키가 손상되지 않았다고 가정)
Dojo

5

일부 데이터 암호화와 일부 데이터 서명 (RSA 사용)의 차이점은 무엇입니까?

암호화는 메시지의 기밀성을 유지하지만 ( "일부 데이터") 서명하면 서명을 거부 할 수 없습니다. 즉 서명 한 엔터티 만 서명 할 수 있습니다. 기능상의 차이도 있습니다. 읽어.

단순히 공개-개인 키의 역할을 역전합니까?

절대적으로하지. 서명 및 암호 해독에 동일한 개인 키 (또는 확인 및 암호화에 동일한 공용 키 )를 사용하는 것은 혼동해서는 안됩니다. 이것은 수학적 문제가 아니며 (RSA는 여전히 안전해야 함) 키 관리 문제 . 예를 들어, 서명 키는 수명이 짧고 사용하기 전에 더 많은 보호 기능이 있어야합니다.

동일한 메시지의 경우 서명자에게는 발신자 개인 키를 사용하고 암호화에는 수신자에게 신뢰할 수있는 공개 키를 사용해야합니다. 일반적으로 sign-then-encrypt가 사용되며, 그렇지 않으면 상대방이 서명을 자신의 것으로 바꿀 수 있습니다. 마찬가지로 암호 해독을 위해 수신자의 개인 키를 사용하고 확인을 위해 발신자 의 신뢰할 수있는 공개 키를 사용해야합니다 .

또한 서명 생성시 "개인 키로 암호화"를 사용하지 않는다는 것을 이해해야합니다. 모든 RSA 작업이 모듈 식 지수를 기반으로하지만 패딩 체계는 서명 생성과 완전히 다릅니다. 또한 공개 키는 RSA의 모든 실제 사용에서 RSA 개인 키와 완전히 다른 속성을 갖습니다.

예를 들어 개인 키를 사용하여 메시지를 생성하여 보낸 사람 일 수만 있습니다.

그것은 부인 방지 속성이며 서명으로 얻을 수 있습니다.

메시지를 읽는 데 공개 키를 사용하기를 원하며 누가 메시지를 읽는지 상관하지 않습니다.

공개 키는 모두에게 알려진 것으로 간주되어야합니다. 모든 사람이 메시지를 읽도록하려면 단순히 암호화하지 마십시오.

서명은 일반적으로 메시지 내용에 영향을 미치지 않습니다. 메시지는 서명과 별개로 간주됩니다. 공식적으로 그러한 서명은 부록이 메시지 인 "부록이있는 서명"으로 알려져 있습니다. 메시지가 서명보다 더 중요한 것으로 간주되기 때문에 조금 이상한 이름입니다. (일부) 메시지 복구를 제공하는 서명은 거의 없습니다. 더 이상 사용되지 않으며 일반적으로 더 이상 사용되지 않는 것으로 간주됩니다.

CMS와 같은 서명 프로토콜 은 메시지와 서명을 모두 포함 하는 컨테이너 형식 을 배포 할 수 있습니다 . 이 경우 먼저 일반 .zip 아카이브에서 파일 압축을 해제하는 것과 같이 컨테이너에서 여전히 암호화되지 않은 메시지를 가져와야합니다. 따라서 메시지가 보이지 않게 숨길 수 있으며이 경우 직접 사용할 수 없습니다.

특정 정보를 암호화하여 소프트웨어의 제품 키로 사용하고 싶습니다. 나는 이것들을 생성 할 수있는 유일한 사람임을 신경 쓰고 있습니다.

암호화는 기밀성을 유지하는 데 사용됩니다. 과거에는 RSA 서명 생성이 종종 "개인 키를 사용한 암호화"로 생각되었습니다. 그러나 위에서 설명한대로 작업이 상당히 다르며 이후 표준에서는 필연적으로 암호화 및 서명 생성을 시도하고 분리합니다.

키 서명을 해독 / 읽기 위해 소프트웨어에 공개 키를 포함하고 싶습니다. 키의 데이터를 읽을 수있는 사람은 신경 쓰지 않으며, 데이터를 생성 할 수있는 유일한 사람인지 확인합니다.

예,이를 공개 키에 대한 신뢰 설정이라고 합니다. 그러나 프로그램 코드를 보호하는 것은 메시지를 보호하는 것과는 매우 다릅니다. 코드 서명을 수행 할 수 있지만 코드 외부 에서 서명을 확인하는 것이 필요 합니다 . 이를 제공하는 운영 체제가 있습니다.

예를 들어 Microsoft 인증 코드가 있습니다. iStore 및 Android 앱 스토어와 같은 응용 프로그램 저장소는 코드 서명을 사용하거나 사용하지 않을 수 있지만 응용 프로그램이 복제되지 않았거나 저장소 내에서 복제되지 않았다는 약간의 확신을 제공합니다. 암호화가 항상 해결책은 아닙니다.

코드가 전혀 복제 / 변경되지 않도록 하는 것이 훨씬 어렵습니다. 그렇게하면 DRM 영역에 제대로있게됩니다.

이 시나리오에서 서명이 유용합니까?

네 그럼요. 공개 키를 신뢰하는 경우 메시지 만 서명하도록하는 데 도움이 될 수 있습니다. 응용 프로그램 코드 / 통합 공개 키 인증에 도움이 될 수있는 경우 코드 를 실행할 환경에 전적으로 의존합니다.


"과거에 RSA 서명 생성은 종종"개인 키를 사용한 암호화 "로 생각되었습니다. 그러나 위에서 설명한대로 작업이 상당히 다르기 때문에 이후 표준에서는 필연적으로 암호화와 서명 생성을 시도하고 분리합니다." -이것은 분명하지 않습니다. KeyPair는 pk 또는 sk 일 수 있으며 하나는 다른 하나를 암호화하여 해독 할 수 있습니다. 이에 동의하면 서명과 암호화가 의미있는 방식으로 구별된다고 어떻게 주장 할 수 있습니까? 둘 다 암호화 한 다음 다른 키로 만 해독 할 수 있습니다. 서명 기능에 대한 참조를 보았습니다. 관련이 있습니까?
모건

서명 기능에서 알고있는 유일한 차이점은 암호화 전에 메시지를 해싱하는 것입니다.
모건

4

시나리오에서는 비대칭 암호화의 의미로 암호화하지 않습니다. 차라리 "인코딩"이라고합니다.

따라서 데이터를 이진 표현으로 인코딩 한 다음 개인 키로 서명하십시오. 공개 키를 통해 서명을 확인할 수없는 경우 서명 된 데이터가 개인 키로 생성되지 않은 것입니다. (서명되지 않은 데이터가 의미가 없음을 의미하는 "확인")


2

기능적으로 공개 / 개인 키 암호화를 사용하여 수신자 만 메시지를 읽을 수 있도록합니다. 메시지는 수신자의 공개 키를 사용하여 암호화 되고 수신자 의 개인 키를 사용하여 해독 됩니다.

서명하면 수신자가 메시지를 작성했으며 전송 중에 변경되지 않았다는 것을 수신자에게 알리는 데 사용할 수 있습니다. 메시지 서명은 개인 키를 사용하여 수행됩니다. 수신자는 공개 키를 사용하여 메시지가 변경되지 않았 음을 확인할 수 있습니다.

사용 된 알고리즘은 일방 함수와 관련이 있습니다 (예 : wikipedia 참조) . 이러한 알고리즘 중 첫 번째 알고리즘 중 하나는 큰 소수를 사용하지만 그 이후로 더 많은 단방향 함수가 발명되었습니다.

인터넷에서 소개 기사를 찾으려면 '밥', '앨리스'및 '몰 로리'를 검색하십시오.


내 유스 케이스에 대해 언급 할 수 있습니까? 개인 키를 사용하여 암호화하고 공개 키를 사용하여 모든 사람과 모든 사람이 암호를 해독 할 수 있습니다.
mmcdole

1
모든 비대칭 암호화가 소수를 기반으로한다는 것은 사실이 아니며 가장 잘 알려진 예일뿐입니다 (RSA). 타원 곡선 암호화와 같은 다른 방법이 있습니다.
Michael Borgwardt

"메시지는 암호화 된 다음 수신자의 공개 키를 사용하여 암호화됩니다." 그 문장은 의미가 없거나 최소한 추가 설명이 필요합니다. "암호화 된 다음 암호화 된"???
Maarten Bodewes

트렌트를 잊었다! :)
Dojo

1

질문자가 소프트웨어 라이센싱을 위해 솔루션을 사용하려는 내용에서이 질문에 대답하려면 요구 사항은 다음과 같습니다.

  1. 제 3자가 앱을 디 컴파일하여 라이센스 키를 생성 할 수 없음
  2. 소프트웨어 키의 내용은 안전하지 않아도됩니다
  3. 소프트웨어 키는 사람이 읽을 수 없습니다

디지털 서명은 키를 만드는 원시 데이터를 개인 키로 서명하여 사람이 읽을 수는 없지만 리버스 엔지니어링 된 경우 해독 할 수 있으므로이 문제를 해결합니다. 그러나 개인 키는 안전하므로 아무도 귀하의 소프트웨어에 대한 라이센스를 만들 수 없습니다.

숙련 된 사람이 제품의 소프트웨어 잠금 장치를 제거하지 못하게 할 수는 없습니다. 따라서 릴리스 된 각 버전을 해킹해야하는 경우. 그러나 모든 버전에서 공유 할 수있는 제품의 새 키를 생성 할 수 있기를 원하지 않습니다.

Python PyNaCl 문서에는 목적에 적합한 '디지털 서명'의 예가 있습니다. http://pynacl.readthedocs.org/en/latest/signing/

NaCl 프로젝트를 C 예제로

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.