opensslのaes暗号化

6729 ワード

本論は次から次へhttp://yuanshuilee.blog.163.com/blog/static/21769727520140942826137/
opensslのaes暗号化(AEScuncryptとAEScuncryptのプログラミング事例)  
2014-01-09 16:28:26|  分類:ソフトウェアの安全及び伝送の告発 購読する
先日のブログに続きます。 
opensslのaes暗号化(ソース分析AESquncryptとAEScucuncrypt、暗号化モード)
今はAESの暗号化インターフェースを利用して暗号解読プログラムとインターフェースパッケージを行います。について
開発環境は最後に見ます。
前のブログはcbcの暗号化とecbの暗号化を深く了解しました。
cbc暗号解読コード。
萼include菷胫include胫胫include胫デfine AES_BITS 128菷デfine MSG_LEN 128 int aes_encrypt(char*in、char*key、char*out)/、int olen)は、buf長さ{if(!in?!key?!out)return 0;unsigned char iv[AESuBLOCKuSIZE];/暗号化されたベクトルは、一般的に設定されます。[i]=0;AESkyKEY aes;if(unsigned char*)key,128,&aes)<0){return 0;}int len=strelen(in)//ここの長さはchar*inの長さですが、inの中に'\0'文字が含まれていると
//では、前の'\0'の前の部分だけ暗号化されますので、このlenはパラメータとして伝わってきます。レコードinの長さです。
/解読も同じことです。文字列の長さを'0'で判断するだけでは確かに不適切です。後は同じことです。AESchucbcuencrypt((unsigned char*),(unsigned char*)out,len,&aes,iv,AESturn CRYPT);return 1;keturn 1;echact=============================================================================================out)return 0;unsigned char iv[AESuBLOCK KuSIZE];/暗号化の初期化ベクトルfor(int i=0;i上の図は実行プログラムのテスト結果です。暗号解読が完了しました。
ここからも分かるように、
AEScancyptのパラメータは主に使用されています。lenは暗号化されたデータ長です。暗号化によってAESquncryptが呼び出されました。この関数は毎回16バイトしか暗号化できません。だから、outの長さは16の整数倍か、少なくともinの長さの最小16倍以上でなければなりません。これで本当に暗号解読が完了します。バイト数は、0を充てんするのに相当します。
AESchucbc encrypt((unsigned char*)in(unsigned char*)out,len,&aes,iv,AESquxPT)
PS:コード作成中にもう一回、暗号化に成功しましたが、復号に失敗しました。なぜか分かりませんでした。コードの赤い部分に注意してください。
AEScult-uencryptukey

AEScultryptukey
は異なります。同時に暗号化と復号のパラメータです。
AESグループと
AESuDECRYPTも違っていますので、細かいところを忘れてしまい、問題が発生して時間が無駄になってしまう可能性がありますので、特に注意してください。
今、使います
aescancryptは暗号化方式をカプセル化します。このようにすると、中は他の暗号化方式でもいいです。cfbやoffなどは大丈夫です。メイン関数はもう変えなくてもいいです。
以下、使用についても説明します。
AEScuncryptは暗号解読を行うコードです。インターフェースの内容を修正するだけで、主関数は変化しないので、与えられません。使用することが分かります。
AESchengryptは毎回16バイトのものしか暗号化できません。足りなければ充填が必要です。だから、inとoutの長さは16倍数でなければなりません。実は、テストしてみたら、inは16倍数ではないことが分かりました。しかし、暗号化アルゴリズムは16バイト読みます。つまり、inの後の16バイトを読み続けます。知らないものを読みました。復号も同じです。もし空間が足りないなら、プログラムはOutの後のアドレスに暗号化された内容を満たしてもいいです。この場合、自分で文字の長さを厳しくコントロールして、暗号化アルゴリズムは毎回16バイトのグループを暗号化することができます。
ですから、私が書いたインターフェースは、長さパラメータを増やす必要があります。
ps:もう一つの詳細がありますが、bufの長さは16の倍数+1に設定したほうがいいです。最後のバイトは0に設定して、終端符として通知します。16の倍数を設定したら、暗号化された暗号文はちょうどbufを満たしています。印刷する時、終端符が見つからないので、多くのものを打ちます。
int aeschenrypt(char*in,char*key,char*out)//,int olen)
{
if

in
124 124

key
124 124

out
)
return
0
;
AESque aes
;
if(AESchetancryptukey((unsigned char*)key,128,&aes)<0)
{
return
0
;
)
要点
len
を選択します。
streen
(
in
を選択します
エンエンエン
を選択します。
0
;
while
(
エンエンエン
<>
len
)
//入出力文字列が長く、かつAESuBLOCKuSIZEの整数倍であるため、厳密な制限が必要です。
{
AEScuncrypt
(
unsigned
char
*)
in
を選択します。
(
unsigned
char
*)
out
を選択します。
&
はい
)0
in
+=
AEScuuBLOC KuSIZE
;
out
+=
AEScuuBLOC KuSIZE
;
エンエンエン
+=
AEScuuBLOC KuSIZE
;
)
return
1
;
)
要点
aescadecrypt
(
char

in
を選択します。
char

key
を選択します。
char

out
)
{
if

in
124 124

key
124 124

out
)
return
0
;
AESque aes
;
if(AEScustryptukey((unsigned char*)key,128,&aes)<0)
{
return
0
;
)
要点
len
を選択します。
streen
(
in
を選択します
エンエンエン
を選択します。
0
;
while
(
エンエンエン
<>
len
)
{
AESudiecrypt
(
unsigned
char
*)
in
を選択します。
(
unsigned
char
*)
out
を選択します。
&
はい
)0
in
+=
AEScuuBLOC KuSIZE
;
out
+=
AEScuuBLOC KuSIZE
;
エンエンエン
+=
AEScuuBLOC KuSIZE
;
)
return
1
;
)
以上の暗号解読の結果です。よく観察すれば、二つの暗号化方式で得られた暗号文が分かります。
前の16バイトは同じです。後ろのバイトは違います。これはcbcモードは初期化ベクトルを使っています。初期化ベクトルは0に設定されています。機能しないのに等しいです。cbcモードの暗号化も呼び出されました。
AESchengryptインターフェースですので、前の16バイトは同じです。次の内容は前回得た暗号文に対して異文化が行われますので、違います。
cbc暗号化とecb暗号化については、強く推奨します。
opensslのaes暗号化(AESquncryptとAEScucuncrypt、暗号化モード)は、非常に良い理解と入門です。
開発環境:
私はuuntu 12.04です。opensslをインストールします。下のリンクを参照してください。
uuntu 12.04ソースコンパイルopenssl 1.0.1 eとmd 5 test.cのテストコードをインストールします。
コンパイル環境については、CodeBlocksを使っています。直接makefileを使っても大丈夫です。下記のリンクを参照してください。
http://yuanshuilee.blog.163.com/blog/static/21769727520140241346693/
参考資料:
opensslのaes暗号化(ソース分析AESquncryptとAEScucuncrypt、暗号化モード)
http://blog.csdn.net/qncj666/article/details/8244893 (最初の参照コードソース)
http://fossies.org/dox/openssl-1.0.1f/index.html (詳細ソース)
http://www.cnblogs.com/adylee/archive/2007/09/14/893438.html