Внутреннее взаимодействие CryptAPI с .NET Code - PullRequest
1 голос
/ 09 июня 2009

Мне удалось зашифровать данные в собственном коде, используя Crypto API, и расшифровать их в коде .NET (C #), используя алгоритм RC2 и SHA для создания ключа.

Это нативный код (в данном случае Delphi):

// Get handle to CSP
If Not CryptAcquireContext(hCryptProv, nil, nil, PROV_RSA_FULL, 0) Then
    If Not CryptAcquireContext(hCryptProv, nil, nil, PROV_RSA_FULL, CRYPT_NEWKEYSET) Then
        ShowMessage('CryptAcquireContext '+IntToStr(GetLastError()));

// Create a hash object
If Not CryptCreateHash(hCryptProv, CALG_SHA, 0, 0, hHash) Then
        ShowMessage('CryptCreateHash '+IntToStr(GetLastError()));

// Hash the password
If Not CryptHashData(hHash,PByte(as_password), Length(as_password), 0) Then
        ShowMessage('CryptHashData '+IntToStr(GetLastError()));

// Derive a session key from the hash object
If Not CryptDeriveKey(hCryptProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, hKey) Then
        ShowMessage('CryptDeriveKey '+IntToStr(GetLastError()));

// allocate buffer space
lul_datalen := Length(ablob_data);
lblob_buffer := ablob_data + '        ';
lul_buflen := Length(lblob_buffer);

If ab_encrypt Then
    // Encrypt data
    If CryptEncrypt(hKey, 0, True, 0, PByte(lblob_buffer), lul_datalen, lul_buflen) Then
        lblob_value := Copy(lblob_buffer, 1, lul_datalen)
  else
        ShowMessage('CryptEncrypt '+IntToStr(GetLastError()))
Else
    // Decrypt data
    If CryptDecrypt(hKey, 0, True, 0, PByte(lblob_buffer), lul_datalen) Then
        lblob_value := Copy(lblob_buffer, 1, lul_datalen)
    Else
        ShowMessage('CryptDecrypt '+IntToStr(GetLastError()));

// Destroy session key
If hKey > 0 Then
    CryptDestroyKey(hKey);

// Destroy hash object
If hHash > 0 Then
    CryptDestroyHash(hHash);

// Release CSP handle
If hCryptProv > 0 Then
    CryptReleaseContext(hCryptProv, 0);

  Result := lblob_value;

Это код .NET:

CspParameters cspParams = new CspParameters(1);
PasswordDeriveBytes deriveBytes = new PasswordDeriveBytes(aPassword, null, "SHA-1", 1, cspParams);
byte[] rgbIV = new byte[8];
byte[] key = deriveBytes.CryptDeriveKey("RC2", "SHA1", 0, rgbIV);

var provider = new RC2CryptoServiceProvider();
provider.Key = key;
provider.IV = rgbIV;

ICryptoTransform transform = provider.CreateDecryptor();

byte[] decyptedBlob = transform.TransformFinalBlock(arData, 0, arData.Length);

Теперь я хочу использовать хочу использовать более новое и лучшее шифрование AES, поэтому в нативном коде я хочу использовать PROV_RSA_AES вместо PROV_RSA_FULL, CALG_SHA_256 вместо CALG_SHA и CALG_AES_256 вместо CALG_RC2. Это прекрасно работает на родном сайте.

Но я не могу заставить его работать на сайте .NET. Конечно, мне нужно изменить RC2CryptoServiceProvider на AESCryptoServiceProvider и CspParameters должны быть инициализированы с 24 вместо 1. Моя проблема в том, как заставить работать PasswordDerivedBytes, какое точное значение параметра требуется?

Спасибо за любые подсказки.

1 Ответ

0 голосов
/ 03 марта 2011

PasswordDerivedBytes.CryptDeriveKey не поддерживает AES. Увидеть: Ошибка CryptDeriveKey для имени алгоритма AES

...