1.13 鍵の生成について
1.13.1 概要
暗号化の際に鍵を生成し、その鍵を使います。このときの鍵は、手順どおりであれば、常に同じ鍵を生成させることができます。
弊社のホームページをご覧いただいた方々から多くのご質問をいただいております。それは、「暗号化したコンピュータと別のコンピュータで復号が可能なのか?」というご質問です。
簡単な暗号化のページで説明しています暗号化は、共通鍵暗号方式で、暗号化と復号で同じ鍵(共通鍵もしくは、対象鍵といいます)を使う方式です。この場合におきましては、先のご質問は、「別のコンピュータでも同じ鍵を生成できるのか?」という質問に置き換えることができます。
以下で、このご質問に答えます。
なお、具体的な暗号化の方法は、1.簡単な暗号化を参照してください。
弊社のホームページをご覧いただいた方々から多くのご質問をいただいております。それは、「暗号化したコンピュータと別のコンピュータで復号が可能なのか?」というご質問です。
簡単な暗号化のページで説明しています暗号化は、共通鍵暗号方式で、暗号化と復号で同じ鍵(共通鍵もしくは、対象鍵といいます)を使う方式です。この場合におきましては、先のご質問は、「別のコンピュータでも同じ鍵を生成できるのか?」という質問に置き換えることができます。
以下で、このご質問に答えます。
なお、具体的な暗号化の方法は、1.簡単な暗号化を参照してください。
1.13.2 鍵の生成
CryptoAPIで暗号化鍵を生成する場合は、基本となるデータ(ソース)から生成させる方法と、ランダムに鍵を生成する方法があります。
簡単な暗号化で利用している鍵は、前者の基本となるデータから生成される鍵を使います。
ちなみに、ランダムな鍵は、CryptGenKey( )を使って生成します。生成された鍵をエクスポートすることも可能ですので、その鍵を安全な方法で復号時に利用するといったソリューションも考えられます。また、CryptGenKey( )は、公開鍵(非対称鍵)の生成にも利用します。
簡単な暗号化で利用している鍵は、前者の基本となるデータから生成される鍵を使います。
ちなみに、ランダムな鍵は、CryptGenKey( )を使って生成します。生成された鍵をエクスポートすることも可能ですので、その鍵を安全な方法で復号時に利用するといったソリューションも考えられます。また、CryptGenKey( )は、公開鍵(非対称鍵)の生成にも利用します。
1.13.3 基本データからの鍵生成
基本データから鍵を生成させる場合は、CryptDeriveKey( )を利用します。この関数の利用方法は、1.5 鍵の生成で説明していますので確認してください。
CryptDeriveKeyは、同じ鍵を生成することを保証しています
このCryptDeriveKey関数は、同じ基本データと同じCSP更に同じアルゴリズムを指定しますと、同じ鍵が生成されることを保証しています。以下に説明します、引数に同じ(意味を持った)引数をしてしますと、常に同じ鍵が生成されることになります。これは、別のコンピュータで生成した場合でも同じですので、鍵を生成するための条件さえわかっていれば暗号化と復号をいつでもどこでも行えることになります。
CryptDeriveKey( ) の5つの引数には、以下の値を指定します。
第1引数には、使用するCSPのハンドルを指定します。CSPは、1.12 CSPについて を参照してください。
第2引数には、利用するCSPで利用できる暗号化のアルゴリズムを指定します。指定できるアルゴリズムは、CSPによって違います。詳細は、1.12.4 CSPのタイプ で確認してください。
第3引数には、基本となるデータを指定します。具体的には、ハッシュ値のハンドルを指定します。
第4引数には、鍵の長さ(上位16ビット)と生成法(下位16ビット)を指定するフラグ値を指定します。たとえば128ビット長の鍵を利用する場合は、0x80 * 0x10000を指定することで目的の鍵を生成できます。また、生成法は、以下のフラグを指定できます。
CryptDeriveKeyは、同じ鍵を生成することを保証しています
このCryptDeriveKey関数は、同じ基本データと同じCSP更に同じアルゴリズムを指定しますと、同じ鍵が生成されることを保証しています。以下に説明します、引数に同じ(意味を持った)引数をしてしますと、常に同じ鍵が生成されることになります。これは、別のコンピュータで生成した場合でも同じですので、鍵を生成するための条件さえわかっていれば暗号化と復号をいつでもどこでも行えることになります。
CryptDeriveKey( ) の5つの引数には、以下の値を指定します。
第1引数には、使用するCSPのハンドルを指定します。CSPは、1.12 CSPについて を参照してください。
第2引数には、利用するCSPで利用できる暗号化のアルゴリズムを指定します。指定できるアルゴリズムは、CSPによって違います。詳細は、1.12.4 CSPのタイプ で確認してください。
第3引数には、基本となるデータを指定します。具体的には、ハッシュ値のハンドルを指定します。
第4引数には、鍵の長さ(上位16ビット)と生成法(下位16ビット)を指定するフラグ値を指定します。たとえば128ビット長の鍵を利用する場合は、0x80 * 0x10000を指定することで目的の鍵を生成できます。また、生成法は、以下のフラグを指定できます。
フラグ | 動作 |
---|---|
CRYPT_CREATE_SALT | 鍵にソルト値がアサインされ基本データであるハッシュ値の長さまで延長されます |
CRYPT_EXPORTABLE | 鍵をCSPから外部に取り出すことができるようになります |
CRYPT_NO_SALT | ソルト値が生成されません |
CRYPT_UPDATE_KEY | 一部のCSPで利用できる機能です 鍵を連続的に生成する場合に、以前の鍵を変更した鍵のハンドルが渡されるようになります |
第5引数には、求められた鍵のハンドルが戻ります。
1.13.4 基本データ
鍵を生成するための基本データには、ハッシュ値(または、メッセージダイジェスト値。以下ハッシュ値といいます)を使います。ハッシュ値は、同じアルゴリズムであれば同一のデータからは、同一のハッシュ値が算出されることが保証されています。
従いまして、たとえば暗号化にパスワードを使う場合に、パスワードから計算されたハッシュ値を使うことによって、常に同じ鍵が生成されることが保証されます。
従いまして、たとえば暗号化にパスワードを使う場合に、パスワードから計算されたハッシュ値を使うことによって、常に同じ鍵が生成されることが保証されます。
1.13.5 暗号化データが必ず復号されるために
上記で説明しましたように、同じアルゴリズムを使って鍵を生成してれば、常に同じ鍵が生成されることが保証されています。
共通鍵を使った暗号化を実施する際には、同じアルゴリズムを利用するように注意してください。関数によっては、規定(デフォルト)値を指定できるものもあります。場合によっては、この規定値が期待したものと違う場合があります。その場合は、同じ鍵が生成されない可能性もありますので注意してください。
共通鍵を使った暗号化を実施する際には、同じアルゴリズムを利用するように注意してください。関数によっては、規定(デフォルト)値を指定できるものもあります。場合によっては、この規定値が期待したものと違う場合があります。その場合は、同じ鍵が生成されない可能性もありますので注意してください。
ご意見・感想などをお聞かせください。こちらから、匿名で送信できます。