Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2016(UTC) Сообщений: 33
Сказал(а) «Спасибо»: 1 раз
|
на да ) точно. в примере было так Код:
if(CryptAcquireContext(
&hProv,
"Sender",
NULL,
PROV_GOST_2001_DH,
0))
у себя написал так Код:
CryptAcquireContext(@hProv,nil,nil,PROV_GOST_2001_DH,0);
возможно недопонимаю значение второго параметра для зашифрованного файла ASN.1 Editor говорит Datalength is too large Перевел из примера на C++ расшифровку получилось такое
Код:
var
tSimpleBlobHeaderStandart:CRYPT_SIMPLEBLOB;
size:DWORD;
p:Pointer;
ke_alg:ALG_ID ;
bEncryptionParamSetStandart: array [0..10] of byte; //íåìåíÿåìàÿ ÷àñòü áëîáà
CryptedFile:TMemoryStream;
CryptedFileSize:DWORD;
SessionFile:TMemoryStream;
pbIV:TMemoryStream;// âåêòîð èíèôèàëèçàöèè ñåññèîííîãî êëþ÷à
SessionFileEncrypted:TMemoryStream;
hAgreeKey:HCRYPTKEY;
hPubKey:HCRYPTKEY;
hKey:HCRYPTKEY;
MacKey:TMemoryStream;
Vector:TMemoryStream;
resFile:TMemoryStream;
pbKeyBlobSimple:TMemoryStream;
hProv: HCRYPTPROV;
hSessionKey:HCRYPTKEY;
pbKeyBlob:TMemoryStream;// ñåññèîííûé êëþ÷åâîé ÁËÎÁ
// CryptedFile:TMemoryStream;
begin
ke_alg := CALG_PRO_EXPORT; // PRO_EXPORT àëãîðèòì êëþ÷à ñîãëàñîâàíèÿ
bEncryptionParamSetStandart[0]:=$30;
bEncryptionParamSetStandart[1]:=$09;
bEncryptionParamSetStandart[2]:=$06;
bEncryptionParamSetStandart[3]:=$07;
bEncryptionParamSetStandart[4]:=$2a;
bEncryptionParamSetStandart[5]:=$85;
bEncryptionParamSetStandart[6]:=$03;
bEncryptionParamSetStandart[7]:=$02;
bEncryptionParamSetStandart[8]:=$02;
bEncryptionParamSetStandart[9]:=$1f;
bEncryptionParamSetStandart[10]:=$01;
FillChar( tSimpleBlobHeaderStandart, SizeOf( CRYPT_SIMPLEBLOB ), #0 );
tSimpleBlobHeaderStandart.tSimpleBlobHeader.BlobHeader.aiKeyAlg := CALG_G28147;
tSimpleBlobHeaderStandart.tSimpleBlobHeader.BlobHeader.bType := SIMPLEBLOB;
tSimpleBlobHeaderStandart.tSimpleBlobHeader.BlobHeader.bVersion := BLOB_VERSION;
tSimpleBlobHeaderStandart.tSimpleBlobHeader.BlobHeader.reserved := 0;
tSimpleBlobHeaderStandart.tSimpleBlobHeader.EncryptKeyAlgId := CALG_G28147;
tSimpleBlobHeaderStandart.tSimpleBlobHeader.Magic := G28147_MAGIC;
CryptedFile:=TMemorystream.Create;
CryptedFile.LoadFromFile('c:\hp\my.enc');
// Îòêðûòèå ôàéëà, â êîòîðûé ïðîèçâîäèòñÿ çàïèñü ñåññèîííîãî êëþ÷à.
SessionFile:=TMemoryStream.Create;
SessionFile.LoadFromFile('c:\hp\my.bsv');// SessionFile
SessionFile.Position:=0;
// Îòêðûòèå ôàéëà, â êîòîðûé ïðîèçâîäèòñÿ çàïèñü ñåññèîííîãî êëþ÷à.
SessionFileEncrypted:=TMemoryStream.Create;
SessionFileEncrypted.LoadFromFile('c:\hp\my.bEncryptedKey');// SessionFileEncrypted
SessionFileEncrypted.Position:=0;
// Îòêðûòèå ôàéëà, â êîòîðûé ïðîèçâîäèòñÿ çàïèñü ñåññèîííîãî êëþ÷à.
MacKey:=TMemoryStream.Create;
MacKey.LoadFromFile('c:\hp\my.bMacKey');// MacKey
MacKey.Position:=0;
// Îòêðûòèå ôàéëà, â êîòîðîì õðàíèòñÿ âåêòîð èíèöèàëèçàöèè.
Vector:=TMemoryStream.Create;
Vector.LoadFromFile('c:\hp\my.Vector');// Vecto
Vector.Position:=0;
resFile:=TMemoryStream.Create;
// ×òåíèå âåêòîðà èíèöèàëèçàöèè èç ôàéëà.
pbIV:=TMemoryStream.Create;
pbIV.Size:=100;
pbIV.LoadFromStream(Vector);
// Ïîëó÷åíèå äåñêðèïòîðà êîíòåéíåðà ïîëó÷àòåëÿ ñ èìåíåì "Responder",
// íàõîäÿùåãîñÿ â ðàìêàõ ïðîâàéäåðà.
if not (CryptAcquireContext(@hProv,nil,nil,PROV_GOST_2001_DH,0)) then //0
begin
// HandleError("Error during CryptAcquireContext");
Err('');
end;
pbKeyBlobSimple:=TMemoryStream.Create;
pbKeyBlobSimple.Size:=((sizeof(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN+G28147_KEYLEN+EXPORT_IMIT_SIZE) + sizeof(bEncryptionParamSetStandart));
/// memcpy(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->tSimpleBlobHeader, &tSimpleBlobHeaderStandart, sizeof(CRYPT_SIMPLEBLOB_HEADER)); //êîïèðóåì íåìåíÿåìûé õåäåð â áëîáå
pbKeyBlobSimple.WriteBuffer(tSimpleBlobHeaderStandart,sizeof(CRYPT_SIMPLEBLOB_HEADER));
// ×òåíèå ñåñcèîííîãî êëþ÷à èç ôàéëà.
pbKeyBlobSimple.Position:=SizeOf(CRYPT_SIMPLEBLOB_HEADER);
SessionFile.Position:=0;
pbKeyBlobSimple.CopyFrom(SessionFile,SEANCE_VECTOR_LEN);
// dwBlobLenSimple:=SEANCE_VECTOR_LEN;
// ×òåíèå ñåñcèîííîãî êëþ÷à èç ôàéëà.
// dwBlobLenSimple = (DWORD)fread(((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bEncryptedKey, 1, G28147_KEYLEN, session_EncryptedKey);
pbKeyBlobSimple.Position:=SizeOf(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN;
pbKeyBlobSimple.CopyFrom(SessionFileEncrypted,G28147_KEYLEN);
// ×òåíèå ñåñcèîííîãî êëþ÷à èç ôàéëà.
//dwBlobLenSimple = (DWORD)fread(((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bMacKey, 1, EXPORT_IMIT_SIZE, session_MacKey);
pbKeyBlobSimple.Position:=SizeOf(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN+G28147_KEYLEN;
pbKeyBlobSimple.CopyFrom(MacKey,EXPORT_IMIT_SIZE);
// memcpy(((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bEncryptionParamSet, bEncryptionParamSetStandart, 11); //êîïèðóåì íåìåíÿåìóþ ASN ñòðóêòóðó
pbKeyBlobSimple.Position:=SizeOf(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN+G28147_KEYLEN+EXPORT_IMIT_SIZE;
pbKeyBlobSimple.WriteBuffer(bEncryptionParamSetStandart,11);
Application.MessageBox('11','');
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LoadPublicKey
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// èìïîðòèðóåì îòêðûòûé êëþ÷
if (CryptImportPublicKeyInfoEx(
hProv,
MY_ENCODING_TYPE,
@(pCertContext.pCertInfo.SubjectPublicKeyInfo),
0,
0,
nil,
@hPubKey)) then
begin
//printf("Public key imported from cert file\n");
end else begin
CertFreeCertificateContext(pCertContext);
//HandleError( "CryptImportPublicKeyInfoEx" );
Err('');
end;
CertFreeCertificateContext(pCertContext);
pbKeyBlob:=TMemoryStream.Create;
pbKeyBlob.Size:=100;
size:=pbKeyBlob.size;
// ýêñïîðòèðóåì åãî â áëîá BLOB
if (CryptExportKey(
hPubKey,
0,
PUBLICKEYBLOB,
0,
pbKeyBlob.Memory,
@size)) then
begin
//printf("Public key exported to blob\n");
end
else
begin
// HandleError( "CryptExportKey" );
Err('');
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Ïîëó÷åíèå äåñêðèïòîðà çàêðûòîãî êëþ÷à ïîëó÷àòåëÿ.
if(CryptGetUserKey(hProv,AT_KEYEXCHANGE,@hKey)) then
begin
//printf("The private key has been acquired. \n");
end
else
begin
Err('');
// HandleError("Error during CryptGetUserKey private key.");
end;
// 111
// Ïîëó÷åíèå êëþ÷à ñîãëàñîâàíèÿ èìïîðòîì îòêðûòîãî êëþ÷à îòïðàâèòåëÿ
// íà çàêðûòîì êëþ÷å ïîëó÷àòåëÿ.
if (CryptImportKey(
hProv,
pbKeyBlob.Memory,
100, //dwBlobLen
hKey,
0,
@hAgreeKey)) then
begin
// printf("The sender public key has been imported. \n");
end
else
begin
// HandleError("Error during CryptImportKey public key.");
Err('');
end;
// Óñòàíîâëåíèå PRO_EXPORT àëãîðèòìà êëþ÷à ñîãëàñîâàíèÿ
if(CryptSetKeyParam(
hAgreeKey,
KP_ALGID,
@ke_alg,//(LPBYTE)&ke_alg,
0)) then
begin
// printf("PRO_EXPORT agree key algorithm has been set. \n");
end
else
begin
// HandleError("Error during CryptSetKeyParam agree key.");
Err('');
end;
// Ïîëó÷åíèå ñåññèîííîãî êëþ÷à èìïîðòîì çàøèôðîâàííîãî ñåññèîííîãî êëþ÷à
// íà êëþ÷å Agree.
if (CryptImportKey(
hProv,
pbKeyBlobSimple.Memory,
71,
hAgreeKey,
0,
@hSessionKey)) then
begin
// printf("The session key has been imported. \n");
end
else
begin
// HandleError("Error during CryptImportKey session key.");
Err('');
end;
// Óñòàíîâêà âåêòîðà èíèöèàëèçàöèè - áåç íåãî ïåðâûå 8 áàéò ðàñøèôðóþòñÿ íåïðàâèëüíî.!!!!!!
if not (CryptSetKeyParam(
hSessionKey,
KP_IV,
pbIV.Memory,
0)) then
begin
// HandleError("Error during CryptSetKeyParam.");
end;
// printf( "CryptSetKeyParam succeeded. \n");
CryptedFile:=TMemoryStream.Create;
CryptedFile.LoadFromFile('c:\hp\my.enc');
CryptedFile.Position:=0;
CryptedFileSize:=CryptedFile.Size;
// ðàñøèôðîâàíèå ïðî÷èòàííîãî áëîêà íà ñåññèîííîì êëþ÷å.
if(CryptDecrypt(
hSessionKey,
0,
true,//bFinal,
0,
CryptedFile.Memory,
@CryptedFilesize)) then
begin
end
else
begin
CryptedFile.Position:=0;
CryptedFile.SaveToFile('c:\hp\my.dec');
Err('');
// HandleError("Decryption failed.");
end
тут получил на строке Код:if (CryptImportKey(hProv,pbKeyBlobSimple.Memory,71,hAgreeKey,0,@hSessionKey)) then
ошибку 80090005 Плохие данные
|