人気を得ている新しいストリーム暗号は RABBIT です。 このストリーム暗号は、ヘッダー
"wolfssl / wolfcrypt / rabbit.h"を使用します。 RABBIT は ARC4 に比べて非常に高速です が、16バイト(128ビット)のキー制約とオプションの8バイト(64ビット)の IV があり ます。 それ以外の場合は ARC4 とまったく同じです。
Rabbit enc;
Rabbit dec;
const byte key[] = { /*some key 16 bytes*/};
const byte iv[] = { /*some iv 8 bytes*/ };
byte plain[27]; /*no size restriction, fill with data*/
byte cipher[27];
/*encrypt*/
wc_RabbitSetKey(&enc, key, iv); /*iv can be a NULL pointer*/
wc_RabbitProcess(&enc, cipher, plain, sizeof(plain));
cipherには、暗号文が含まれています。
/*decrypt*/
wc_RabbitSetKey(&dec, key, iv);
wc_RabbitProcess(&dec, plain, cipher, sizeof(cipher));
plain には、暗号文から復号された元の平文が含まれます。
HC-128
現在使用されている別のストリーム暗号は HC-128 で、RABBIT よりも高速です( ARC4 より約5倍高速)。 wolfCrypt で使用するには、ヘッダー "wolfssl / wolfcrypt / hc128.h"を 含めてください。 HC-128 は 16 バイトのキー( 128 ビット)も使用しますが、RABBIT とは異なり 16 バイトの IV(128ビット)を使用します。
HC128 enc;
HC128 dec;
const byte key[] = { /*some key 16 bytes*/};
const byte iv[] = { /*some iv 16 bytes*/ };
byte plain[37]; /*no size restriction, fill with data*/
byte cipher[37];
/*encrypt*/
wc_Hc128_SetKey(&enc, key, iv); /*iv can be a NULL pointer*/
wc_Hc128_Process(&enc, cipher, plain, sizeof(plain));
cipherには、暗号文が含まれています。
/*decrypt*/
wc_Hc128_SetKey(&dec, key, iv);
wc_Hc128_Process(&dec, plain, cipher, sizeof(cipher));
plain には、暗号文から復号された元の平文が含まれます。
ChaCha
20ラウンドの ChaCha は、高いレベルのセキュリティを維持しながら、ARC4 よりわずか に高速です。 wolfCrypt で使用するには、ヘッダー "wolfssl / wolfcrypt / chacha.h"を含め てください。 ChaCha は、通常 32 バイトのキー( 256 ビット)を使用しますが、16 バイ トのキー( 128 ビット)も使用できます。
CHACHA enc;
CHACHA dec;
const byte key[] = { /*some key 32 bytes*/};
const byte iv[] = { /*some iv 12 bytes*/ };
byte plain[37]; /*no size restriction, fill with data*/
byte cipher[37];
/*encrypt*/
wc_Chacha_SetKey(&enc, key, keySz);
wc_Chacha_SetIV(&enc, iv, counter); /*counter is the start block counter is usually set as 0*/
wc_Chacha_Process(&enc, cipher, plain, sizeof(plain));
cipherには、暗号文が含まれています。
/*decrypt*/
wc_Chacha_SetKey(&enc, key, keySz);
wc_Chacha_SetIV(&enc, iv, counter);
wc_Chacha_Process(&enc, plain, cipher, sizeof(cipher));
plain には、暗号文から復号された元の平文が含まれます。
Chacha_SetKey は1回だけ設定する必要がありますが、Chacha_SetIV を送信する情報の 各パケットについては、新しい iv(nonce)で呼び出す必要があります。カウンタは、暗号 化/復号化プロセスを実行するときに別のブロックから開始することによって情報の部分的 な復号化/暗号化を可能にするための引数として設定されますが、ほとんどの場合0に設定さ れます。
ChaCha は、Mac アルゴリズム(例:Poly1305、hmac)なしでは使用しないでくださ い。
公開鍵暗号
RSA
wolfCrypt はヘッダー "wolfssl / wolfcrypt / rsa.h"を介してRSAをサポートしています。 公 開鍵と秘密鍵の2種類の RSA 鍵があります。 公開鍵は、秘密鍵の所有者だけが解読できる 暗号文を作成できるようにします。 また、秘密鍵所有者は何かに署名することができ、公 開鍵を持つ誰もが実際にそれを署名したことを検証することができます。 使用方法は通常 次のようになります。
RsaKey rsaPublicKey;
byte publicKeyBuffer[] = { /*holds the raw data from the key, maybe from a file like
RsaPublicKey.der*/ };
word32 idx = 0; /*where to start reading into the buffer*/
wc_RsaPublicKeyDecode(publicKeyBuffer, &idx, &rsaPublicKey, sizeof(publicKeyBuffer));
byte in[] = { /*plain text to encrypt*/ };
byte out[128];
RNG rng;
wc_InitRng(&rng);
word32 outLen = wc_RsaPublicEncrypt(in, sizeof(in), out, sizeof(out),
&rsaPublicKey, &rng);
'out' には、平文 'in' から暗号文を保持します。 wc_RsaPublicEncrypt() はバイト単位の長 さをバイトに返し、エラーが発生した場合は負の数を返します。 wc_RsaPublicEncrypt() は、暗号化装置が使用するパディング用の RNG( Random Number Generator )を必要 とし、使用前に初期化する必要があります。 出力バッファが十分に大きいことを確認する ために、最初に wc_RsaEncryptSize() を呼び出すことができます。これは、
wc_RsaPublicEnrypt() への呼び出しが成功するバイト数を返します。
エラーが発生した場合、wc_RsaPublicEnrypt() または wc_RsaPublicKeyDecode() からの 負の戻り値は、wc_ErrorString() を呼び出して発生したエラーを説明する文字列を取得で きます。
void wc_ErrorString(int error, char* buffer);
バッファが MAX_ERROR_SZ バイト(80)以上であることを確認してください。
復号化して取り出します:
RsaKey rsaPrivateKey;
byte privateKeyBuffer[] = { /*hold the raw data from the key, maybe from a file like RsaPrivateKey.der*/ };
word32 idx = 0; /*where to start reading into the buffer*/
wc_RsaPrivateKeyDecode(privateKeyBuffer, &idx, &rsaPrivateKey, sizeof(privateKeyBuffer));
byte plain[128];
word32 plainSz = wc_RsaPrivateDecrypt(out, outLen, plain, sizeof(plain), &rsaPrivateKey);
plain は plainSz バイトまたはエラー・コードを保持します。 wolfCrypt の各タイプの完全 な例については、wolfcrypt / test / test.c を参照してください。 wc_RsaPrivateKeyDecode 関数は、生 DER 形式のキーのみを受け入れることに注意してください。
DH( ディフィー・ヘルマン )
wolfCrypt は、ヘッダー "wolfssl / wolfrypt / dh.h" を介して ディフィー・ヘルマンのサポ ートを提供します。 ディフィー・ヘルマン 鍵交換アルゴリズムは、2つの当事者が共有秘 密鍵を確立することを可能にします。 使用法は通常、sideA とsideB が2つのパーティを指
定する次の例と似ています。
次の例では、dhPublicKey には、認証局(または自己署名)によって署名されたディフィ ー・ヘルマン・パブリックパラメータが含まれています。 privA は生成された sideA の秘 密鍵を保持し、pubA は生成された sideA の公開鍵を保持し、agreA は両者が合意した相互 鍵を保持します。
DhKey dhPublicKey;
word32 idx = 0; /*where to start reading into the publicKeyBuffer*/
word32 pubASz, pubBSz, agreeASz;
byte tmp[1024];
RNG rng;
byte privA[128];
byte pubA[128];
byte agreeA[128];
wc_InitDhKey(&dhPublicKey);
byte publicKeyBuffer[] = { /*holds the raw data from the public key parameters, maybe from a file like dh1024.der*/ }
wc_DhKeyDecode(tmp, &idx, &dhPublicKey, publicKeyBuffer);
wc_InitRng(&rng); /*Initialize random number generator*/
wc_DhGenerateKeyPair() は、dhPublicKey の初期パブリックパラメータに基づいてパブ リックおよびプライベートDHキーを生成します。
wc_DhGenerateKeyPair(&dhPublicKey, &rng, privA, &privASz, pubA, &pubASz);
sideB が sideA に公開鍵( pub )を送信した後、sideA は wc_DhAgree() 関数を使用して 相互に合意された鍵( agreeA )を生成できます。
agreA は sideA の相互に生成された鍵(サイズは equivalentASz バイトです)を保持しま す。 同じプロセスが sideB で行われます。
wolfCrypt のディフィー・ヘルマンの完全な例については、wolfcrypt / test / test.cファイ ルを参照してください。
EDH(Ephemeral ディフィー・ヘルマン )
wolfSSLサーバーは Ephemeral ディフィー・ヘルマンを実行できます。 この機能を追加す るには、変更を加える必要はありませんが、EDH暗号スイートを有効にするには、アプリ ケーションでサーバー側の一時的なグループパラメータを登録する必要があります。
新しいAPIを使用してこれを行うことができます:
int wolfSSL_SetTmpDH(WOLFSSL* ssl, unsigned char* p, int pSz,unsigned char* g,int gSz);
サンプルサーバーとechoserver はこの関数を SetDH() から使用しています。
DSA (デジタル署名アルゴリズム)
wolfCrypt はヘッダー "wolfssl / wolfcrypt / dsa.h"を介して DSA と DSS のサポートを提供 します。 DSA では、特定のデータハッシュに基づいてデジタル署名を作成することができ ます。 DSA は SHA ハッシュアルゴリズムを使用してデータブロックのハッシュを生成 し、署名者の秘密鍵を使用してそのハッシュに署名します。 一般的な使用法は次のように なります。
最初に DSA 鍵構造(鍵)を宣言し、署名する初期メッセージ(メッセージ)を初期化し、
DSA 鍵バッファ( dsaKeyBuffer )を初期化します。
DsaKey key;
Byte message[] = { /*message data to sign*/ }
byte dsaKeyBuffer[] = { /*holds the raw data from the DSA key, maybe from a file like dsa512.der*/ }
次に SHA 構造体(sha)、乱数ジェネレータ(rng)、SHA ハッシュ(hash)を格納する 配列、署名(signature)を格納する配列、idx(dsaKeyBuffer の読み込み先を示す)、お よび 検証後に戻り値を保持するint(回答)を宣言します。
Sha sha;
RNG rng;
byte hash[SHA_DIGEST_SIZE];
byte signature[40];
word32 idx = 0;
int answer;
SHA ハッシュを設定して作成します。 wolfCrypt の SHA アルゴリズムの詳細について は、第 10.1.3 項 を参照してください。 変数 "hash" には、 "message" の SHAハッシュが
格納されます。
wc_InitSha(&sha);
wc_ShaUpdate(&sha, message, sizeof(message));
wc_ShaFinal(&sha, hash);
DSA 鍵構造体を初期化し、構造体の鍵値を取り込み、乱数ジェネレータ(rng)を初期化 します。
wc_InitDsaKey(&key);
wc_DsaPrivateKeyDecode(dsaKeyBuffer, &idx, &key, sizeof(dsaKeyBuffer));
wc_InitRng(&rng);
wc_DsaSign() 関数は、DSA 秘密鍵、ハッシュ値、および乱数ジェネレータを使用して署 名(署名)を作成します。
wc_DsaSign(hash, signature, &key, &rng);
署名を検証するには、wc_DsaVerify() を使用します。 検証が成功すると、答えは「1」に 等しくなります。 終了後、wc_FreeDsaKey() を使用してDSAキー構造を解放します。
SSL チュートリアル
はじめに
wolfSSL (旧CyaSSL)組み込み SSL ライブラリは、既存のアプリケーションやデバイス に簡単に組み込みことが出来、SSL や TLS を追加することで通信セキュリティを強化する ことが出来ます。wolfSSL は、組み込み及び RTOS 環境をターゲットにしており、優れた パフォーマンスを維持しながら最小のフットプリントを提供します。選択されたビルド・
オプションと使用されるプラットフォームによっては、wolfSSL の最小ビルドサイズは、
20~ 100kB です。
このチュートリアルの目的は、SSL と TLS を簡単なアプリケーションに統合することで す。さらに、このチュートリアルを進めるプロセスを通して、また、SSLの一般的な理解 に繋げることを期待しています。このチュートリアルでは、アプリケーションに SSL サポ ートを追加する一般的な手順を実証しながら、単純さをなるべく維持する為に、wolfSSL を利用し簡単な echoserver と echoclient の例を使用します。 echoclient と echoserver の 例は、Richard Stevens, Bill Fenner, Andrew Rudoff の “Unix Network Programming , Volume 1, 3rd Edition” という人気のある書籍から引用しています。
このチュートリアルでは、読者が GNU GCC コンパイラを使用して C コードを編集してコ ンパイルするのに慣れていることと、公開鍵の暗号化の概念に精通していることを前提と しています。このチュートリアルでは、 Unix Network Programming の書籍にアクセスす る必要はありません。
このチュートリアルで使用する例:
echoclient – 図 5.4, Page 124 echoserver – 図 5.12, Page 139
Unix Network Programming Volume 1, 3rd Edition www.unpbook.com