暗号化と復号化のためのキーの生成Generating Keys for Encryption and Decryption

キーの作成と管理は、暗号プロセスの重要な部分です。Creating and managing keys is an important part of the cryptographic process. 対称アルゴリズムでは、キーと初期化ベクター (IV) を作成する必要があります。Symmetric algorithms require the creation of a key and an initialization vector (IV). キーは、データの暗号化解除を許可しないユーザーに対しては秘密にする必要があります。The key must be kept secret from anyone who should not decrypt your data. IV は秘密にする必要はありませんが、セッションごとに変更する必要があります。The IV does not have to be secret, but should be changed for each session. 非対称アルゴリズムでは、公開キーと秘密キーを作成する必要があります。Asymmetric algorithms require the creation of a public key and a private key. 公開キーはだれに公開してもかまいせんが、秘密キーを知らせる相手は、公開キーで暗号化されたデータを復号化する人だけにします。The public key can be made public to anyone, while the private key must known only by the party who will decrypt the data encrypted with the public key. このセクションでは、対称アルゴリズムと非対称アルゴリズムの両方について、キーを作成して管理する方法を説明します。This section describes how to generate and manage keys for both symmetric and asymmetric algorithms.

共通キーSymmetric Keys

.NET Framework に用意されている対称暗号化クラスでは、データを暗号化および復号化するために、キーと新しい初期化ベクター (IV) が必要になります。The symmetric encryption classes supplied by the .NET Framework require a key and a new initialization vector (IV) to encrypt and decrypt data. パラメーターなしのコンストラクターを使用して、いずれかのマネージ対称暗号化クラスの新しいインスタンスを作成するたびに、新しいキーと IV が自動的に作成されます。Whenever you create a new instance of one of the managed symmetric cryptographic classes using the parameterless constructor, a new key and IV are automatically created. 自分のデータを復号化できるようにする相手は、自分と同じキーおよび IV を所有し、同じアルゴリズムを使用する必要があります。Anyone that you allow to decrypt your data must possess the same key and IV and use the same algorithm. 一般に、キーと IV はセッションごとに新しく作成する必要があり、キーも IV も格納して後のセッションで使用することは望ましくありません。Generally, a new key and IV should be created for every session, and neither the key nor IV should be stored for use in a later session.

通常、共通キーと IV を離れた場所にいる人へ送信するためには、非対称暗号化方式を使用して共通キーを暗号化します。To communicate a symmetric key and IV to a remote party, you would usually encrypt the symmetric key by using asymmetric encryption. これらの値を暗号化せずに安全でないネットワーク経由で送信することは、値を傍受した人ならだれでもデータを暗号化解除できるようになるため危険です。Sending the key across an insecure network without encrypting it is unsafe, because anyone who intercepts the key and IV can then decrypt your data. 暗号化を使用したデータ交換の詳細については、「 暗号スキームの作成」を参照してください。For more information about exchanging data by using encryption, see Creating a Cryptographic Scheme.

TripleDES アルゴリズムを実装する TripleDESCryptoServiceProvider クラスの新しいインスタンスの作成方法を次の例に示します。The following example shows the creation of a new instance of the TripleDESCryptoServiceProvider class that implements the TripleDES algorithm.

Dim tdes As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()  
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();  

上記のコードを実行すると新しいキーと IV が生成され、それぞれ Key プロパティと IV プロパティに設定されます。When the previous code is executed, a new key and IV are generated and placed in the Key and IV properties, respectively.

複数のキーを生成する必要が生じることもあります。Sometimes you might need to generate multiple keys. このような状況では、対称アルゴリズムを実装するクラスの新しいインスタンスを作成し、次に GenerateKey および GenerateIV メソッドを呼び出すことによって新しいキーと IV を作成します。In this situation, you can create a new instance of a class that implements a symmetric algorithm and then create a new key and IV by calling the GenerateKey and GenerateIV methods. 次のコード例は、対称暗号化クラスの新しいインスタンスが作成された後に、新しいキーと Iv を作成する方法を示しています。The following code example illustrates how to create new keys and IVs after a new instance of the symmetric cryptographic class has been made.

Dim tdes As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()  
tdes.GenerateIV()  
tdes.GenerateKey()  
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();  
tdes.GenerateIV();  
tdes.GenerateKey();  

上記のコードを実行すると、 TripleDESCryptoServiceProvider の新しいインスタンスの作成時にキーと IV が生成されます。When the previous code is executed, a key and IV are generated when the new instance of TripleDESCryptoServiceProvider is made. GenerateKey メソッドと GenerateIV メソッドを呼び出すと、別のキーと IV が作成されます。Another key and IV are created when the GenerateKey and GenerateIV methods are called.

非対称キーAsymmetric Keys

.NET Framework には、非対称暗号化方式のための RSACryptoServiceProvider クラスと DSACryptoServiceProvider クラスが用意されています。The .NET Framework provides the RSACryptoServiceProvider and DSACryptoServiceProvider classes for asymmetric encryption. これらのクラスは、パラメーターなしのコンストラクターを使用して新しいインスタンスを作成するときに、公開キーと秘密キーのペアを作成します。These classes create a public/private key pair when you use the parameterless constructor to create a new instance. 非対称キーは、複数のセッションで使用できるように格納したり、1 つのセッション専用として生成したりできます。Asymmetric keys can be either stored for use in multiple sessions or generated for one session only. 公開キーは一般に公開できますが、秘密キーは厳密に保護する必要があります。While the public key can be made generally available, the private key should be closely guarded.

非対称アルゴリズム クラスの新しいインスタンスを作成すると、公開キーと秘密キーのペアが常に生成されます。A public/private key pair is generated whenever a new instance of an asymmetric algorithm class is created. クラスの新しいインスタンスを作成したら、次の 2 つの方法のどちらかを使ってキー情報を取得できます。After a new instance of the class is created, the key information can be extracted using one of two methods:

どちらのメソッドにも、公開キー情報だけを返すのか、または公開キー情報と秘密キー情報の両方を返すのかを示すブール値を渡すことができます。Both methods accept a Boolean value that indicates whether to return only the public key information or to return both the public-key and the private-key information. メソッドを使用すると、 RSACryptoServiceProvider クラスを初期化して RSAParameters ImportParameters 構造体の値を設定できます。An RSACryptoServiceProvider class can be initialized to the value of an RSAParameters structure by using the ImportParameters method.

非対称秘密キーは、ローカル コンピューターにそのまま平文として保存しないでください。Asymmetric private keys should never be stored verbatim or in plain text on the local computer. 秘密キーを格納する必要がある場合は、キー コンテナーを使用することをお勧めします。If you need to store a private key, you should use a key container. 秘密キーをキー コンテナーに格納する方法の詳細については、「 How to: Store Asymmetric Keys in a Key Container」を参照してください。For more on how to store a private key in a key container, see How to: Store Asymmetric Keys in a Key Container.

次のコード例では、 RSACryptoServiceProvider クラスの新しいインスタンスを作成し、公開キーと秘密キーのペアを作成して、公開キー情報を RSAParameters 構造体に保存します。The following code example creates a new instance of the RSACryptoServiceProvider class, creating a public/private key pair, and saves the public key information to an RSAParameters structure.

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

関連項目See also