Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Автор: AlexEr81  Подскажите пожалуйста. Мне нужно извлечь из контейнера значение открытого ключа (в запросе это req_info.SubjectPublicKeyInfo.PublicKey а в сертификате pCertContext^.pCertInfo^.SubjectPublicKeyInfo.PublicKey) пытаюсь так: Код:var
Prov: HCRYPTPROV;
SignKey: HCRYPTKEY;
BufSize: DWORD;
d:byte;
begin
CryptAcquireContext(@Prov,’Имя контейнера’ ,CP_GR3410_2001_PROV_A,PROV_GOST_2001_DH,0);
CryptGetUserKey(Prov,AT_KEYEXCHANGE,@SignKey);
CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,nil,@BufSize);
CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,PByte(d),@BufSize);
repmemo.Lines.Append(ByteArrayToStr(@d,BufSize));
CryptDestroyKey(SignKey);
CryptReleaseContext(Prov,0);
в D получается значение не такое как в запросе или сертификате. Как получить то что надо. Может значение D надо как-то преобразовать? d:byte и ByteArrayToStr. Странное сочетание. d : PBYTE; Отредактировано пользователем 17 января 2013 г. 13:40:06(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
Цитата:получается: Цитата: 0620 0000 232E 0000 4D41 4731 0002 0000 3012 0607 2A85 0302 0224 0006 072A 8503 0202 1E01 9179 D934 EAA5 CB83 6ADD 480F C696 5C5B CFEF 94ED FCF9 E18C C99E CD2C E530 E8A6 34B3 84DA 5389 9439 6BFC EEAA 5009 92F2 37BC F049 60CF F658 680F 68C1 B2E0 813C
оказывается тут: Цитата:3012 0607 2A85 0302 0224 0006 072A 8503 0202 1E01 это параметры алгоритма Цитата:0620 0000 232E 0000 4D41 4731 0002 0000 не знаю что. куда-то делось 0440
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Автор: AlexEr81  Цитата:получается: Цитата: 0620 0000 232E 0000 4D41 4731 0002 0000 3012 0607 2A85 0302 0224 0006 072A 8503 0202 1E01 9179 D934 EAA5 CB83 6ADD 480F C696 5C5B CFEF 94ED FCF9 E18C C99E CD2C E530 E8A6 34B3 84DA 5389 9439 6BFC EEAA 5009 92F2 37BC F049 60CF F658 680F 68C1 B2E0 813C
оказывается тут: Цитата:3012 0607 2A85 0302 0224 0006 072A 8503 0202 1E01 это параметры алгоритма Цитата:0620 0000 232E 0000 4D41 4731 0002 0000 не знаю что. куда-то делось 0440 Похоже, что в этой струтуре данных гораздо больше, чем нужно получить. Лучше привести к самой структуре, и достать значение отк. ключа.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
Цитата:Похоже, что в этой структуре данных гораздо больше, чем нужно получить. Лучше привести к самой структуре, и достать значение отк. ключа. не соображу как это сделать. поискал на форуме криптопро описываю структуру так: Код: type
CRYPT_PUBKEYPARAM=record
Magic:DWORD;
BitLen: DWORD;
end;
type
CRYPT_PUBKEY_INFO_HEADER=record
aBlobHeader: BLOBHEADER;
KeyParam:CRYPT_PUBKEYPARAM;
end;
type
PCRYPT_PUBLICKEYBLOB = ^CRYPT_PUBLICKEYBLOB ;
CRYPT_PUBLICKEYBLOB =record
tPublicKeyParam:CRYPT_PUBKEY_INFO_HEADER ;
bASN1GostR3410_94_PublicKeyParameters:BYTE;
bPublicKey:BYTE;
end;
var Pk:PCRYPT_PUBLICKEYBLOB;
Prov: HCRYPTPROV;
SignKey: HCRYPTKEY;
BufSize: DWORD;
d:Pbyte;
begin
CryptAcquireContext(@Prov,’Имя контейнера’ ,CP_GR3410_2001_PROV_A,PROV_GOST_2001_DH,0);
CryptGetUserKey(Prov,AT_KEYEXCHANGE,@SignKey);
CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,nil,@BufSize);
GetMem(D,BufSize);
CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,d,@BufSize);
repmemo.Lines.Append(ByteArrayToStr(d,BufSize));
PK:= PCRYPT_PUBLICKEYBLOB(D);
if assigned(PK) then
repmemo.Lines.Append(ByteArrayToStrOctet(pointer(pk.bPublicKey), pk.tPublicKeyParam.KeyParam.BitLen div 8));
CryptDestroyKey(SignKey);
CryptReleaseContext(Prov,0);
pk.tPublicKeyParam.KeyParam.BitLen div 8 получается равно 64 а в pk.bPublicKey как будто пусто. одни нули.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
получается - Pk.tPublicKeyParam.aBlobHeader = (btype-6; bVersion-32;reserved-0; aikeyAlg-11811) Pk.tPublicKeyParam.bitlen=512 вроде всё правильно. а вот в pk.bPublicKey данные не заносятся
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.03.2012(UTC) Сообщений: 177
Сказал(а) «Спасибо»: 57 раз Поблагодарили: 11 раз в 8 постах
|
Попробовал ваш код. Самое интересное, значения одни и те же, в обоих случаях. Ко всему у меня не было ваших портотипов функций: ByteArrayToStr & ByteArrayToStrOctet. Данные заносятся (в отладчике, правда, нули). Если взять находящуюся в гугле ByteArrayToStr, то в (bPublicKey или в PCRYPT_PUBLICKEYBLOB) будет лежать значение открытого ключа в перевернутом виде с конца и без 0440, но это будет лишь часть строки. Вот описание что там должно быть: http://www.cryptopro.ru/...t.aspx?g=posts&t=355http://cpdn.cryptopro.ru...l_i_c_k_e_y_b_l_o_b.htmlВ контейнере нет случайно самого сертификата? Отредактировано пользователем 21 января 2013 г. 8:22:31(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
нет, сертификата в контейнере нет. нужно до издания сертификата сверить запрос и ключ на соответствие.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
вот например АРМ ЭЦП информзащиты показывает информацию из ключа: длина -512, Алгоритм - ГОСТ Р 34.10-2001 и значение открытого ключа такое как в запросе и в сертификате. хотелось бы тоже самое получить. вот если объявляю - bPublicKey:BYTE; то получается bPublicKey=2A есси как массив каким нибудь размером - bPublicKey:array[0..n] BYTE; то туда попадает больше данных начиная с 2A85 0302 0224 0006 и т.д. а если задаю как в запросе или сертификате bPublicKey:PBYTE; то туда ничего не попадает
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Если нужно вывести информацию об ОК как в окне просмотра сертификата, то лучше вместо Цитата: CryptGetUserKey(Prov,AT_KEYEXCHANGE,@SignKey); CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,nil,@BufSize); GetMem(D,BufSize); CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,d,@BufSize); воспользоваться CryptExportPublicKeyInfoEx |
|
 1 пользователь поблагодарил Кирилл Соболев за этот пост.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.11.2012(UTC) Сообщений: 65 Откуда: Ростовская область
Сказал(а) «Спасибо»: 9 раз Поблагодарили: 1 раз в 1 постах
|
спасибо. всё получилось. Код:
pInfo :PCERT_PUBLIC_KEY_INFO;
CryptAcquireContext(@Prov,'имя контейнера',CP_GR3410_2001_PROV_A,PROV_GOST_2001_DH,0);
CryptExportPublicKeyInfoEx(Prov,AT_KEYEXCHANGE,PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,'1.2.643.2.2.19',0,nil,nil,@size);
GetMem(pInfo,Size);
CryptExportPublicKeyInfoEx(Prov,AT_KEYEXCHANGE,PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,'1.2.643.2.2.19',0,nil,pInfo,@size);
repmemo.Lines.Append(ByteArrayToStrOctet(pInfo.PublicKey.pbData,pInfo.PublicKey.cbData));
Отредактировано пользователем 22 января 2013 г. 7:59:41(UTC)
| Причина: Не указана
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close