Статус: Новичок
Группы: Участники
Зарегистрирован: 18.01.2013(UTC) Сообщений: 4
|
Как сделать с помощью контейнера и ключей присоединенную ЭЦП. Вот как создаю подпись, делал по примеру из help. Код:
procedure SignFile1(const ASourceFile, ADestFile: string);
var
Prov: HCRYPTPROV;
Hash: HCRYPTHASH;
hKey: HCRYPTKEY;
Param: CRYPT_PIN_PARAM;
PassStr, AContainerName: string;
Source, Dest: TMemoryStream;
Buffer, Signature: Pointer;
cbHash, SourceBufLen, DestBufLen, dwBlobLen: DWORD;
pbKeyBlob, pbHash: PBYTe;
begin
AContainerName := 'test';
Win32Check(CryptAcquireContext(@Prov, PChar(AContainerName),
PChar(CP_GR3410_2001_PROV_A),
PROV_GOST_2001_DH, 0 {CRYPT_SILENT}));
PassStr := '111';
// Установка параметров в соответствии с паролем.
if not CryptSetProvParam(Prov, PP_KEYEXCHANGE_PIN, @passStr[1], 0) then
ShowMessage('CryptSetProvParam' + IntToStr(GetLastError));
// Получение ключа пользователя.
if CryptGetUserKey(Prov, AT_KEYEXCHANGE, @hKey) then
ShowMessage('CryptGetUserKey succeeded.');
// Экпорт открытого ключа.
if CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, nil, dwBlobLen) then
ShowMessage('Size of the BLOB for the public key determined.');
// Распределение памяти под pbKeyBlob.
GetMem(pbKeyBlob, dwBlobLen);
// Сам экспорт в ключевой BLOB.
if CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, Pointer(pbKeyBlob), dwBlobLen) then
ShowMessage('Contents have been written to the BLOB.');
// Создание объекта функции хеширования.
try
Win32Check(CryptCreateHash(Prov, CALG_GR3411, 0, 0, @Hash));
except
on E: Exception do
ShowMessage('CryptCreateHash ' + E.Message);
end;
// Передача параметра HP_OID объекта функции хеширования.
// Определение размера BLOBа и распределение памяти.
if CryptGetHashParam(Hash, HP_OID, nil, cbHash, 0) then
ShowMessage('Size of the BLOB determined.');
GetMem(pbHash, cbHash);
// Копирование параметра HP_OID в pbHash.
if CryptGetHashParam(Hash, HP_OID, Pointer(pbHash), &cbHash,0) then
ShowMessage('Parameters have been written to the pbHash.');
// Вычисление криптографического хеша буфера.
Source := TMemoryStream.Create;
try
Source.LoadFromFile(ASourceFile);
try
Win32Check(CryptHashData(Hash, Source.Memory, Source.Size, 0))
except
on E: Exception do
ShowMessage('CryptHashData ' + E.Message);
end;
finally
Source.Free;
end;
// Определяем длину
DestBufLen := 0;
try
Win32Check(CryptSignHash(hash, AT_KEYEXCHANGE, nil, 0, nil, DestBufLen));
except
on E: Exception do
ShowMessage('CryptSignHash 1' + E.Message);
end;
if DestBufLen > 0 then
begin
// Распределение памяти под буфер подписи.
GetMem(Signature, DestBufLen);
try
Win32Check(CryptSignHash(hash, AT_KEYEXCHANGE, nil, 0, signature, DestBufLen));
except
on E: Exception do
ShowMessage('CryptSignHash 1' + E.Message);
end;
try
Dest := TMemoryStream.Create;
Dest.Position := 0;
Dest.WriteBuffer(Signature^, DestBufLen);
dest.SaveToFile(ADestFile);
finally
Dest.Free;
end;
end;
//--- Запись результата в поток
CryptDestroyHash(Hash);
CryptReleaseContext(Prov, 0);
end;
end;
Правильно ли я подписываю, можно сразу по всему файлу считать или надо по блочно считать? Как записать в файл подпись, чтобы получить присоединенную подпись? Код не верно отображается, приложил его в файлике. Отредактировано пользователем 29 января 2013 г. 10:57:32(UTC)
| Причина: Не указана Вложение(я):  test.txt (4kb) загружен 38 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|