Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline MCR  
#11 Оставлено : 17 января 2013 г. 13:24:20(UTC)
MCR

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline AlexEr81  
#12 Оставлено : 17 января 2013 г. 13:34:13(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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
Offline MCR  
#13 Оставлено : 17 января 2013 г. 13:41:09(UTC)
MCR

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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



Похоже, что в этой струтуре данных гораздо больше, чем нужно получить.
Лучше привести к самой структуре, и достать значение отк. ключа.
Offline AlexEr81  
#14 Оставлено : 17 января 2013 г. 19:09:28(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 как будто пусто. одни нули.
Offline AlexEr81  
#15 Оставлено : 18 января 2013 г. 15:18:08(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 данные не заносятся
Offline MCR  
#16 Оставлено : 21 января 2013 г. 8:20:43(UTC)
MCR

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.03.2012(UTC)
Сообщений: 177

Сказал(а) «Спасибо»: 57 раз
Поблагодарили: 11 раз в 8 постах
Попробовал ваш код. Самое интересное, значения одни и те же, в обоих случаях. Ко всему у меня не было ваших портотипов функций: ByteArrayToStr & ByteArrayToStrOctet.
Данные заносятся (в отладчике, правда, нули).

Если взять находящуюся в гугле ByteArrayToStr, то в (bPublicKey или в PCRYPT_PUBLICKEYBLOB) будет лежать значение открытого ключа в перевернутом виде с конца и без 0440, но это будет лишь часть строки. Вот описание что там должно быть:
http://www.cryptopro.ru/...t.aspx?g=posts&t=355
http://cpdn.cryptopro.ru...l_i_c_k_e_y_b_l_o_b.html

В контейнере нет случайно самого сертификата?

Отредактировано пользователем 21 января 2013 г. 8:22:31(UTC)  | Причина: Не указана

Offline AlexEr81  
#17 Оставлено : 21 января 2013 г. 9:38:06(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
нет, сертификата в контейнере нет. нужно до издания сертификата сверить запрос и ключ на соответствие.
Offline AlexEr81  
#18 Оставлено : 21 января 2013 г. 9:46:17(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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; то туда ничего не попадает
Offline Kirill Sobolev  
#19 Оставлено : 21 января 2013 г. 15:11:05(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
AlexEr81 оставлено 22.01.2013(UTC)
Offline AlexEr81  
#20 Оставлено : 22 января 2013 г. 7:57:31(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.