私はヒューズファイルシステムをプログラミングしています。私はポブレムを持っています。AES暗号オブジェクトのPKCS#7パディングを無効にしますか?
CBC AESを使用してディスク内のデータを暗号化しています。問題は、パディングです。暗号化するサイズが例えば15バイトの場合は問題ありません。これは1バイトの余分を追加するためです。問題は、私が4096バイトを暗号化しようとしているときに、paddの16バイトを追加して、それが私のために失敗するということです。私は4096が128の倍数(サイズエースブロック)であるため、なぜパディングを追加しているのかわかりません。私は必要とされるときにのみパディングを追加するopensslに変更する必要がありますが、必ずしもそうではありません...
私は、平文が128の倍数でない場合、パディングを追加することを知っています。しかし、なぜそうならないのでしょうか?私に何ができる?
ここに私の暗号コード:
int encrypt_data(unsigned char *plaintext, int plaintext_len, unsigned char *key,
unsigned char *iv, unsigned char *ciphertext, int algorithm_pos)
{
EVP_CIPHER_CTX *ctx;
int len;
int ciphertext_len;
/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
/* Initialise the encryption 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_EncryptInit_ex(ctx, ciphers[algorithm_pos].algorithm(), NULL, key, iv))
handleErrors();
/* Provide the message to be encrypted, and obtain the encrypted output.
* EVP_EncryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
handleErrors();
ciphertext_len = len;
/* Finalise the encryption. Further ciphertext bytes may be written at
* this stage.
*/
if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors();
ciphertext_len += len;
/* Clean up */
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
}
CBCモードは機密性のみを提供するため、通常はCBCモードを安全に使用するためにMACを追加する必要があります。 *機密性と信頼性の両方を提供するため、認証された暗号化を使用しているはずです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww