Descriptografar cordas RijndaelManaged criptografado com CryptDecrypt
-
22-08-2019 - |
Pergunta
Ok eu estou tentando usar a API Win32 Crypto em C ++ para descriptografar uma string encriptada em C # (.NET 2) com a classe RijndaelManaged. Mas eu estou tendo nenhuma sorte em tudo eu recebo jibberish ou um código de erro Win32 dados errados. Todas as minhas chaves, IV e jogo de sal, eu olhei no relógio para ambos os aplicativos de teste. Eu passei todo digamos olhando para ele e eu sou oficialmente preso.
De qualquer forma aqui é o C #
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(GetPassPhrase(), salt, 1000);
RijndaelManaged rijndael = new RijndaelManaged();
rijndael.BlockSize = 128;
rijndael.KeySize = 256;
rijndael.Mode = CipherMode.CBC;
rijndael.Key = pdb.GetBytes(m_KeySize);
rijndael.IV = GetIV(iv);
ICryptoTransform encryptor = rijndael.CreateEncryptor();
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
Byte[] encryptedBytes = null;
Byte[] toBeEncrypted = UnicodeEncoding.Unicode.GetBytes(value);
csEncrypt.Write(toBeEncrypted, 0, toBeEncrypted.Length);
csEncrypt.FlushFinalBlock();
encryptedBytes = msEncrypt.ToArray();
A C ++ para decifrá-lo é:
keyBlob.hdr.bType = PLAINTEXTKEYBLOB;
keyBlob.hdr.bVersion = CUR_BLOB_VERSION;
keyBlob.hdr.reserved = 0;
keyBlob.hdr.aiKeyAlg = CALG_AES_256;
keyBlob.cbKeySize = KEY_SIZE;
keyBlob.rgbKeyData = &byKey[0];
if ( CryptImportKey( hProv, (const LPBYTE) &keyBlob, sizeof(BLOBHEADER) + sizeof(DWORD) + KEY_SIZE, 0, CRYPT_EXPORTABLE, &hKey ) )
{
if ( CryptSetKeyParam( hKey, KP_IV, (const BYTE *) &byIV, 0))
{
DWORD dwLen = iDestLen;
if ( CryptDecrypt( hKey, 0, TRUE, 0, pbyData, &dwLen))
{
if ( dwLen < (DWORD) *plOutSize)
{
memcpy_s(pbyOutput, *plOutSize, pbyData, dwLen);
*plOutSize = dwLen;
bRet = TRUE;
}
}
else
{
// Log
DWORD dwErr = ::GetLastError();
int y =0;
}
}
}
Eu estou chamando CryptAcquireContext com sucesso e meu C ++ está executando bem. Qualquer pessoa pode manchar o erro nos meus caminhos. Está começando a me deprimir saber: (
Solução
Ok minha culpa, eu não incluem a estrutura def para o keyblob no C ++ e verifica-se que você precisa de um bloco contigous de dados para a chave com o cabeçalho mas eu estava usando o exemplo MSDN que tinha um ponteiro para os dados da chave. Que é errado!
Outras dicas
Eu vejo que você está usando o modo de encadeamento CBC para criptografar o texto simples.
Tem certeza de que estão usando o mesmo modo de encadeamento para descriptografar o texto cifra?
(eu sinto muito. Eu não sou capaz de entender que a partir do código)
Há um punhado de coisas que você deve verificar, uma vez que parte do código (declarações etc) estão faltando:
- Bloco de tamanho - isso geralmente deve ser o mesmo que o tamanho da chave, acho que pode até ser o padrão desde que você não especificá-lo no lado C ++. Configurá-lo para 256 no lado C #, eu acho que é melhor que você especificá-lo explicitamente em C ++ também.
- Padding - as classes gerenciadas têm PKCS7 como seu preenchimento padrão, I pensar seu padrão para funções CryptoAPI também, mas eu não tenho certeza .
- Presumo que GetPassPhrase, GetIV etc dar-lhe ele mesmas teclas que você está usando no C ++ lado?
- Não está claro como os dados criptografados é passado entre os programas, é possível que haja algum tipo de erro de tradução? Por exemplo. base64, URL codificar, etc.