PublicKey 어셈블리를 사용하여 해당 PrivateKey로 암호화된 문자열을 해독할 수 있나요?
-
13-09-2019 - |
문제
.NET에서 어셈블리 서명에는 공개/개인 키 쌍이 포함됩니다.내가 읽은 내용에서 알 수 있듯이 .NET은 RSA 알고리즘과 개인 키를 사용하여 어셈블리에 서명하고 포함된 공개 키로 확인합니다.
공개 키를 검색하는 방법을 알고 있습니다(Assembly.PublicKey
).해당 키를 사용하여 개인 키로 암호화된 일부 데이터가 포함된 짧은 문자열을 해독할 수 있는지 궁금합니다.
지금까지 읽은 문서(예를 들어) 반대 방향으로만 가능하다는 것을 암시하는 것 같습니다.암호화하려면 공개 키를 사용하고 해독하려면 개인 키를 사용해야 하지만 실제로는 이를 어셈블리에 포함하고 싶지 않습니다.
그냥 문자열에 서명하면 괜찮을 것 같아요.하지만 어떻게?
이걸 어떻게 시작해야 할지 난감하네요.코드 조각을 갖고 있는 사람이 있나요?
또한 작은 문자열의 암호화/서명은 PHP에서 이상적으로 발생합니다. 왜냐하면 저는 그것을 웹 서버로 오프로드하고 싶고 지금까지 우리가 가지고 있는 것은 일반 PHP/MySQL 호스팅 웹사이트뿐이기 때문입니다.
사용 사례:저는 베타 테스터에게 곧 출시할 소프트웨어에 대한 간단한 라이센스 체계를 고안하려고 합니다.소프트웨어는 아마도 프리웨어일 것이기 때문에 우리가 정말로 달성하고자 하는 것은
- 소프트웨어를 설치한 사람이 누구인지 알 수 있습니다(이메일 주소).
- 일정 기간이 지나면 소프트웨어가 만료됩니다. 그 이후에는 사용자가 새 라이센스를 받아야 합니다.
- 양식을 작성하고 열쇠가 포함된 자동 이메일이 도착하기를 기다리는 것만큼 쉽습니다.
- 우리는 이전 버전이 다시 돌아와 우리의 평판을 손상시키거나 우리를 괴롭히는 가능성을 줄이려고 노력하고 있습니다.
튜플(만료 날짜, 지문)을 암호화하고 시작 시 이를 해독할 수 있으면 라이센스 모듈이 쉬워집니다.애플리케이션이 처음 시작되면 사용자에게 이메일 주소, 이름, 조직을 묻는 메시지가 표시됩니다.이 정보는 일부 시스템 정보(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은 그것을해야 할 것보다 더 어려울 수 있습니다 ...
두 방향 모두 공개로 암호화되고 개인 키로 암호화되고 개인 키로 암호화 될 수 있다고 생각합니다. 두 번째는 디지털 서명의 작동 방식입니다.
경고! 이 대답은 잘못되었지만 첨부 된 일련의 의견은 다른 사람들에게 답을 유지하기에 충분한 관심을 생각합니다. 좋아, 그것은 나를 바보처럼 보이게하지만 그것은 나에게 새로운 것이 없다;) 당신이 원하는대로 투표.
공개 키는 다음을 수행 할 수 있습니다.-
- 개인 키로 만 해독 할 수있는 무언가를 암호화합니다.
- 개인 키로 서명 한 것을 인증하십시오
개인 키에 의해 암호화 된 무언가를 해독하는 데 사용할 수 없습니다. 이러한 이유로 공개/개인 키 시스템은 비대칭 시스템이라고합니다.