Aes
NIST 矢量 AES-CBC-128 解密失敗
我正在學習/探索用於加密和解密數據的 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() 時我錯過了什麼嗎?