Openssl

使用 OpenSSL 解密時的額外字節

  • July 7, 2021

該字元串使用以下屬性加密(使用 C#):

myAes.Mode = CipherMode.CBC

myAes.KeySize = 128

myAes.Padding = PaddingMode.PKCS7

myAes.BlockSize = 128

myAes.FeedbackSize = 128

密鑰:5753B8AA97BE5B5D9584864DF3134E64

這是我的解密功能:

int AESdecrypt(unsigned char *ciphertext, size_t ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext)
 {
   EVP_CIPHER_CTX *ctx;

   int len;
     int retErrors=1;

   int plaintext_len;

   /* Create and initialise the context */
   if(!(ctx = EVP_CIPHER_CTX_new()))
   {
       LOGF_TRACE("\t Error in EVP_CIPHER_CTX_new");
       EVP_CIPHER_CTX_free(ctx);
       return 0;
   }

   /*
    * Initialise the decryption operation. IMPORTANT - ensure you use a key
    * and IV size appropriate for your cipher
    * In this example we are using 256 bit AES (i.e. a 256 bit key). The
    * IV size for *most* modes is the same as the block size. For AES this
    * is 128 bits
    */
   if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
   {
     LOGF_TRACE("\t Error in EVP_DecryptInit_ex");
     EVP_CIPHER_CTX_free(ctx);
     return 0;
   }

   /*
    * Provide the message to be decrypted, and obtain the plaintext output.
    * EVP_DecryptUpdate can be called multiple times if necessary.
    */
   if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
   {
     LOGF_TRACE("\t EVP_DecryptUpdate");
     EVP_CIPHER_CTX_free(ctx);
     return 0;
   }
       
   plaintext_len = len;

   /*
    * Finalise the decryption. Further plaintext bytes may be written at
    * this stage.
    */
   if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len))
   {
     LOGF_TRACE("\t EVP_DecryptFinal_ex");
     EVP_CIPHER_CTX_free(ctx);
     return 0;
   }
       
   plaintext_len += len;

   /* Clean up */
   EVP_CIPHER_CTX_free(ctx);

   return plaintext_len;
 }

但是,當我嘗試解密生成的字元串時,結果字元串有 16 (0x10) 個額外字節:(出於安全原因,刪除了一些字元)。

0000 - 2e 3c 81 6b ed 2e 6b 59-fe 38 ae b7 56 11 1f c2   .<.k..kY.8..V...

0010 - 45 53 54 41 20 45 53 20-55 4e 41 20 50 52 55 45   ESTA ES UNA PRUE

0020 - 42 41 20 44 45 20 43 49-46 52 41 44 4f 20 41 45   BA DE CIFRADO AE

0030 - 53 20 50 41 52 41 20 45-54 48 45 52 4e 45 54 20   S PARA ETHERNET

0040 - XX XX XX XX XX XX XX XX-XX XX XX                  XXXXXXXX

我想知道這是否正常,我應該刪除前 16 個字節或如何避免這些額外的字節(這對我來說感覺不正常)。

這可能與他們用於加密的 IV 有關嗎?

謝謝。

從您的症狀來看,IV 似乎包含在密文中(作為前 16 個字節);當您呼叫 AESdecrypt 時,您將其保持打開狀態。

如果是這樣,那麼您有兩個選擇:

  • 從密文中提取前16個字節;將這 16 個字節作為 IV 傳遞,其餘的(即刪除前 16 個字節)作為密文傳遞
  • 做你正在做的事,剪掉解密明文的前 16 個字節。

順便說一句:對於 CBC 模式,包含某種消息身份驗證程式碼(無論是 CMAC、HMAC 還是其他)通常是一個好主意,以確保有人無法在不被發現的情況下修改密文(否則攻擊者可能會能夠修改密文並控制如何修改解密)。您是否正在採取措施防止這種情況發生?

引用自:https://crypto.stackexchange.com/questions/91936