DSS 키
DSS 키는 CryptGenKey 함수를 호출하여 생성할 수 있습니다. CryptGenKey를 호출하려면 AT_SIGNATURE 또는 CALG_DSS_SIGN Algid 인수에 전달되어야 합니다. 이 호출은 P(프라임 모듈러스), Q(prime), G(생성기), X(비밀 지수) 및 Y(공개 키) 값을 처음부터 생성하고 키 BLOB 에서 로컬 스토리지에 유지합니다.
DSS 서명 키 쌍을 생성하려면
- CryptAcquireContext 함수를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
- CryptGenKey를 호출하여 키를 생성합니다. algid 인수에 대해 AT_SIGNATURE 또는 CALG_DSS_SIGN 전달해야 하며 dwFlags 인수의 상위 16비트 중 하나를 원하는 키 크기로 설정해야 합니다. 상위 16비트에서 0이면 1,024비트 기본 키 크기가 사용됩니다. HCRYPTKEY 핸들은 hKey 인수에 반환됩니다.
이전에 생성된 서명 키에 대한 포인터를 검색하려면
- CryptAcquireContext를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
- dwKeySpec 인수를 AT_SIGNATURE 또는 CALG_DSS_SIGN 설정하여 CryptGetUserKey 함수를 호출합니다.
P, Q 및 G 값을 검색하려면
- CryptAcquireContext를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
- dwKeySpec 인수를 AT_SIGNATURE 또는 CALG_DSS_SIGN 설정하여 CryptGetUserKey를 호출합니다.
- 이전 단계에서 검색된 포인터로 설정된 hKey 인수를 사용하여 CryptGetKeyParam을 호출합니다. dwParam 인수는 원하는 플래그로 설정해야 합니다. KP_P, KP_Q 또는 KP_G. 값은 pbData 인수에 반환되고 데이터의 길이는 pdwDataLen 인수에 반환됩니다. 값은 헤더 정보 없이 little-endian 형식으로 반환됩니다.
서명할 데이터는 먼저 SHA 알고리즘을 사용하여 해시해야 합니다. 해당 데이터가 해시된 후 CryptSignHash 함수를 호출하여 DSS 서명이 생성됩니다.
DSS 서명을 생성하려면
- CryptAcquireContext를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
- Algid 인수를 CALG_SHA 설정하여 CryptCreateHash를 호출하여 SHA 해시 개체에 대한 핸들을 가져옵니다.
- 이전 단계에서 검색된 핸들로 설정된 hHash 인수를 사용하여 CryptHashData를 호출합니다. 이렇게 하면 데이터의 해시가 만들어지고 CryptCreateHash 함수 호출의 phHash 인수에서 해시에 대한 핸들을 반환합니다.
- 이전 단계에서 검색된 핸들로 설정된 hHash 인수를 사용하여 CryptSignHash를 호출합니다. AT_SIGNATURE 또는 CALG_DSS_SIGN dwKeySpec 매개 변수에 전달될 수 있습니다. 서명은 pbSignature 인수에 제공된 주소로 반환되고 서명 길이는 pdwSigLen 인수에 제공된 주소로 반환됩니다. NULL 포인터는 pbSignature 인수에 전달될 수 있으며, 이 경우 서명이 생성되지 않지만 서명 길이는 pdwSigLen 매개 변수에 제공된 주소로 반환됩니다.
DSS 서명을 확인하려면 서명자의 DSS 공개 키를 가져와야 하고 서명된 데이터를 해시한 다음 서명을 확인할 수 있습니다.
DSS 서명을 확인하려면
CryptAcquireContext를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
CryptImportKey를 호출하여 서명자의 DSS 공개 키를 가져옵니다.
Algid 인수를 CALG_SHA 설정하여 CryptCreateHash를 호출하여 SHA 해시 개체에 대한 핸들을 가져옵니다.
이전 단계에서 검색된 핸들로 설정된 hHash 인수와 서명된 데이터를 가리키는 pbData를 사용하여 CryptHashData를 호출합니다. 이렇게 하면 데이터의 해시가 만들어지고 CryptCreateHash 함수 호출의 phHash 인수에서 해시에 대한 핸들을 반환합니다.
다음 설정을 사용하여 CryptVerifySignature 를 호출합니다.
hHash 는 이전 단계에서 수행한 해시에 대한 핸들로 설정됩니다.
pbSignature 는 확인할 서명을 가리킵니다.
dwSigLen 은 서명의 길이로 설정됩니다.
hPubKey 는 2단계에서 가져온 공개 키의 핸들로 설정됩니다.
dwFlags는 0으로 설정됩니다.
서명된 데이터를 받는 사람이 서명을 확인해야 하는 사람에게 보내는 경우 서명자의 공개 키를 받는 사람에게 제공해야 하며 일반적으로 서명된 데이터와 함께 전송됩니다. 따라서 DSS 키를 키 BLOB 형식으로 내보낼 수 있어야 합니다.
DSS 공개 키를 내보내려면
- CryptAcquireContext를 호출하여 Microsoft DSS 암호화 공급자에 대한 핸들을 가져옵니다.
- dwKeySpec 인수를 AT_SIGNATURE 또는 CALG_DSS_SIGN 설정하여 CryptGetUserKey를 호출합니다.
- 이전 단계에서 검색된 핸들로 설정된 hKey를 사용하여 CryptExportKey를 호출하고, dwBlobType을 PUBLICKEYBLOB로 설정하고, dwFlags를 0으로 설정합니다. DSS 공개 키 BLOB 은 pbData로 반환되고 키 BLOB 의 길이는 pdwDataLen에서 반환됩니다. NULL 포인터는 pbData에 전달될 수 있으며, 이 경우 DSS 키 BLOB의 길이만 반환됩니다. CryptExportKey를 호출할 때 반환되는 BLOB은 DSS 공급자 키 BLOB에 설명된 형식입니다.
DSS 프라이빗 키를 내보내려면
- CryptExportKey를 호출할 때 dwBlobType이 PRIVATEKEYBLOB로 설정된다는 점을 제외하고 DSS 공개 키를 내보내는 것과 동일한 절차를 따릅니다. CryptExportKey를 호출할 때 반환되는 BLOB은 DSS 공급자 키 BLOB에 설명된 형식입니다.