openssl aes暗号化(およびソースコード分析AES_encrypt AES_cbc_encrypt、暗号化モード)
Openssl Aes Encryption
最初に、AES暗号化、暗号化モード、およびいくつかの違いを理解する必要があります。プログラムの後です。特定のプログラミングケース、以下のリンク。
openssl aes暗号化(AES_cbc_encryptおよびAES_encryptプログラミングの場合)
次のリンクに詳細な図があります。http://www.cnblogs.com/adylee/archive/2007/09/14/893438.html
int aes_encrypt(char* in, char* key, char* out)//, int olen) { if(!in || !key || !out) return 0 AES_KEY aes if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) <0) { return 0 } int len=strlen(in)/AES_BLOCK_SIZE*AES_BLOCK_SIZE, en_len=0 while (en_len AES暗号化アルゴリズム - 暗号化モード
ECBモード長所:1。シンプル2.並列計算を容易にする3.エラーが送信されない短所:1。プレーンテキストモードで非表示にできない2.可能性のあるイニシアチブプレーンテキスト攻撃CBCモード:長所:1。攻撃へのイニシアチブ、セキュリティはECBで良好であり、パケットの伝送長が長いため、SSL、IPSec標準です。短所:1は並列計算を助長しません2.エラー伝播3。初期化ベクトルIVが必要CFBモード:長所:1。プレーンテキストモード2で隠され、ストリーム暗号モードになります3.タイムリーに暗号化された送信パケットデータが以下になります短所:1は並列計算に役立ちません2.送信エラー:複数の衝撃による損傷ユニットセルプレーンテキスト3.唯一のIVofbモード:長所:1。プレーンテキストモード2で隠され、ストリーム暗号モードになります3.タイムリーに暗号化された送信パケットデータが少ない短所:1は並列計算に役立ちません2.アクティブプレーンテキストへの攻撃が可能です。3。送信エラー:ユニットセルプレーンテキストへの複数の衝撃損傷
これらの暗号化モードを知っていると、opensslによって提供されるインターフェースは理解しているように見えます。 AES_encrypt AES_decrypt
openssl提供したaes暗号化インターフェース
'crypto / aes / aes.h'からの次のインターフェイスには、opensslソースがあります。 //暗号化および復号化デバイスを設定しますintAES_set_encrypt_key(const unsigned char * userKey、const int bits、AES_KEY * key)int AES_set_decrypt_key(const unsigned char * userKey、const int bits、AES_KEY * key)
//デフォルトの暗号化と復号化の方法論、パラメータは理解しやすいvoid AES_encrypt(const unsigned char * in、unsigned char * out、 const AES_KEY * key) void AES_decrypt(const unsigned char * in、unsigned char * out、 const AES_KEY * key)
//ここでも一般的に使用される暗号化方式ですが、多くのパラメーター、およびほとんど導入されていないソースパラメーターは、void AES_ecb_encrypt(const unsigned char * in、unsigned char * out、const AES_KEY * key、const int enc)void AES_cbc_encrypt(const unsigned char * in、unsigned char * out、 size_t length、const AES_KEY * key、 unsigned char * ivec、const int enc)//パラメータは比較的複雑void AES_cfb128_encrypt(const unsigned char * in、unsigned char * out、size_t length、const AES_KEY * key、unsigned char * ivec、int * num、const int enc)void AES_cfb1_encrypt(const unsigned char * in、unsigned char * out、size_t length、const AES_KEY * key、unsigned char * ivec、int * num、const int enc)void AES_cfb8_encrypt(const unsigned char * in、unsigned char * out、size_t length、const AES_KEY * key、unsigned char * ivec、int * num、const int enc)void AES_ofb128_encrypt(const unsigned char * in、unsigned char * out、size_t length、const AES_KEY * key、unsigned char * ivec、int * num)void AES_ctr128_encrypt(const unsigned char * in、unsigned char * out、size_t length、const AES_KEY * key、unsigned char ivec [AES_BLOCK_SIZE]、unsigned char ecount_buf [AES_BLOCK_SIZE]、unsigned int * num)
次のファイルからわかるように、 AES_encrypt Ecbは暗号化です。そしてAES_set_encrypt_keyの間AES_encrypt、 'crypto / aes /での実装aes_x86core.c 'および'crypto / aes /aes_core.c '、つまり、選択したプラットフォームに応じて2つのバージョンがあります。ソースコードを見てください。 int aes_encrypt(char* in, char* key, char* out)//, int olen) { if(!in || !key || !out) return 0 AES_KEY aes if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) <0) { return 0 } int len=strlen(in)/AES_BLOCK_SIZE*AES_BLOCK_SIZE, en_len=0
' 暗号/ aes / aes_ecb.c ' ボイド AES_ecb_encrypt (( const 署名なし char * に 、 署名なし char * アウト 、 const AES_KEY * キー 、 const int enc )。 (( AES_DECRYPT == enc )) もし (( AES_ENCRYPT == enc )。 AES_encrypt (( に 、 アウト 、 キー )。 そうしないと AES_decrypt (( に 、 アウト 、 キー )。 ここからわかるように、ecb暗号化方式AES_encryptインターフェイスの実装。
特定のソースコードディレクトリ以下を実現するために、別の場所でCbc暗号化された方法。 char *lptmp = new char[len+1]
ボイドAES_cbc_encrypt((const 署名なし char *に、 署名なし char *アウト、 size_tlen、 constAES_KEY*キー、 署名なし char *ivec、 const intenc)。 {{ もし ((enc)。 CRYPTO_cbc128_encrypt((に、アウト、len、キー、ivec、(block128_f)。AES_encrypt)。 そうしないと CRYPTO_cbc128_decrypt((に、アウト、len、キー、ivec、(block128_f)。AES_decrypt)。 }
ここから見て、cbc暗号化、通話インターフェースCRYPTO_cbc128_decrypt、そしてそれは順番に AES_encryptパラメータとして 。
memset(lptmp, ' ', len+1) while (en_len lptmp
+=AES_BLOCK_SIZE en_len+=AES_BLOCK_SIZE
'暗号/モード/ cbc128.c ' ボイド CRYPTO_cbc128_encrypt (( const 署名なし char * に 、 署名なし char * アウト 、 size_t len 、 const ボイド * キー 、 署名なし char ivec [ 16 ]、 block128_fブロック )。 {{ //ここのブロックはAES_encrypt size_t n const unsigned char * iv = ivec assert(in && out && key && ivec) #if!defined(OPENSSL_SMALL_FOOTPRINT) if(STRICT_ALIGNMENT && ((size_t)in |(size_t)out |(size_t)ivec)%sizeof(size_t)!= 0){ while(len> = 16){ for(n = 0 n<16 ++n) out [n] = in [n] ^ iv [n] //初期化ベクトル入力XOR、保存済み (*ブロック)(出力、出力、キー) //転送AES_encrypt暗号化、暗号化XOR結果を入力出力として //出力も暗号化された裏返しに保存されます iv =アウト //暗号化するための初期化後のベクトルとしての前の暗号文 len- = 16 + = 16で アウト+ = 16 } } そうしないと { while(len> = 16){ for(n = 0 n<16 n+=sizeof(size_t)) *(size_t *)(out + n)= *(size_t *)(in + n)^ *(size_t *)(iv + n) (*ブロック)(出力、出力、キー) iv =アウト len- = 16 + = 16で アウト+ = 16 } } #endif while(len){ for(n = 0 n<16 && n呼び出し例:
// hex (lptmp) then find the first data block is encrypted result and back to the error, a lot of encrypted data is 0, the check openssl
最近ピットに遭遇しました、 // Source code for this piece of aes encryption and decryption is thread-safe, does anyone know the reason?
}
精神的に疲れ果てて崩壊寸前の4、5日を投げることができるこれらの2つの機能は、直面している課題が回避するのではなく、それを取り除く必要があるため、悪魔が所有している可能性があります! if(lptmp)
{
delete []lptmp
lptmp = NULL
} return 1 }
'crypto/aes/aes_cbc.c'
|_+_|
|_+_|
最後に、リンクは、AESインターフェースのopensslプログラムを使用します。 aes opensslのプログラミング(AES_cbc_encryptおよびAES_ENCRYPT) 参照: http://www.baike.com/wiki/AES%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95 (インタラクティブ百科事典)