PublicKey 어셈블리를 사용하여 해당 PrivateKey로 암호화된 문자열을 해독할 수 있나요?

StackOverflow https://stackoverflow.com/questions/1847357

문제

.NET에서 어셈블리 서명에는 공개/개인 키 쌍이 포함됩니다.내가 읽은 내용에서 알 수 있듯이 .NET은 RSA 알고리즘과 개인 키를 사용하여 어셈블리에 서명하고 포함된 공개 키로 확인합니다.

공개 키를 검색하는 방법을 알고 있습니다(Assembly.PublicKey).해당 키를 사용하여 개인 키로 암호화된 일부 데이터가 포함된 짧은 문자열을 해독할 수 있는지 궁금합니다.

지금까지 읽은 문서(예를 들어) 반대 방향으로만 가능하다는 것을 암시하는 것 같습니다.암호화하려면 공개 키를 사용하고 해독하려면 개인 키를 사용해야 하지만 실제로는 이를 어셈블리에 포함하고 싶지 않습니다.

그냥 문자열에 서명하면 괜찮을 것 같아요.하지만 어떻게?

이걸 어떻게 시작해야 할지 난감하네요.코드 조각을 갖고 있는 사람이 있나요?

또한 작은 문자열의 암호화/서명은 PHP에서 이상적으로 발생합니다. 왜냐하면 저는 그것을 웹 서버로 오프로드하고 싶고 지금까지 우리가 가지고 있는 것은 일반 PHP/MySQL 호스팅 웹사이트뿐이기 때문입니다.

사용 사례:저는 베타 테스터에게 곧 출시할 소프트웨어에 대한 간단한 라이센스 체계를 고안하려고 합니다.소프트웨어는 아마도 프리웨어일 것이기 때문에 우리가 정말로 달성하고자 하는 것은

  1. 소프트웨어를 설치한 사람이 누구인지 알 수 있습니다(이메일 주소).
  2. 일정 기간이 지나면 소프트웨어가 만료됩니다. 그 이후에는 사용자가 새 라이센스를 받아야 합니다.
    • 양식을 작성하고 열쇠가 포함된 자동 이메일이 도착하기를 기다리는 것만큼 쉽습니다.
    • 우리는 이전 버전이 다시 돌아와 우리의 평판을 손상시키거나 우리를 괴롭히는 가능성을 줄이려고 노력하고 있습니다.

튜플(만료 날짜, 지문)을 암호화하고 시작 시 이를 해독할 수 있으면 라이센스 모듈이 쉬워집니다.애플리케이션이 처음 시작되면 사용자에게 이메일 주소, 이름, 조직을 묻는 메시지가 표시됩니다.이 정보는 일부 시스템 정보(NIC, 컴퓨터 이름, 어셈블리 주요 버전 및 부 버전)의 md5 지문과 함께 웹 서버에 게시됩니다.웹 서버는 디스크에 저장되는 암호화된 버전의 튜플(만료 날짜, 지문)을 사용하여 이메일(이메일 주소의 유효성 확인)로 응답합니다.시작 시 이를 복호화하고 현재 날짜 및 재생성된 지문과 비교할 수 있습니다.

편집하다:알겠습니다. 아직 제 질문에 대한 모든 답을 얻지는 못했습니다.그러나 .NET에서는 암호화에 개인 키를 사용하는 것이 쉽지 않은 것 같습니다. 가능하다면 답변은 이에 동의하지 않습니다.

내가 취할 경로는 다음과 같습니다(내 사용 사례에 따라).

  • 개인 키를 사용하여 라이센스에 서명하겠습니다.
  • 공개 키를 사용하여 라이선스가 개인 키로 서명되었는지 확인하겠습니다.
  • .NET 키를 사용하는 방법에 대해 PHP 개발자를 대상으로 한 또 다른 질문을 게시하겠습니다(제작: sn.exe) 텍스트에 서명하기 위해
  • 어쨌든 라이센스는 해시이고 사용자가 이미 알고 있는 내용으로 계산되기 때문에 사용자가 라이센스를 보는 것에 대해 크게 걱정하지 않습니다.내가 원하는 것은 일반적인 건물 건축가가 내가 모르는 사이에 내 소프트웨어를 복사하는 것을 너무 어렵게 만드는 것입니다. 소프트웨어는 프리웨어입니다. 내가 원하는 것은 누가 설치했는지에 대한 종이 추적뿐입니다... )

귀하의 답변에 진심으로 감사드립니다.

도움이 되었습니까?

해결책

.NET가 아닙니다.

RSA와 같은 많은 전통적인 공공 키 암호화 알고리즘에서, 당신은 두 가지 방법으로 두 가지 방법을 암호화하고 암호화 할 수 있습니다. 일반적으로 한 가지 방법은 "암호화"와 다른 "서명"이라고 불릴 수 있습니다.

그러나 .NET에서 RSA 구현은 무너졌으며, 서명시 전체 처리 된 정보가 아니라 입력의 다이제스트 만 생성됩니다.

RSA로 할 수 있고 할 수없는 일에 대한 의견 불일치가있는 것 같으므로 내 답변을보다 구체적으로 편집하겠습니다.

특정 RSA 구현이 아니라 RSA 수학에 대해 이야기하고 있습니다.

RSA Math를 사용하면 두 키 중 하나 (개인 또는 공개) 중 하나를 인코딩 할 수 있으며 인코딩 된 데이터는 두 키의 다른 키로 만 해독 될 수 있습니다.

일반적으로 공개 키를 인코딩하고 정보를 암호화하고 개인 키로 디코딩하여 정보를 해독합니다. 또는 정보의 해시를 취하고 개인 키로 인코딩하고 해시에 서명 한 후 서명을 비교하고 확인하기 위해 공개 키로 해시를 해독합니다.

일반적인 구현은 데이터를 해싱하는 것만으로만 개인에서 공개로 데이터를 전체 인코딩 할 수는 없지만 RSA의 수학은 이것을 완전히 허용합니다.

다른 팁

공개 키를 사용하여 해독 할 수 없습니다. 그렇게하면 "공개"의 요점은 사라질 것입니다.

(그러나 개인 키를 사용하여 무언가에 서명 한 다음 공개 키를 사용하여 서명을 확인할 수 있습니다. 프레임 워크가 키를 사용하는 것입니다. 어셈블리가 서명되고 공개 키는 서명을 확인하는 데 사용됩니다. )

이는 SignedXml을 사용하여 수행할 수 있습니다. http://msdn.microsoft.com/en-us/library/ms229745.aspx.낮은 수준에서는 RSAPKCS1SignatureDeformatter 및 RSAPKCS1SignatureFormatter를 사용할 수 있습니다.이는 데이터의 해시를 암호화한 다음 데이터를 다른 쪽 끝의 (암호 해독된) 해시와 비교하는 방식으로 작동합니다.개인 키 암호화는 작은 데이터만 처리할 수 있기 때문에 해싱을 사용한다고 생각합니다.어셈블리 공개 키를 재사용하는 방법이 확실하지 않습니다. 문제가 발생하는 경우 별도의 키 쌍을 사용하세요.

주의할 점은 이 수업으로 인해 20초 동안 전화가 끊길 수 있으므로 이것을 확인하세요! http://www.pcreview.co.uk/forums/thread-3428177.php

이 접근 방식은 Reflexil을 사용하여 서명 확인 코드가 변조되는 데 취약하지만 이는 또 다른 문제입니다.

나는 다음을 썼지만 다시 읽으니 이미 이것을 얻은 것 같습니다.실제로 사용자의 데이터를 암호화하거나 숨기려는 것이 아니라 사용자가 라이선스를 생성하거나 변조하는 것을 막고 싶을 것입니다.이를 위해 공개 개인 키 암호화 알고리즘을 사용할 수 있다는 것이 맞습니다.이것은 다음과 같이 알려져 있습니다. 서명 개인 키 사용(서버 측 라이센스 생성)그리고 공개 키를 사용하여 서명을 확인합니다(앱에서 라이선스 확인).나는 연구에 도움이 될 것이기 때문에 이 용어를 언급합니다.

RSA에서 공개 키는 암호화에 사용되며 개인 키는 암호 해독에 사용됩니다. 공개 키를 사용하여 아무것도 해독 할 수 없습니다 ...

RSA에서 공개 키와 개인 키의 유일한 차이는 비밀을 지키는 것입니다.

따라서 공개 키를 암호화 키로 사용하고 개인 키와 해독하거나 개인 키를 암호화 키로 사용하고 공개 키와 해독 할 수 있습니다.

개인 키와 암호화는 디지털 서명에 사용됩니다 (누구나 공개 키로 해독 할 수 있음).

그러나 @lasse v. karlsen이 지적했듯이 .NET은 그것을해야 할 것보다 더 어려울 수 있습니다 ...

두 방향 모두 공개로 암호화되고 개인 키로 암호화되고 개인 키로 암호화 될 수 있다고 생각합니다. 두 번째는 디지털 서명의 작동 방식입니다.

경고! 이 대답은 잘못되었지만 첨부 된 일련의 의견은 다른 사람들에게 답을 유지하기에 충분한 관심을 생각합니다. 좋아, 그것은 나를 바보처럼 보이게하지만 그것은 나에게 새로운 것이 없다;) 당신이 원하는대로 투표.

공개 키는 다음을 수행 할 수 있습니다.-

  • 개인 키로 만 해독 할 수있는 무언가를 암호화합니다.
  • 개인 키로 서명 한 것을 인증하십시오

개인 키에 의해 암호화 된 무언가를 해독하는 데 사용할 수 없습니다. 이러한 이유로 공개/개인 키 시스템은 비대칭 시스템이라고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top