2011-01-14 5 views
2

PIV 준수 스마트 카드에서 활성 카드 인증을 수행하려고합니다. 자세한 내용은 부록 A.2 (this document)를 참조하십시오.. NET에서 PKCS # 1 v1.5로 데이터를 인코딩하는 방법

관련 X.509 인증서의 공개 키가 있습니다. 카드에 임의의 데이터를 보내야합니다.이 데이터는 개인 키로 서명 한 다음 공개 키로 서명을 확인해야합니다.

내가 서명 한 문서의 예는 서명하기 위해 보내는 데이터가 "PKCS # 1 v1.5 서명 채우기 스키마에 따라 인코딩 됨"이라는 것을 나타냅니다. 그런 임의의 데이터를 어떻게 인코딩합니까? 데이터 패딩은 RSA 서명 프로세스의 일부라고 생각했습니다.

// Generate random data 
byte[] randomData = new byte[128]; 
Random random = new Random(); 
random.NextBytes(randomData); 

// Hash the random data 
SHA1Managed sha1 = new SHA1Managed(); 
byte[] hash = sha1.ComputeHash(randomData); 

// Send the hash to the Smart Card and get back signed data 
byte[] signature = SendToSmartCardForSignature(hash); 

// Verify the data and the signature match using the public key 
RSACryptoServiceProvider rsa = smartCardCertificate.PublicKey; 
bool verified = rsa.VerifyData(randomData, CryptoConfig.MapNameToOID("SHA1"), signature); 

// verified is false...why? 

답변

2

.NET 암호화 기능을 사용하여이를 수행하는 "올바른 방법"은 System.Security.Cryptography.RSA의 자체 구현을 구현하는 것입니다. DecryptValue -method는 스마트 카드 "원시"RSA 개인 키 암호화 방법을 호출해야합니다. 또한 KeySize 속성을 재정의해야합니다.

그런 다음 RSAPKCS1SignatureFormatter을 사용하여 데이터를 채우고 스마트 카드를 호출 할 수 있습니다.

+0

굉장합니다. 나는 그것을 작동 시키지만 약간의 혼란이있다. 나는 이것을 정리하기 위해 이것을 구현하려고 노력할 것이다. 감사. – Ben

1

섹션 9.2 - EMSA-PKCS1-v1_5의 this document의 인코딩 방법을 설명한다.

나를 위해 .NET 라이브러리에서 공개 할만한 것을 찾을 수 없으므로 수동으로 처리했습니다. 매우 쉽습니다.

원본 코드 예제에서와 같이 데이터를 해시합니다.

  1. 인코딩 형식 DigestInfo의 ASN.1 값에 데이터를 해시 -를 차지 문서가 실제로 그래서 당신은 그것을 알아낼 필요가 없습니다이 필요한 바이트 배열을 제공합니다. SHA1을 사용 했으므로 인덱스 0에있는 해시 된 데이터 바이트 배열에 다음 바이트 배열을 삽입해야했습니다. (0x) 30 21 30 09 06 05 05e 03 02 1a 05 00 04 14

  2. PKCS # 1 v1.5로 인코딩 된 바이트 배열은 {0x00, 0x01, PS, 0x00, T}입니다. 여기서 T는 첫 번째 단계의 DigestInfo 바이트 배열이고 PS는 0xFF의 바이트 배열입니다. 배열 PS의 길이는 당신에게 달려 있습니다. 필자의 경우,이 배열은 RSA-2048 개인 키에 의해 서명 될 것이므로 어레이의 길이는 0x100이 될 필요가 있었으므로 PS를 그 목표에 도달 할만큼 길게 만들었습니다.

인코딩 된 바이트 배열을 스마트 카드에 보내 서명합니다. 스마트 카드는 개인 키로 실제 RSA 작업을 수행하고 결과를 반환합니다. .NET VerifyData 함수는 true를 반환합니다.

+0

죄송합니다. 도와주세요. 2048 비트의 rsa 키가 있다고 했으므로 어레이의 길이는 0x100이어야합니다. 1024 비트 키가있는 경우 어떤 크기 여야합니까? – GregaMohorko

+1

잘 모르겠지만, 아마도 반은 무엇입니까? 0x100은 256이므로 128 또는 0x80을 시도하십시오. – Ben

관련 문제