2016-10-21 2 views
-2

Я пытаюсь написать реализацию 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; 
     } 

Я попытался все режимы заполнения, не повезло. Любые идеи о том, что может быть проблемой?

+0

Вы работаете здесь с 'char []' и 'byte []'. Как именно вы перемещаете зашифрованный текст от одного к другому? Имейте в виду, что вы не можете копировать и вставлять двоичные данные. –

+0

Также попробуйте сразу же после swEncrypt.Write (plainText); add swEncrypt.FlushFinalBlock(); – Kevin

+0

Для целей тестирования просто сбросить байты в файл на C# и прочитать их в C. – user2296277

ответ

0

Ошибка указывает, что encrypted_text_len % 16 != 0.

Вам следует дважды проверить, что вы не получаете случайную новую строку в своем буфере, если вы читаете из файла.

Смежные вопросы