2017-06-22 5 views
1

ErlangでAES 256ビットCBCを暗号化してから、それをCコードで解読する際に問題があります。 ErlangとCでは暗号化/復号化が機能しますが、暗号化/復号化では機能しません。ErlangでのAES-256/CBC暗号化とCでの復号化が動作しない

Ivec = "1200000000000000", 
Key = "586E36EEE726B37F70A6F7B770764E99", 
Data = "encrypt[38ce517c95b011bbfc999f36d09e4feb92d22dd8,38ce517c95b011bbfc999f36d09e4feb92d22222]", 
PaddedText = string:left(Data ++ ",",128,$0), 
%%Data is "encrypt[38ce517c95b011bbfc999f36d09e4feb92d22dd8,38ce517c95b011bbfc999f36d09e4feb92d22222],0000000000000000000000000000000000000" 
EncryptedText = crypto:block_encrypt(aes_cbc256, Key, Ivec, PaddedText), 
%%Send to C code 

とCコード

unsigned char *key = (unsigned char *)"586E36EEE726B37F70A6F7B770764E99"; 
unsigned char *iv = (unsigned char *)"1200000000000000"; 

EVP_CIPHER_CTX *ctx; 
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv) 
EVP_DecryptUpdate(ctx, plaintext, &len, buf, buf_len) 

私が手にエラーが

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539: 

私はErlangで復号化すると、それが正常に動作し、私はCで暗号化したときに、それはまた同じで正常に動作していますキーとIV。 暗号モードが一致しません。それは私には正しいように見えますが。 すべてのポインタが本当に便利です。 ありがとう

私は、同じデータを暗号化し、Cで復号化してからHexダンプを作成しました。実際の暗号化データErlangはsenginhは128バイトで、C opensslライブラリで暗号化された同じデータは144バイトです。通常の暗号テキストは通常​​長いです。ここに出力があります。 Erlangのバイナリ

はEnry​​ption後に返さ:

<<165,171,208,104,24,97,173,130,177,99,50,22,51,180,112,123,36,18,208,170,250,131,195,162,182,162,253,14,121,242,61,60,202,172,74,121,223,50,128,255,134,51,253,91,195,174,90,93,77,65,1,115,119,64,25,131,47,245,68,156,163,145,111,125,143,208,255,53,131,220,174,243,64,120,229,21,86,107,139,148,164,39,144,106,232,64,252,234,26,208,138,187,213,244,210,11,174,47,126,4,97,179,194,85,8,207,116,140,236,3,145,209,95,106,36,121,241,228,153,120,226,125,227,138,130,183,217,39>> 

これはErlangの

Encrypted = 128 

a5 ab d0 68 18 61 ad 82 b1 63 32 16 33 b4 70 7b 
24 12 d0 aa fa 83 c3 a2 b6 a2 fd 0e 79 f2 3d 3c 
ca ac 4a 79 df 32 80 ff 86 33 fd 5b c3 ae 5a 5d 
4d 41 01 73 77 40 19 83 2f f5 44 9c a3 91 6f 7d 
8f d0 ff 35 83 dc ae f3 40 78 e5 15 56 6b 8b 94 
a4 27 90 6a e8 40 fc ea 1a d0 8a bb d5 f4 d2 0b 
ae 2f 7e 04 61 b3 c2 55 08 cf 74 8c ec 03 91 d1 
5f 6a 24 79 f1 e4 99 78 e2 7d e3 8a 82 b7 d9 27 

これは、同じデータFOFのOpenSSL(C)ライブラリーの出力であることにより、送信されます。

Encrypted = 144 

a5 ab d0 68 18 61 ad 82 b1 63 32 16 33 b4 70 7b 
24 12 d0 aa fa 83 c3 a2 b6 a2 fd 0e 79 f2 3d 3c 
ca ac 4a 79 df 32 80 ff 86 33 fd 5b c3 ae 5a 5d 
4d 41 01 73 77 40 19 83 2f f5 44 9c a3 91 6f 7d 
8f d0 ff 35 83 dc ae f3 40 78 e5 15 56 6b 8b 94 
a4 27 90 6a e8 40 fc ea 1a d0 8a bb d5 f4 d2 0b 
ae 2f 7e 04 61 b3 c2 55 08 cf 74 8c ec 03 91 d1 
5f 6a 24 79 f1 e4 99 78 e2 7d e3 8a 82 b7 d9 27 
f7 01 c0 ed 95 e3 14 e5 d2 62 21 da a9 1d 2a e7 

最後の16バイトがErlangにありません。 Erlang Cryptoライブラリから呼び出す必要がある他のAPIはありますか?

+0

「データ」は16進数のように見えますが、コンマが入りますが、コンマについてのヒントはありますか? 16進数で暗号化された出力が役立ちます。 – zaph

+0

バイナリデータをCに送信する直前に送信し、Cで受信した時点でバイナリデータを送信できますか? –

+0

カンマは2つの異なるキーを分けるだけです(内部使用) – user3404572

答えて

3

あなたが見ているのは、の詰め物の違いです。 OpenSSLは、PKCS#7定義のパディングスキームを使用して常にパッドします。 Erlangでは平文を0で埋めます(これはゼロ埋め込みと呼ばれます)の前に、の暗号を使用して暗号化します。暗号自体はパッドされていません(そうです)。

プレーンテキストは、OpenSSLルーチンによってプレーンテキストに追加されます(16進数での16バイトからなる)、パディングのフルブロックは16(128ビット、AESのブロックサイズ)の倍数であるためです。あなたが暗号文を一致させたい場合は

だからEVP_CIPHER_CTX_set_padding(0)を使用する必要があります。

EVP_CIPHER_CTX_set_padding()を有効またはパディングを無効にします。デフォルトでは、暗号化操作は標準のブロック埋め込みを使用して埋められ、埋め込みは復号化の際にチェックされ、削除されます。 padパラメーターがゼロでパディングが実行されない場合、暗号化または復号化されたデータの総量は、ブロック・サイズの倍数でなければなりません。

+0

明示的Erlangのアプリケーションレベルのパディングでは、アプリケーションレベルのアンパッディングもあるようです。既に埋め込まれた平文を埋め込むことは意味がありません。だから私はErlangでPKCS#7パディングを実装する方法を示す代わりに、この道を踏み出しました。 –

+0

Maartenありがとう、あなたが言っていることを理解して、上記のAPIを使い、まずコマンドラインを使って-nopadで暗号化し、-n​​opadで解読しようとしました。できます。しかし、上記のAPIを使用してはいません。 -nopadが他のAPIを呼び出しているかどうかは分かりませんが、docにはあなたが言及したことが記載されています。 APIを解読するコンテキストを渡す前に、私はctx = EVP_CIPHER_CTX_new()を実行しました。およびEVP_CIPHER_CTX_set_padding(ctx、0); – user3404572

+0

'init'の呼び出しの後に' set_padding'関数*を呼び出してみることができますか?私は 'init'への呼び出しがそれをPKCS#7に戻すと仮定します。 –