Работа с КриптоПро
От: Аноним  
Дата: 08.01.09 09:23
Оценка:
Имеется слудющая задача:
1. Сформировать запрос на выпуск сертификата ключа ЭЦП (КриптоПро)
2. Сформировать заявление в печатной форме, в котором должен содержаться открытый ключ.

Первая задача решана следуюжщим образом:


  var s: string;
  .....
  oEnroll:= CreateOLEObject('CEnroll.CEnroll.2'); 
  oEnroll.ProviderType := 75;
  oEnroll.ProviderName := 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
  oEnroll.ClientID := 0; 
  oEnroll.EnableSMIMECapabilities := False;
  oEnroll.KeySpec := 1; 
  oEnroll.GenKeyFlags := 0; 
  s:=oEnroll.createPKCS10('CN=Ivanov', '1.3.6.1.5.5.7.3.2');



Сформировался вот такой запрос:

MIICRDCCAfECAQAwETEPMA0GA1UEAxMGSXZhbm92MGMwHAYGKoUDAgITMBIGByqF
AwICJAAGByqFAwICHgEDQwAEQOw4Z3XQy7GgtLDEaVbLiMfu2tVuUO2ALcea69rD
wfh5O6FnZqIweM9pEiQwZNdqB9PUb4CwK6TDoLeN95xdQEygggFyMBoGCisGAQQB
gjcNAgMxDBYKNS4xLjI2MDAuMjA1BgorBgEEAYI3AgEOMScwJTAOBgNVHQ8BAf8E
BAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwggEbBgorBgEEAYI3DQICMYIBCzCC
AQcCAQEedgBDAHIAeQBwAHQAbwAtAFAAcgBvACAARwBPAFMAVAAgAFIAIAAzADQA
LgAxADAALQAyADAAMAAxACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFMA
ZQByAHYAaQBjAGUAIABQAHIAbwB2AGkAZABlAHIDgYkAYi8S8VwjgMmPj5y0hubp
XT95lw8He//GfvwbW5yikmSG7U694CJKbix3DKSVpawYz9eNDkSko57Le+olE7gk
eHZg5CXUwqdKVvswjRk8b6xSudIwlOgUzMyJTXMgzO5hAFiu/Bokbo3/B4iaQr4n
4XHJsF930/4Rz/QAtc0rXFIAAAAAAAAAADAKBgYqhQMCAgMFAANBAIK9mLDIaXK8
Gy4SmlT7MyogWwmYcZcM/HT6ylW+05EL3B11FRegJUwph2375D6ibJ0y/OD1bjCS
zjmAgreFK1o=




Насколько я понимаю он в кодировке base64, и теперь, для того чтобы к нему применить функцию CryptDecodeObject (чтобы вытащить открытый ключа) его надо из base64 приобразовать в binary. Для этого я делаю следующее:



implementation
function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';

.......

Flags := CRYPT_STRING_BASE64REQUESTHEADER;
CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
GetMem(buf, sz);
CryptStringToBinary(pointer(s), Length(s), Flags, buf, sz, skip, Flags);



Однако, получаю sz=0.

Подскажите в чём моя ошибка и как её можно исправить? Большое спасибо.
Re: Работа с КриптоПро
От: Аноним  
Дата: 12.01.09 20:20
Оценка:
Здравствуйте, Аноним, Вы писали:
Вопрос закрыт, всё получилось

А>Имеется слудющая задача:

А>1. Сформировать запрос на выпуск сертификата ключа ЭЦП (КриптоПро)
А>2. Сформировать заявление в печатной форме, в котором должен содержаться открытый ключ.

А>Первая задача решана следуюжщим образом:



А>
А>  var s: string;
А>  .....
А>  oEnroll:= CreateOLEObject('CEnroll.CEnroll.2'); 
А>  oEnroll.ProviderType := 75;
А>  oEnroll.ProviderName := 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
А>  oEnroll.ClientID := 0; 
А>  oEnroll.EnableSMIMECapabilities := False;
А>  oEnroll.KeySpec := 1; 
А>  oEnroll.GenKeyFlags := 0; 
А>  s:=oEnroll.createPKCS10('CN=Ivanov', '1.3.6.1.5.5.7.3.2');
А>



А>Сформировался вот такой запрос:


А>
А>MIICRDCCAfECAQAwETEPMA0GA1UEAxMGSXZhbm92MGMwHAYGKoUDAgITMBIGByqF
А>AwICJAAGByqFAwICHgEDQwAEQOw4Z3XQy7GgtLDEaVbLiMfu2tVuUO2ALcea69rD
А>wfh5O6FnZqIweM9pEiQwZNdqB9PUb4CwK6TDoLeN95xdQEygggFyMBoGCisGAQQB
А>gjcNAgMxDBYKNS4xLjI2MDAuMjA1BgorBgEEAYI3AgEOMScwJTAOBgNVHQ8BAf8E
А>BAMCBPAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwggEbBgorBgEEAYI3DQICMYIBCzCC
А>AQcCAQEedgBDAHIAeQBwAHQAbwAtAFAAcgBvACAARwBPAFMAVAAgAFIAIAAzADQA
А>LgAxADAALQAyADAAMAAxACAAQwByAHkAcAB0AG8AZwByAGEAcABoAGkAYwAgAFMA
А>ZQByAHYAaQBjAGUAIABQAHIAbwB2AGkAZABlAHIDgYkAYi8S8VwjgMmPj5y0hubp
А>XT95lw8He//GfvwbW5yikmSG7U694CJKbix3DKSVpawYz9eNDkSko57Le+olE7gk
А>eHZg5CXUwqdKVvswjRk8b6xSudIwlOgUzMyJTXMgzO5hAFiu/Bokbo3/B4iaQr4n
А>4XHJsF930/4Rz/QAtc0rXFIAAAAAAAAAADAKBgYqhQMCAgMFAANBAIK9mLDIaXK8
А>Gy4SmlT7MyogWwmYcZcM/HT6ylW+05EL3B11FRegJUwph2375D6ibJ0y/OD1bjCS
А>zjmAgreFK1o=
А>




А>Насколько я понимаю он в кодировке base64, и теперь, для того чтобы к нему применить функцию CryptDecodeObject (чтобы вытащить открытый ключа) его надо из base64 приобразовать в binary. Для этого я делаю следующее:




А>
А>implementation
А>function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';

А>.......

А>Flags := CRYPT_STRING_BASE64REQUESTHEADER;
А>CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
А>GetMem(buf, sz);
А>CryptStringToBinary(pointer(s), Length(s), Flags, buf, sz, skip, Flags);

А>



А>Однако, получаю sz=0.


А>Подскажите в чём моя ошибка и как её можно исправить? Большое спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.