南京郵電大学のネットワーク情報セキュリティ-OpenSSL暗号化データ実験(実験2)
OpenSSLをダウンロードしてコンパイルする
OpenSSLダウンロード
OpenSSLのダウンロードリンクはhttp://www.openssl.org/source/です。ここで対応するダウンロード方法を見つけてください。
はしごがある場合があることに注意してください。そうでない場合、ダウンロードがかなり遅くなる可能性があります。もちろん、中国でも見つけることができます。ミラーリングは不可能ではありません。
ダウンロード時に適切なバージョンを見つけることに注意してください。i386はIA32アーキテクチャ(32ビットシステム)に対応し、amd64はx86-64アーキテクチャ(64ビットシステム)に対応し
ます。アーキテクチャ)、アーキテクチャはamdによって提案され、interによって開発されたため、2つのタイトルがあります。
OpenSSLコンパイル
解凍
ダウンロードしたコンテンツをUbuntuに置くだけです。
次に、解凍コマンドを実行します
user1@ubuntu:~/Desktop$ tar -xzvf openssl-3.0.0-alpha6.tar.gz
ここでのxzvfパラメータの意味は次のとおりです。
- x:tar形式のファイルを解凍します
- v:解凍時に詳細情報を表示する
- z:gzipプログラムを使用して解凍します
- f:アーカイブを使用
構成
解凍が完了したら、
フォルダ内で実行するフォルダを確認してください
user1@ubuntu:~/Desktop/openssl-3.0.0-alpha6$ ./Configure
これは、元の実験で入力する指示とは異なります。元の指示は次のとおりです。
./config –prefix=/usr/local
ここでそれについてお話しましょう。-perfixパラメータは、ソフトウェアのインストールパスを指定することを意味します。Ubuntuの仕様を尊重し、変更しないことを選択します。同時に、インストールパスのデフォルト計画を次のように記述します。
ファイルタイプ | 道 |
---|---|
バイナリーファイル | usr \ local \ bin |
設定ファイル | usr \ local \ etc |
ライブラリファイル | usr \ local \ local |
コンパイル
元のフォルダーでmakeコマンドを実行します
user1@ubuntu: make & make install
このとき、
出力が完了するのを待っている画面に多くの出力があります。指示を入力してください
user1@ubuntu: make test
テストが進行中であることがわかります。
なお、テストの過程で多少の誤差が生じる可能性がありますが、原則として十分対応できるため、これらの機能を使用していない可能性があるため、ここでは触れません。そして、最終的なテスト結果は合格です。
次に、コマンドを実行します。このコマンドを実行することを忘れないでください。そうしないと、対応するヘッダーファイルとダイナミックライブラリが見つかりません...この場所を長い間デバッグしてきました
make install
OpenSSLを使用したプログラミング
テストファイルをコンパイルする
テストファイルのソースコードは以下の通りです
#include <stdio.h>
#include <evp.h>
int main()
{
printf("hello world!");
OpenSSL_add_all_algorithms();
return 0;
}
コンパイル
user1@ubuntu:~/Desktop/OpenSSL_Test$ gcc test.c -I /usr/local/include/openssl/ -lcrypto
パラメータの意味は次のとおりです。
- -I:ヘッダーファイルのパス
- -lxxx:リンクフェーズで動的ライブラリlibxxx.soをリンクします(ここにlibcrypto.soファイルをリンクするなど)
実験ガイドの指示に直接従った場合について話させてください(まったく同じではなく、変更された環境変数)
gcc test.c –o test –I /usr/local/openssl/include /usr/local/libcrypto.a –ldl
あなたはリンクステージを通過できないことがわかります
テストファイルが合格したかどうか
コンパイルが完了すると、次のファイル
が表示されて直接実行さ
れ、ダイナミックライブラリが見つからないというエラーが発生します。理由は、Ubuntuのデフォルトのダイナミックライブラリ検索パスが/ usr / libで、カスタムパスが/ usr / local / libであるためです。したがって、次の環境変数を設定する必要があります。
環境変数を設定します(実験ガイドに従ってインストールする場合、環境変数を設定する必要はありません)。
ダイナミックリンクライブラリ構成ファイルを開く
user1@ubuntu:~/Desktop/OpenSSL_Test$ sudo gedit /etc/ld.so.conf
独自のダイナミックライブラリパスを追加して
保存し、ダイナミックライブラリキャッシュを更新する
sudo ldconfig
もう一度実行して成功
暗号化テスト
ソースコード作成
実験ガイドのソースコードを直接使用すると、次のエラーが表示されます。
クエリした後、Opensslがバージョン1.1に更新された後、APIが少し変更されたことがわかります。変更されたソースコードは次のとおりです。
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
void tEVP_Encrypt()
{
unsigned char key[EVP_MAX_KEY_LENGTH];//密钥
unsigned char iv[EVP_MAX_KEY_LENGTH];//初始化向量
/* old usage*/
//EVP_CIPHER_CTX ctx;//EVP算法上下文
/* old usage*/
/*new usage*/
//EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
/*new usage*/
unsigned char out[1024];//输出密文缓冲区
int outl;//密文长度
int outltmp;
char *msg="Hello OpenSSL";//待加密的数据
int rv;
int i;
//设置key和iv(可以采用随机数和可以是用户输入)
for(i=0;i<24;i++)
{
key[i]=i;
}
for(i=0;i<8;i++)
{iv[i]=i;
}//初始化密码算法结构体
EVP_CIPHER_CTX_init(ctx);
//设置算法和密钥以及向量
rv = EVP_EncryptInit_ex(ctx,EVP_des_ede3_cbc(),NULL,key,iv);
if(rv!=1)
{
printf("Err\n");
return;
}
//数据加密
rv = EVP_EncryptUpdate(ctx,out,&outl,(const unsigned char*)msg,strlen(msg));
if(rv!=1)
{
printf("Err\n");
return;
}//结束数据加密,把剩余数据输出
rv = EVP_EncryptFinal_ex(ctx,out+outl,&outltmp);
if(rv!=1)
{
printf("Err\n");
return;
}
outl = outl +outltmp;
printf("Original text:%s\n",msg);
//打印输出密文
printf("Length of ciphertext:%d\n Data of ciphertext:\n",outl);
for(i=0;i<outl;i++)
{
printf("0x%02x ",out[i]);
}printf("\n");
}
int main()
{
OpenSSL_add_all_algorithms();
tEVP_Encrypt();
return 0;
}
コンパイルとテスト
/usr/bin/g++ -g /home/user1/Desktop/OpenSSL_Test/test2.cpp -o /home/user1/Desktop/OpenSSL_Test/test2 -I /usr/local/include/openssl/ -lcrypto
実行は成功する可能性があります
暗号化にopensslを使用する
プログラミングインターフェースに加えて、Opensslは顧客が使用するコマンドラインインターフェースも提供します
実験内容1:AESを使用した暗号化
実験には2つの部分があります。
- Base64あり、Base64なしの暗号化と結果の観察
- 異なるモードでの暗号化
Base64エンコード部分
まず、Base64の役割について説明しますと、Base64は基本的に、バイナリデータをASCIIコードにエンコードして電子メールを読みやすくするという1つのことだけを行います。これを知っていれば十分です。
Base64暗号化には次のコマンドを使用します
openssl enc -aes-256-cbc -salt -in lincoln.txt -out WithoutBase64.encn
パラメータの意味は次のとおりです。
- enc:暗号化
- aes-256-cbc:暗号化にaesアルゴリズムを使用、256ビットキー、CBCモード
- 塩:塩を加える
- in:入力ファイル
- out:出力ファイル
暗号化されたファイルの場合、それはバイナリファイルであり、直接開くことができないことがわかります。
バイナリ編集ソフトウェアでそれを開くと、
電子メールやqqチャットボックスから直接渡すことができないバイナリの文字化けしたコードの束であることがわかります。
Base64エンコーディングを実行するには、次の手順を使用します
openssl enc -aes-256-cbc -salt -a -in lincoln.txt -out WithBase64.encn
その中で、-aはbase64で暗号文をエンコードすることを意味し、暗号化の結果は次のようになります。ご覧のとおり、今回は読み取り可能なテキストです。
異なる暗号化方法
便宜上、ここでは暗号文にBase64エンコーディングを採用しています。
まず、CBCパケットリンクモードの暗号化を使用します。
openssl enc -aes-256-cbc -salt -a -in lincoln.txt -out WithBase64CBC.encn
暗号化された暗号文は次のとおりです
暗号化のためのEBCコードブック暗号化モード
openssl enc -aes-256-ebc -salt -a -in lincoln.txt -out WithBase64EBC.encn
暗号文は次のとおりです。
実験的な内容2:暗号文テストを変更する
暗号文ファイルを修正しましたが、修正、追加、削除のいずれかでエラー
が発生します。OpenSSLエラー制御のエラーであるはずですが、正しく行わなかった可能性もあります...
実験内容3:RSA公開鍵と秘密鍵の生成
OpenSSLの公開鍵と秘密鍵は、次の2つのステップで生成されます。
- 秘密鍵を生成する
openssl genrsa -out private.key
- 秘密鍵を使用して公開鍵を生成する
openssl rsa -pubout -in private.txt -out public.txt
生成される秘密鍵は次のとおりです。
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC49ZkZxQwo3ewJ
RHNco+9hfAeoxEZfoG4wGtznGInMYqGdivzhjCK3tBDWdl8bwiJUp6JqoRIeySwb
0xuG4KQMQ5uOtigrCPZ+Wcj5fs/Gve9tMLrT0xVtXltIdRCFuiXKPMJ9ava3oy7Q
cpEIBAhUneN/O+PLirZMmKODx9x46lKCab6T19VQM7f+dWi2aHsFqmQkccaaPSE3
nquRpF6bSggJh2US/v88tCUs7Z+VKpsoCEVumFXF28Nuq8VnLJddfO7KitRS4XWs
VdVNjwjWr2FRL/YzIayYDbJ614azr0uEyoEbT/NtW2AKYJMnqvNbybc55JSDOcLv
k6RVZ1HtAgMBAAECggEAOIjZg0b3sIYk37BMksSJJwMCVFOqLxCanZmYbArUE+US
AVW6djafZgdkHimQaKuuUrHqsy0InOBg2yBsCY4glp8TrUuAe6cBsR1AkQJyAA2O
YZHDiXu70PJGdJ9TrYx4gJiR2kQXpYn7hTt/mTOiWDrqjrl/p3d+wWrmkCFHAq4X
qpMuiBYIJNcKQa+LgUq71rHchjsNeDmKRdjId+4zBYWygcxoRL/p4cfhs7sWpk5n
5beGanFYhauTRxQzrsfsePQP3PLQSJljkXVhIFC0mASORR0WnYw3j3n6599scmRN
w6lpAU7JnTtXk3vS8CA7kXABCYAuhYHq9jSlOMgfAQKBgQDp8a0PRnj/qGiGDELk
e+PzbKArOHfCnGQJD+N0Kwd0t0jByJ4TY1poBwKSGP95o2byYQfSnssckiPkVeiH
VMY7EuYD5PzoTGdkUpIBfyOhlqABAd99x2AUPgR7/a689rZb+ewV6s+dw0/avSqs
K/c2uqGu97wx+hyAh0EnurtiMwKBgQDKZai8Cj66uwZMntoEA29NGa7IJ2Gi0zpk
OhhF6MblI+TABgl/RM21Cob/6dmRerJNU0cKgWOtdRjhuJCZozkHOC4dY3m268WR
NkbchqBMjqpJSQj1oHlZ1opOl9AyM1pDRkdbGoXrl/zxEuRwpStokeCjvaTObK/c
RZEdJfObXwKBgGTL0UHMnmOg3vAqpkOlsZB3VAdrPAZotZ1F8D1kMME0GzALTTiT
TSeXJZ9nD+QL6FY0QleYPXEg8j/2V8q/Vu2q9dnltqYsDTwna2sjqWl86ZGlifK6
jYYLNolpwvj935J/ex3yXuPdfDGF4bXu94PoI7OsX7S0y8UBAaypgwULAoGAGdog
UlxwpMNMy66ipE6YAd4c8B3vn6+hTroI7a0M8qnCBzD+N45fRBejJL8G9kkYyz2u
3k2moLpLQlGjzqwFlcF8Sm6xVkcJRkILjRF5Gi5C2/eDOHSV6362zdEgW7kpd1xb
suxRXMVeHqDOIwFF6SZw7hlEGsXRNK6CGZoGYrsCgYEAmQXSYcSU2WCF28fxFzNX
IB8G56o3iCPMUsdxkWeIVPRURjpY5QJ8G4r6LDZyltyRIcNEF3Ak/NiJL//LWbPQ
44KxH2KeIcOcTF6Nr65u8YFLHtUj4AUSgdjN4+jicxk2cOhwXzogpOKf4tRePYrc
mwi8n7PJhj2bgzoaxwULXnQ=
-----END PRIVATE KEY-----
公開鍵は次のとおりです。
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuPWZGcUMKN3sCURzXKPv
YXwHqMRGX6BuMBrc5xiJzGKhnYr84Ywit7QQ1nZfG8IiVKeiaqESHsksG9MbhuCk
DEObjrYoKwj2flnI+X7Pxr3vbTC609MVbV5bSHUQhbolyjzCfWr2t6Mu0HKRCAQI
VJ3jfzvjy4q2TJijg8fceOpSgmm+k9fVUDO3/nVotmh7BapkJHHGmj0hN56rkaRe
m0oICYdlEv7/PLQlLO2flSqbKAhFbphVxdvDbqvFZyyXXXzuyorUUuF1rFXVTY8I
1q9hUS/2MyGsmA2yeteGs69LhMqBG0/zbVtgCmCTJ6rzW8m3OeSUgznC75OkVWdR
7QIDAQAB
-----END PUBLIC KEY-----
RSAアルゴリズムでは、鍵の長さが長いほど多くのリソースが消費されます。デジタル署名の場合、秘密鍵は1回だけ使用する必要がありますが、公開鍵は複数回使用する必要があります。したがって、全体的な観点から、秘密鍵は公開鍵よりも優れています。もっと長く。
実験4:デジタル署名
次のデジタル署名の手順を使用します。
次のデジタル署名プロセスを確認します。最初にハッシュ処理を実行し、次にハッシュ値に署名します。
openssl dgst -sha1 -sign private.txt -out mytest.dig mytest
パラメータ:
- dgst:ダイジェスト、デジタル署名
- sha1:ハッシュにはsha1を使用
- sign:署名キー
署名はバイナリシーケンスであるため、通常は開けないこと、Opensslは署名ツールにBase64トランスコーディングツールを提供していないことを指摘する必要があります。
次の手順を使用して署名を検証します
openssl dgst -sha1 -verify pubkey.pem -signature B13040450.sha1 B13040450
検証成功:
総括する
一般的に言えば、この実験にはUbuntuでのコンパイルとプログラミングが含まれますが、opensslを使用する人が多く、コンパイルプロセスに「錬金術」がないためと考えられます。そして、テストのソースコードが与えられているので、全体的に比較的簡単です。最初の実験と比較すると、ソフトウェアの使用を含まないため、全員のWireSharkバージョンに一貫性がないため、WireSharkを使用する場合と同じではありません。
注意すべき点が2つあります。
- 動的ライブラリ名とパス設定。この実験でリンクされる動的ライブラリはlibcrypto.soです。
- openssl APIの変更