2016-10-30 24 views
1

私はヒューズファイルシステムをプログラミングしています。私はポブレムを持っています。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; 
} 
+0

CBCモードは機密性のみを提供するため、通常はCBCモードを安全に使用するためにMACを追加する必要があります。 *機密性と信頼性の両方を提供するため、認証された暗号化を使用しているはずです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww

答えて

3

PKCS#7 paddingを参照してください。ブロックサイズの正確な倍数をパディングする理由は、パディングがないかどうかを判断する方法がないため、パディングが常に使用されるか使用されなくてはならないかです。データが4096バイトで、最後のバイトが0x01だったとします。パディングの1バイトのように見えますが、データの一部です。

しかし、XTSなどのディスクセクタ暗号化モードを使用する必要があります.XTSはフルディスク暗号化にのみ推奨されます。それはIEEE標準1619によって設計されたものです。

Explanation of the XTS Encryption Modeを参照してください。

またNIST:The XTS-AES Mode for Confidentiality on Storage Devices

0

は、問題は、私が4096のバイトを暗号化しようとしていたときに、それはまた、私にPADDの16のバイトを追加し、それは私のために失敗するということです。私は4096が128の倍数(サイズエースブロック)であるため、なぜパディングを追加しているのかわかりません。

Zaphが述べたように、PKCS#7パディングが追加されています。パディングは確定的なので、16バイトの正確な倍数もパディングされて確実に削除されます。それ以外の場合、(1)プレーンテキストが(2)プレーンテキストの場合、(2)プレーンテキストがでなく、が16バイト境界で終了し、

EVP_CIPHER_CTX_ctrlEVP_CIPHER_CTX_set_paddingで暗号オブジェクトの埋め込み動作を無効にすることができます。 EVP_CIPHER_CTX_set_paddingEVP_CIPHER_CTX_ctrlのマクロ版です。 )

EVP_CIPHER_CTX_set_padding(有効またはパディングを無効にします:manページから

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding); 

:ここでは、それは次のようになります。デフォルトでは、 の暗号化操作は標準のブロック埋め込みを使用して埋められ、復号化の際には埋め込みがチェックされて削除されます。パッドパラメータ がゼロでパディングが実行されない場合、データの合計量は暗号化または復号化された がブロックサイズの倍数になるか、または エラーが発生します。


私は平文が128の倍数でない場合、パディングを追加しようとしていることを知っています。しかし、なぜそうならないのでしょうか?私に何ができる?

暗号コンテキストオブジェクトの埋め込みを無効にします。

$ grep -IR EVP_CIPHER_CTX_set_padding * 
CHANGES: *) New function EVP_CIPHER_CTX_set_padding() this is used to 
apps/enc.c:   EVP_CIPHER_CTX_set_padding(ctx, 0); 
apps/speed.c:    EVP_CIPHER_CTX_set_padding(&ctx, 0); 
crypto/cms/cms_pwri.c: EVP_CIPHER_CTX_set_padding(&kekctx, 0); 
crypto/evp/evp.h:int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); 
crypto/evp/evp_enc.c:int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad) 
crypto/evp/evp_test.c:  EVP_CIPHER_CTX_set_padding(&ctx, 0); 
crypto/evp/evp_test.c:  EVP_CIPHER_CTX_set_padding(&ctx, 0);