Aes

NIST 矢量 AES-CBC-128 解密失敗

  • October 2, 2022

我正在學習/探索用於加密和解密數據的 openssl 庫,而加密通過正常我看到獨立解密沒有按預期工作。

我正在使用的測試向量是

# Key 2b7e151628aed2a6abf7158809cf4f3c
# IV 000102030405060708090a0b0c0d0e0f
# Block #1
# Plaintext 6bc1bee22e409f96e93d7e117393172a
# Input Block 6bc0bce12a459991e134741a7f9e1925
# Output Block 7649abac8119b246cee98e9b12e9197d
# Ciphertext 7649abac8119b246cee98e9b12e9197d

我基本上想為 CT 獲取十六進製字元串並為 PT 導出十六進製字元串,我知道我需要將十六進製字元串轉換為字節,這不是問題。

現在在加密數據時我發現有 16 個字節被添加用於填充,所以我開始研究禁用填充並遇到***EVP_CIPHER_CTX_set_padding()但是在EVP_EncryptInit_ex()***之後呼叫此函式時我的程式碼段錯誤。

我基本上是在修改範例 testapp 以嘗試使其正常工作。 evp-對稱加密.c

int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key,
           unsigned char *iv, unsigned char *ciphertext)
{
   EVP_CIPHER_CTX *ctx;
   int len;
   int ciphertext_len;

   if(!(ctx = EVP_CIPHER_CTX_new()))
       handleErrors();

   if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
       handleErrors();

   #if 0
   // adding this segfaults
   printf("[%s::%d] disabling padding ... \n",__func__, __LINE__);
   if(1 != EVP_CIPHER_CTX_set_padding(ctx, 0))
       handleErrors();
   #endif

   if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
       handleErrors();
   ciphertext_len = len;

   if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
       handleErrors();
   ciphertext_len += len;

   EVP_CIPHER_CTX_free(ctx);

   return ciphertext_len;
}

我的目標是能夠加密和解密 cbc/ctr/gcm/xts 的 nist 測試向量,而無需從加密中獲得額外的填充數據。

這可能嗎 ?

如果沒有,是否可以生成填充塊?

Ciphertext is:
************
[ 0->] p :: 0x76
[ 1->] p :: 0x49
[ 2->] p :: 0xab
[ 3->] p :: 0xac
[ 4->] p :: 0x81
[ 5->] p :: 0x19
[ 6->] p :: 0xb2
[ 7->] p :: 0x46
[ 8->] p :: 0xce
[ 9->] p :: 0xe9
[10->] p :: 0x8e
[11->] p :: 0x9b
[12->] p :: 0x12
[13->] p :: 0xe9
[14->] p :: 0x19
[15->] p :: 0x7d
-------------------
// Can this below part be generated before decryption ?
[16->] p :: 0x89
[17->] p :: 0x64
[18->] p :: 0xe0
[19->] p :: 0xb1
[20->] p :: 0x49
[21->] p :: 0xc1
[22->] p :: 0xb
[23->] p :: 0x7b
[24->] p :: 0x68
[25->] p :: 0x2e
[26->] p :: 0x6e
[27->] p :: 0x39
[28->] p :: 0xaa
[29->] p :: 0xeb
[30->] p :: 0x73
[31->] p :: 0x1c
************

呼叫 EVP_CIPHER_CTX_set_padding() 時我錯過了什麼嗎?

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