2009-06-29 3 views
4

공개 키의 형식을 변환하는 것과 관련된이 어리석은 문제에 대해 잃어버린 시간을 다른 사람에게 저장하기를 바란다. 아무도 간단한 해결책이나 문제를 안다면 저에게 알려주십시오!PEM 파일에서 공개 키를로드하는 서명을 확인하는 방법?

전자 상거래 시스템에서 사용하고있는 일부 데이터가 서명과 함께 전송됩니다. 또한 나에게 공개 키를 .pem 형식으로 제공합니다.

----- ----- 공개 키를 BEGIN MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe + hkicNP7ROHUssGNtHwiT2Ew HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ + zlM4OUhCCAtSWflB4wC Ka1g88CjFwRw/PB9kwIDAQAB ---- 다음 .PEM 파일은 다음과 같습니다 -END PUBLIC KEY -----

위의 내용을 서명을 확인할 수있는 "RSACryptoServiceProvider"로 바꾸는 마법 코드가 있습니다. 때문에, BouncyCastle 라이브러리를 사용하여 .NET 분명히 (그리고 섬뜩 인증서 파일과 관련된 몇 가지 주요 두통없이 할 수 없습니다) :

var signature = ... //reads from the packet sent by the eCommerce system 
var data = ... //reads from the packet sent by the eCommerce system 
var sha = new SHA1CryptoServiceProvider(); 
byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(data)); 
byte[] bSignature = Convert.FromBase64String(signature); 

///Verify signature, FINALLY: 
var hasValidSig = thingee.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), bSignature); 

답변

1

잠재적 인 문제 : 실제로 서명을 확인하는

RSACryptoServiceProvider thingee; 

using (var reader = File.OpenText(@"c:\pemfile.pem")) 
{ 
    var x = new PemReader(reader); 
    var y = (RsaKeyParameters)x.ReadObject(); 

    thingee = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create(); 
    var pa = new RSAParameters(); 
    pa.Modulus = y.Modulus.ToByteArray(); 
    pa.Exponent = y.Exponent.ToByteArray(); 
    thingee.ImportParameters(pa); 
} 

그리고 코드 : Encoding.ASCII.GetBytes(data)을 사용하면 해시를 얻는 데있어 잘못된 방법 일 수 있습니다. 즉, 에만 높은 비트가 설정되지 않은 해시를 보낼 수 있습니다.

"패킷"에있는 경우 패킷의 원시 데이터를 바이트 배열로 가져와야합니다. 이 텍스트로 표시되는 인 경우 인코딩 된 형식이어야합니다 (예 : 16 진수 또는 64 진수입니다. 해시는 어떻게 생겼습니까?

+0

흠 ... 당신이 옳을 수도 있습니다. 아마 Base 64로 인코딩 된 것 같습니다. 그걸 건배! 불행히도 은행에서 시스템을 생산할 때까지는 실제 테스트를 수행 할 수 없습니다. 따라서 지금은 가짜 서명이 거짓임을 확인했습니다. 일주일 후에 TRUE 서명의 경우를 테스트 할 수 있어야하며 작동하지 않으면 후속 조치를 게시 할 것입니다. 정말 이것을 알아 내려고 4 시간을 낭비했습니다 ... –

관련 문제