18

こんにちは私はLinuxマシンにopensslをインストールし、ヘッダーファイルとドキュメントを調べました(これは非常に不十分です:()。

私は対称暗号アルゴリズムを使用するプロジェクト('c')を構築しようとしています(私はaes256cbcに焦点を当てています)。問題は、コードでライブラリ関数を使用する方法のように混乱していることです。

私のaes256cbcの実装では、「aes.h」ヘッダーファイル(最初に私に表示された)で定義された関数を直接使用できます。

しかし、グーグルで私はこれを行うために「evp.h」関数を使用しているこのためのいくつかのチュートリアルに出くわしましたhttp://saju.net.in/code/misc/openssl_aes.c.txt

これには特定の理由がありますか、またはaes.h関数に直接アクセスする方が良いですか。

また、opensslの暗号ライブラリの使用に関するあらゆる種類の優れたドキュメント/チュートリアルを誰かが教えてくれれば幸いです。

どうもありがとう

PS私がナイーブであるなら許してください

4

2 に答える 2

28

EVP API を使用すると、OpenSSL がサポートするすべての対称暗号に対して同じ API を一般的な方法で使用できるという利点があります。これにより、使用されているアルゴリズムを簡単に置き換えたり、後の段階でアルゴリズムをユーザーが構成できるようにしたりできます。作成するコードのほとんどは、選択した暗号化アルゴリズムに固有のものではありません。

CBC モードで AES-256 を使用した暗号化の簡単な例を次に示します。

#include <stdio.h>
#include <openssl/evp.h>

int main()
{
    EVP_CIPHER_CTX ctx;
    unsigned char key[32] = {0};
    unsigned char iv[16] = {0};
    unsigned char in[16] = {0};
    unsigned char out[32]; /* at least one block longer than in[] */
    int outlen1, outlen2;

    EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv);
    EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in));
    EVP_EncryptFinal(&ctx, out + outlen1, &outlen2);

    printf("ciphertext length: %d\n", outlen1 + outlen2);

    return 0;
}

簡単にするために、エラー処理を省略しました。

IMO OpenSSL に関する最も重要なドキュメントの 1 つは、Viega/Messier/Chandra による Network Security with OpenSSLです。これは 2002 年 (0.9.7) のものなので、過去 10 年間の OpenSSL への変更はカバーしていませんが、IMO ではマニュアル ページのみを使用するよりも OpenSSL を学ぶのに痛みが少ない方法です。

于 2012-04-28T23:24:03.363 に答える
2

現在、OpenSSL wiki には、関数の EVP ファミリの使用方法に関する優れたドキュメントがあります: http://wiki.openssl.org/index.php/EVP

EVP over Algorithm API を使用するもう 1 つの利点は、利用可能な場合、EVP がハードウェア アクセラレーション (AES-NI 命令セットなど) を自動的に使用することです。アルゴリズム API では、手動で有効にする必要があります。

于 2014-09-22T15:48:12.283 に答える