Openssl
使用 OpenSSL 解密時的額外字節
該字元串使用以下屬性加密(使用 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 還是其他)通常是一個好主意,以確保有人無法在不被發現的情況下修改密文(否則攻擊者可能會能夠修改密文並控制如何修改解密)。您是否正在採取措施防止這種情況發生?