Я пытаюсь написать реализацию C# для шифрования сообщений AES CBC. Цель состоит в том, чтобы «правильно» зашифровать сообщение на C#, чтобы реализация C могла должным образом расшифровать его.Разница между шифрованием AES/CBC между реализациями C и C#
: C реализация дешифрования выглядит следующим образом (с использованием OpenSSL):
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) {
handleErrors();
}
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, (unsigned char*)key, (unsigned char*)iv)) {
handleErrors();
}
if(1 != EVP_DecryptUpdate(ctx, (unsigned char*)plaintext, &len, (unsigned char*)encrypted_text, encrypted_text_len)) {
handleErrors();
}
plaintext_len = len;
if(1 != EVP_DecryptFinal_ex(ctx, (unsigned char*)plaintext + len, &len)) {
//Error happens here...
}
Я получаю следующее сообщение об ошибке:
error: digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518:
C# код:
static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
{
byte[] encrypted;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
aesAlg.Mode = CipherMode.CBC;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
Я попытался все режимы заполнения, не повезло. Любые идеи о том, что может быть проблемой?
Вы работаете здесь с 'char []' и 'byte []'. Как именно вы перемещаете зашифрованный текст от одного к другому? Имейте в виду, что вы не можете копировать и вставлять двоичные данные. –
Также попробуйте сразу же после swEncrypt.Write (plainText); add swEncrypt.FlushFinalBlock(); – Kevin
Для целей тестирования просто сбросить байты в файл на C# и прочитать их в C. – user2296277