-1

도구를 사용하여 스마트 카드를 통해 데이터 "Hello"에 서명하고 있습니다.서명 된 데이터를 확인할 수 없습니다

출력은 16 진수 형식입니다. 문자열 형식의

14 5F 65 CE 7C 2D 8A 0A FA B0 FB 86 CE 28 90 84 37 2D 04 63 B2 35 FA 40 4A B6 35 C8 90 AF 55 7F B1 CA FE FD 5B F9 1B 7C DB 74 63 BF 16 5B B3 6D E8 2D B6 D7 2E 90 AF 0A 5E CF 78 73 E3 37 02 C2 97 0E F9 B3 40 4C 67 CD E4 7C D9 4B D3 C9 86 51 8E 1E 84 81 B4 30 AC 68 96 59 CB 63 E5 C8 28 48 C7 1D E8 E9 FC E8 C9 BE 36 33 0A F0 A9 35 C4 D4 BF 60 66 21 5C 41 8F 48 91 D4 BB AF 75 75 7A B3 2A 8A 28 B8 30 D1 B4 6B 69 23 82 2D 28 77 30 05 D5 C9 AB 41 17 C1 68 6D D9 80 0F F2 C1 FC 32 6E 22 61 27 97 9C DD C3 50 33 AA DB F4 BA 98 29 FA 4F E2 B4 BC C5 9E 90 34 F3 BC 3D 78 01 47 AF 96 20 06 6F F9 41 30 D7 35 52 D3 DE 85 E3 FE 0B B7 15 4D 1A 73 B8 36 F4 A1 59 A2 7E 05 50 8B 52 AC B4 EF 2D D9 29 9D D9 BB C8 DF F3 67 C5 D1 D9 C0 0C 65 68 A8 12 9B 24 92 4E EB 98 D8 B0 D9 2E 6A

각각 서명 된 데이터 나 파일 signedData.txt에 저장했습니다. 나는이의 검증을 위해 윈도우 CryptoAPI를을 사용하고

._eÎ|-Š.ú°û†Î(„7-.c²5ú@J¶5ȯU±Êþý[ù.|Ûtc¿.[³mè-¶×.¯.^Ïxsã7.—.ù³@LgÍä|ÙKÓɆQŽ.„´0¬h– YËcåÈ(HÇ.èéüèɾ63.ð©5ÄÔ¿`f!\AH‘Ô»¯uuz³*Š(¸0Ñ´ki#‚-(w0.ÕÉ«A.ÁhmÙ€.òÁü2n"a'—œÝÃP3ªÛôº˜)úOâ ´¼Åž4ó¼=x.G¯– .oùA0×5RÓÞ…ãþ.·.M.s¸6ô¡Y¢~.P‹R¬´ï-Ù)Ù»ÈßógÅÑÙÀ.eh¨.›$’Në˜Ø°Ù.j 

데이터를 체결했다.

나는 파일 signedData.txt를 열고 버퍼 " signedBuffer"에 데이터를 쓰고

다음

내가 사용하는 가게에서 내 인증서를 발견하고 공개 키의 핸들을 복용하고

hPubKey = CryptImportPublicKeyInfo(hProv, ENCODING_TYPE, &pCertContext->pCertInfo->SubjectPublicKeyInfo, &hCertPubKey);

은 그 때 나는 CALG_SHA_256

hObject = CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHashObject);

01을 사용하여 해시 객체를 생성하고 23,516,

그럼 내가

CryptVerifySignature(hObject,signedBuffer,signedBufferBytes,hPubKey,NULL,0); /* signedBuffer contains signed data in string format */

/*signedBufferBytes has no. of bytes in the buffer */

를 사용하여 서명을 검증하고 마지막 단계에서 해시 객체

CryptHashData(hhObject, Buffer, BufferLen, 0); // char Buffer = "Hello";

         // int BufferLen = strlen(Buffer); 

내 데이터를 추가하지만이 데이터를 서명 확인되지 않았습니다. 오류 코드는 0x80090006 - Invalid Signature입니다. 진수 형식으로

공개 키는 : 내가 사용하고 지금

30 82 01 0a 02 82 01 01 00 b8 f8 dc 2c a5 03 84 ba 72 c6 0e 03 89 51 6f 39 a8 41 e3 49 b3 f7 14 31 d3 43 b7 fc 1f 61 c2 43 b0 77 9e 19 af f4 8b 02 99 72 c1 17 21 1d 23 da ab 53 54 74 33 e4 ab 9d 82 d2 68 33 9a b5 9c 99 cb f0 12 e0 f8 44 4f e8 91 3f 60 ed ca fa 3b 40 bd 64 50 92 d3 c2 c1 48 ad 24 3e ca 64 2c 50 a9 01 b5 9f f4 a4 46 e5 84 e9 a4 87 41 86 a1 7a 7f fc a6 f0 e0 b1 de f0 c1 f2 5d c8 84 16 15 4d e4 df 43 43 3a cd ad ec eb af 1b 9c a7 5c 40 dc ae 1f 71 6e a4 c6 0f dd 3e 3c c8 0d 25 4c 61 74 df aa ed b5 d5 b9 06 6a 8e b0 b7 c0 e6 c9 bf db b1 07 2e a2 76 aa e7 28 1c 8d 32 4e b3 58 1d 34 89 96 ed 3e da 29 e0 1e c9 c2 2e 18 19 a6 ba 91 32 b7 85 97 87 92 16 c5 01 b4 4f 57 5c 56 1b f5 f4 6a 29 6b 2e 51 8b f5 4c 6f b8 fd cb 09 d9 fd 66 09 04 49 b6 ba 7e d0 af 70 3a 51 41 5a a5 04 bf 02 03 01 00 01

시그니처 버퍼입니다 : 모든

BYTE   bSignatureBuf[]  = { 
     0x6A, 0x2E, 0xD9, 0xB0, 0xD8, 0x98, 0xEB, 0x4E, 0x92, 0x24, 0x9B, 0x12, 0xA8, 0x68, 0x65, 0x0C, 
     0xC0, 0xD9, 0xD1, 0xC5, 0x67, 0xF3, 0xDF, 0xC8, 0xBB, 0xD9, 0x9D, 0x29, 0xD9, 0x2D, 0xEF, 0xB4, 
     0xAC, 0x52, 0x8B, 0x50, 0x05, 0x7E, 0xA2, 0x59, 0xA1, 0xF4, 0x36, 0xB8, 0x73, 0x1A, 0x4D, 0x15, 
     0xB7, 0x0B, 0xFE, 0xE3, 0x85, 0xDE, 0xD3, 0x52, 0x35, 0xD7, 0x30, 0x41, 0xF9, 0x6F, 0x06, 0x20, 
     0x96, 0xAF, 0x47, 0x01, 0x78, 0x3D, 0xBC, 0xF3, 0x34, 0x90, 0x9E, 0xC5, 0xBC, 0xB4, 0xE2, 0x4F, 
     0xFA, 0x29, 0x98, 0xBA, 0xF4, 0xDB, 0xAA, 0x33, 0x50, 0xC3, 0xDD, 0x9C, 0x97, 0x27, 0x61, 0x22, 
     0x6E, 0x32, 0xFC, 0xC1, 0xF2, 0x0F, 0x80, 0xD9, 0x6D, 0x68, 0xC1, 0x17, 0x41, 0xAB, 0xC9, 0xD5, 
     0x05, 0x30, 0x77, 0x28, 0x2D, 0x82, 0x23, 0x69, 0x6B, 0xB4, 0xD1, 0x30, 0xB8, 0x28, 0x8A, 0x2A, 
     0xB3, 0x7A, 0x75, 0x75, 0xAF, 0xBB, 0xD4, 0x91, 0x48, 0x8F, 0x41, 0x5C, 0x21, 0x66, 0x60, 0xBF, 
     0xD4, 0xC4, 0x35, 0xA9, 0xF0, 0x0A, 0x33, 0x36, 0xBE, 0xC9, 0xE8, 0xFC, 0xE9, 0xE8, 0x1D, 0xC7, 
     0x48, 0x28, 0xC8, 0xE5, 0x63, 0xCB, 0x59, 0x96, 0x68, 0xAC, 0x30, 0xB4, 0x81, 0x84, 0x1E, 0x8E, 
     0x51, 0x86, 0xC9, 0xD3, 0x4B, 0xD9, 0x7C, 0xE4, 0xCD, 0x67, 0x4C, 0x40, 0xB3, 0xF9, 0x0E, 0x97, 
     0xC2, 0x02, 0x37, 0xE3, 0x73, 0x78, 0xCF, 0x5E, 0x0A, 0xAF, 0x90, 0x2E, 0xD7, 0xB6, 0x2D, 0xE8, 
     0x6D, 0xB3, 0x5B, 0x16, 0xBF, 0x63, 0x74, 0xDB, 0x7C, 0x1B, 0xF9, 0x5B, 0xFD, 0xFE, 0xCA, 0xB1, 
     0x7F, 0x55, 0xAF, 0x90, 0xC8, 0x35, 0xB6, 0x4A, 0x40, 0xFA, 0x35, 0xB2, 0x63, 0x04, 0x2D, 0x37, 
     0x84, 0x90, 0x28, 0xCE, 0x86, 0xFB, 0xB0, 0xFA, 0x0A, 0x8A, 0x2D, 0x7C, 0xCE, 0x65, 0x5F, 0x14 
    }; 
+1

파일의 데이터를 문자열로 읽고 쓰는 중입니까? 텍스트 데이터가 아니기 때문에 그렇게하지 마십시오. – ntoskrnl

+0

예. 그 파일에서 signedBuffer에 데이터를 쓰고있는 signedData.txt 파일을 사용하고 있습니다. 이 signedBuffer는 검증 목적으로 사용하고 있습니다. – Ankit

+0

서명 된 데이터는 이진 데이터로 처리해야합니다. 모든 이진 데이터가 유효한 문자 인코딩을 나타내는 것은 아닙니다. 텍스트를 원한다면 먼저베이스 64로 변환해야합니다 (물론베이스 64 데이터를 디코딩하여 다시 바이너리로 변환해야합니다). –

답변

0

먼저 텍스트로 바이너리 데이터를 처리해서는 안 의견에서 주어진대로.

서명이 PKCS # 1 SHA-1을 사용하여 생성되었으며 사용자의 해시 기능이 PKCS # 1 [^ 1]을 사용하여 SHA-256 - ()으로 지정됩니다. 서명 생성 및 검증 중에는 동일한 해시 함수를 사용해야합니다.

공개 키로 서명을 해독 한 후 ASN.1 설명에서 OID를 조회하여 사용 된 해시 함수를 볼 수 있습니다 (사용 된 해시 함수를 찾는 방법이 궁금한 경우를 대비하여).

네이티브 암호화 API는 리틀 엔디안 바이트 순서를 사용 (에드 : 서명 바이트)

메모를 비 M의 $ 것을

는 또한 API에서이 작은 말을주의 world는 빅 엔디안 바이트 순서를 사용합니다.

[^ 1] : 일반적인 Microsoft는이 신청하는 정확한 프로토콜을 지정하지 않는 한 [^ 2]

[^ 2] : 유래가 인하 각주를 구현하는 작은 노력을 기울이고 일단이 제대로 볼 수 있어야

+0

예 해시 알고리즘은 sha1입니다. 그것을 지적하기위한 타이. 나는 그것을 문자열로 변환하지 않고 BYTE 배열 형식 자체에서 서명을 가져 왔으며 반대 순서로 가져 왔습니다. 또한 sha1에 해시 알고리즘을 변경했지만 여전히 서명이 확인되지 않았습니다. – Ankit

+0

서명 버퍼에 대한 업데이트 된 질문을 확인하십시오 – Ankit

+0

우리가 당신과 디버그 세션을 수행 할 것으로 예상하지 않는 한이 질문에 충분히 대답한다고 생각합니다. –

관련 문제