2013-08-05 2 views
3

개인 RSA 키로 일부 데이터를 암호화 한 다음 공개 키를 사용하여 클라이언트 컴퓨터에서 해독하려고합니다. 내가 아는 한, 이것은 RSA를 사용하는 일반적인 방법입니다. 그러나 지금까지 보았 듯이 .NET Framework의 RSACryptoServiceProvider에는이 문제가 있습니다. RSACryptoServiceProvider에 공용 키와 개인 키를 모두 제공 할 때 해독이 올바르게 작동하지만 공개 키만 제공 할 때는 해독하지 않습니다.공개 키를 사용하여 암호 해독

Error occurred while decoding OAEP padding. 

at System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) 
at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP) 

참고 :

  • 내가 truefOAEP 세트 해독 암호화 /이 경우, 나는 패딩 오류가 발생합니다.
  • 1024 키 크기를 사용하며 암호화하려는 데이터가 65 바이트를 넘지 않습니다.
  • XML에서 내 키를로드합니다.

sth가 누락 되었습니까? 내가 바꿀 수있는 패딩에 대한 설정이 보이지 않습니다.

확실히, 나는

내가 탄력이 성 같은 다른 라이브러리를 시도해야 클라이언트 컴퓨터에 내 개인 키를 ... 보낼 수 없습니다?

내가 this 질문을 찾았지만 명확한 해결책이 없으며 저자에 따르면 그의 최종 해결책은 this article의 코드를 사용하는 것이 었습니다. 그러나 가능하면 .NET Framework의 코드를 사용하는 편이 좋으며 왜 암호 해독이 실패하는지 이해할 수 없습니다.

또한 내 데이터가 너무 길어서 this answer이 적합하지 않다고 생각하지 않습니다.

아마도 SignHash()/VerifyHash()를 사용할 수는 있지만 이미 계산 된 해시가있는 동안 데이터를 암호화하기 전에 데이터에서 해시를 계산한다고 생각하고 암호화해야합니다. SignHash()를 사용하면 내가 사용할 수있는 해싱 알고리즘의 다양성이 제한되므로 피할 것을 권장합니다.

+2

"개인 RSA 키로 일부 데이터를 암호화 한 다음 공개 키를 사용하여 클라이언트 컴퓨터에서 해독하려고합니다." 나는 당신이 그것을 뒤로 잡았다 고 생각합니다. 개인 키로 만 해독 할 수 있지만 공개 키로 암호화 할 수 있습니다. –

+1

@Steven V : 일부 데이터의 원본을 인증하는 데 사용되는 해시에 서명 할 때 (디지털 서명 추가) 서명이 개인 키를 사용하여 암호화 된 암호화 된 해시가 아닙니까? 그것이 내가하고 싶은 일입니다. – NoOne

+0

http://en.wikipedia.org/wiki/Public-key_cryptography "각 사용자에게는 공개 암호화 키와 개인 암호 해독 키의 두 쌍의 암호화 키가 있습니다." – Orch

답변

1

서명 생성에는 3 가지 부분이 있습니다. 먼저 해시가 계산 된 다음 패딩이 추가되고 마지막으로 RSA가 모듈러 지수를 수행합니다 (사물의 속도를 높이기 위해 Chinese Remainder Theorem을 사용하면 도움이 될 수 있음).

서명 생성의 세 부분은 모두 서명 알고리즘의 일부입니다. 시그니처 생성을 세 가지 부분으로 생각하는 것은 잘못입니다. 특히 RSA 서명 생성이 RSA 암호화를 사용한다고 생각하는 것은 잘못입니다. RSA 암호화는 자신의 패딩 메커니즘 인 을 사용하여에 서명하는 데 사용할 수있는 메커니즘과 호환되지 않습니다.

이것은 모두 PKCS # 1 v2.2 표준에서 설명됩니다.

The main mathematical operation in each primitive is exponentiation, as in the encryption and decryption primitives of Section 5.1. RSASP1 and RSAVP1 are the same as RSADP and RSAEP except for the names of their input and output arguments; they are distinguished as they are intended for different purposes.

그래서 심지어 표준은 매우 명시 적으로 본질적으로 같은 수학 연산을 수행하더라도, 다른 기능을 사용합니다.

최종 결과는 단순히이 : 당신이 PKCS # 1 V1.5 호환 서명의 RSACryptoServiceProvider 클래스를 사용해야하거나, 탄력 성 C#을 라이브러리가 새로운 RSA PSS 서명 방식을 사용합니다.미리 계산 된 해시에 대한 서명을 만들려면 SignHash을 사용하십시오. 언급 한대로이 기능은 현재 SHA-1 또는 MD5로 제한되어 있습니다.

관련 문제