暗号化と復号化のためのキーの生成

キーの作成と管理は、暗号プロセスの重要な部分です。 対称アルゴリズムでは、キーと初期化ベクター (IV) を作成する必要があります。 キーは、データの暗号化解除を許可しないユーザーに対しては秘密にする必要があります。 IV は秘密にする必要はありませんが、セッションごとに変更する必要があります。 非対称アルゴリズムでは、公開キーと秘密キーを作成する必要があります。 公開キーはだれにも知らせることができますが、対応する秘密キーは、復号化パーティによってのみ認識される必要があります。 このセクションでは、対称アルゴリズムと非対称アルゴリズムの両方について、キーを作成して管理する方法を説明します。

対称キー

.NET に用意されている対称暗号化クラスでは、データを暗号化および解読するために、キーと新しい初期化ベクター (IV) が必要になります。 いずれかのマネージド対称暗号化クラスの新しいインスタンスを作成するとき、パラメーターなしの Create() メソッドを使用すると、常に新しいキーと IV が自動的に作成されます。 自分のデータを復号化できるようにする相手は、自分と同じキーおよび IV を所有し、同じアルゴリズムを使用する必要があります。 一般に、キーと IV はセッションごとに新しく作成する必要があり、キーも IV も格納して後のセッションで使用することは望ましくありません。

通常、共通キーと IV を離れた場所にいる人へ送信するためには、非対称暗号化方式を使用して共通キーを暗号化します。 これらの値を暗号化せずに安全でないネットワーク経由で送信することは、値を傍受した人ならだれでもデータを暗号化解除できるようになるため危険です。

Aes アルゴリズムの既定の実装クラスの新しいインスタンスの作成方法を次の例に示します。

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

上記のコードを実行すると新しいキーと IV が生成され、それぞれ Key プロパティと IV プロパティに設定されます。

複数のキーを生成する必要が生じることもあります。 このような状況では、対称アルゴリズムを実装するクラスの新しいインスタンスを作成し、次に GenerateKey および GenerateIV メソッドを呼び出すことによって新しいキーと IV を作成します。 対称暗号化クラスの新しいインスタンスの作成後に新しいキーと IV を作成する方法を次のコード例に示します。

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

上記のコードを実行すると、Aes の新しいインスタンスの作成時にキーと IV が生成されます。 GenerateKey メソッドと GenerateIV メソッドを呼び出すと、別のキーと IV が作成されます。

非対称キー

.NET からは、非対称暗号化のための RSA クラスが提供されます。 このクラスによって、パラメーターなしの Create() メソッドで新しいインスタンスを作成するとき、秘密キーと公開キーのペアが作成されます。 非対称キーは、複数のセッションで使用できるように格納したり、1 つのセッション専用として生成したりできます。 公開キーは一般に公開できますが、秘密キーは厳密に保護する必要があります。

非対称アルゴリズム クラスの新しいインスタンスを作成すると、公開キーと秘密キーのペアが常に生成されます。 クラスの新しいインスタンスが作成された後、キー情報を ExportParameters メソッドを利用して抽出できます。このメソッドからは、キー情報を有する RSAParameters 構造が返されます。 このメソッドには、公開キー情報だけを返すのか、または公開キー情報と秘密キー情報の両方を返すのかを示すブール値を渡すことができます。

キー情報を抽出できるメソッドは、他にも次のものがあります。

ImportParameters メソッドを使用すると、RSA クラスを初期化して RSAParameters 構造体の値を設定できます。 あるいは、RSA.Create(RSAParameters) メソッドを使用して新しいインスタンスを作成します。

非対称秘密キーは、ローカル コンピューターにそのまま平文として保存しないでください。 秘密キーを格納する必要がある場合は、キー コンテナーを使用することをお勧めします。 秘密キーをキー コンテナーに格納する方法の詳細については、「方法: キー コンテナーに非対称キーを格納する」を参照してください。

次のコード例では、RSA クラスの新しいインスタンスを作成し、公開キーと秘密キーのペアを作成して、公開キー情報を RSAParameters 構造体に保存します。

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

関連項目