暗号化と暗号化解除のためのキーを生成する

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

対称キー

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

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

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

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

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

複数のキーを生成する必要が生じることもあります。 このような状況では、対称アルゴリズムを実装するクラスの新しいインスタンスを作成します。 次に GenerateKeyGenerateIV メソッドを呼び出すことによって新しいキーと 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() メソッドを使用して新しいインスタンスを作成すると、RSA クラスによって公開キーと秘密キーのペアが作成されます。 非対称キーは、複数のセッションで使用できるように格納したり、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);  

関連項目