暗号化サービスCryptographic Services

インターネットなどの公衆ネットワークには、エンティティ間の通信を保護する手段が用意されていません。Public networks such as the Internet do not provide a means of secure communication between entities. 公衆ネットワークを経由した通信は、不当な第三者によって読み取られたり、さらには変更されたりするおそれがあります。Communication over such networks is susceptible to being read or even modified by unauthorized third parties. 暗号化を使用すると、データが表示されないように保護し、データが変更されたかどうかを検出する方法を提供し、通常は安全でないチャネル上に安全な通信手段を確立できます。Cryptography helps protect data from being viewed, provides ways to detect whether data has been modified, and helps provide a secure means of communication over otherwise nonsecure channels. たとえば、暗号化アルゴリズムを使用してデータを暗号化し、暗号化された状態で送信できます。送信先の相手は、後でこのデータを復号化できます。For example, data can be encrypted by using a cryptographic algorithm, transmitted in an encrypted state, and later decrypted by the intended party. 暗号化されたデータを第三者が傍受したとしても、復号化するのは困難です。If a third party intercepts the encrypted data, it will be difficult to decipher.

.NET Framework では、 System.Security.Cryptography 名前空間のクラスが暗号化のさまざまな詳細事項を自動的に管理します。In the .NET Framework, the classes in the System.Security.Cryptography namespace manage many details of cryptography for you. アンマネージド Microsoft Cryptography API (CryptoAPI) 用のラッパーもあれば、純粋なマネージド実装もあります。Some are wrappers for the unmanaged Microsoft Cryptography API (CryptoAPI), while others are purely managed implementations. これらのクラスを使用するにあたって、暗号の専門家になる必要はありません。You do not need to be an expert in cryptography to use these classes. いずれかの暗号化アルゴリズム クラスのインスタンスを新しく作成すると、使いやすいようにキーが自動生成されます。また、既定のプロパティは可能な限り安全に保たれます。When you create a new instance of one of the encryption algorithm classes, keys are autogenerated for ease of use, and default properties are as safe and secure as possible.

この概要では、ClickOnce マニフェスト、Suite B、および .NET Framework 3.5 で導入された Cryptography Next Generation (CNG) のサポートを含む、.NET Framework でサポートされる、暗号化方法の概要を提供します。This overview provides a synopsis of the encryption methods and practices supported by the .NET Framework, including the ClickOnce manifests, Suite B, and Cryptography Next Generation (CNG) support introduced in the .NET Framework 3.5.

この概要は、次のセクションで構成されています。This overview contains the following sections:

暗号化の詳細と、暗号によるセキュリティをアプリケーションに追加できる Microsoft のサービス、コンポーネント、およびツールの詳細については、このドキュメントの「セキュリティ」セクションで、Win32 および COM 開発に関するトピックを参照してください。For additional information about cryptography and about Microsoft services, components, and tools that enable you to add cryptographic security to your applications, see the Win32 and COM Development, Security section of this documentation.

暗号プリミティブCryptographic Primitives

暗号化が使用される一般的な状況では、二者 (ここでは Alice と Bob) が安全でないチャネルを経由して通信します。In a typical situation where cryptography is used, two parties (Alice and Bob) communicate over a nonsecure channel. Alice と Bob は、通信が第三者に傍受されたとしても、内容は理解されないという保証を必要としています。Alice and Bob want to ensure that their communication remains incomprehensible by anyone who might be listening. また、Alice と Bob は離れた場所にいるため、Alice には、Bob から受け取る情報が送信中に変更されていないという保証が必要です。Furthermore, because Alice and Bob are in remote locations, Alice must make sure that the information she receives from Bob has not been modified by anyone during transmission. さらに Alice には、Bob のふりをしただれかからではなく、本当に Bob からの情報を受け取ることができるという保証が必要です。In addition, she must make sure that the information really does originate from Bob and not from someone who is impersonating Bob.

暗号化は、次の目標を達成するために使用されます。Cryptography is used to achieve the following goals:

  • 機密性:ユーザーの id やデータが読み取られないように保護するには。Confidentiality: To help protect a user's identity or data from being read.

  • データの整合性 : データを保護するために次のように変更します。Data integrity: To help protect data from being changed.

  • 認証:そのデータを確認するには、特定のパーティから発生します。Authentication: To ensure that data originates from a particular party.

  • 否認不可:特定のパーティがメッセージを送信したことを拒否するを防ぐ。Non-repudiation: To prevent a particular party from denying that they sent a message.

これらの目標を達成するために、暗号プリミティブと呼ばれるアルゴリズムと手法の組み合わせを使用して暗号スキームを作成します。To achieve these goals, you can use a combination of algorithms and practices known as cryptographic primitives to create a cryptographic scheme. 暗号プリミティブとその用途の一覧を次の表に示します。The following table lists the cryptographic primitives and their uses.

暗号プリミティブCryptographic primitive 使用Use
共有キー暗号方式 (対称暗号化方式)Secret-key encryption (symmetric cryptography) データに対して変換処理を実行し、データが第三者に読み取られるのを防ぎます。Performs a transformation on data to keep it from being read by third parties. このタイプの暗号方式では、単一の共有キーを使用してデータの暗号化と復号化が行われます。This type of encryption uses a single shared, secret key to encrypt and decrypt data.
公開キー暗号方式 (非対称暗号化方式)Public-key encryption (asymmetric cryptography) データに対して変換処理を実行し、データが第三者に読み取られるのを防ぎます。Performs a transformation on data to keep it from being read by third parties. このタイプの暗号方式では、公開キーと秘密キーのペアを使用してデータの暗号化と復号化が行われます。This type of encryption uses a public/private key pair to encrypt and decrypt data.
署名の暗号化Cryptographic signing 送信元に固有のデジタル署名を作成することで、データが特定の人から送信されたことを確認することに役立ちます。Helps verify that data originates from a specific party by creating a digital signature that is unique to that party. この処理でもハッシュ関数が使用されます。This process also uses hash functions.
暗号ハッシュCryptographic hashes 任意の長さのデータを固定長のバイト シーケンスに変換します。Maps data from any length to a fixed-length byte sequence. ハッシュは統計的に一意となります。つまり、異なる 2 バイトのシーケンスが同一の値にハッシュされることはありません。Hashes are statistically unique; a different two-byte sequence will not hash to the same value.

ページのトップへBack to top

共有キー暗号方式Secret-Key Encryption

共有キー暗号方式のアルゴリズムでは、単一の共有キーを使用したデータの暗号化と復号化が行われます。Secret-key encryption algorithms use a single secret key to encrypt and decrypt data. キーを取得した人はだれでもデータを復号化したり、独自のデータを暗号化したりできるため、承認されていないエージェントがアクセスしてデータの作成者になりすますことができないように、キーを保護する必要があります。You must secure the key from access by unauthorized agents, because any party that has the key can use it to decrypt your data or encrypt their own data, claiming it originated from you.

共有キー暗号方式は対称暗号化方式とも呼ばれます。これは、暗号化と復号化で同じキーが使用されるためです。Secret-key encryption is also referred to as symmetric encryption because the same key is used for encryption and decryption. 共有キー暗号化アルゴリズムは (公開キー アルゴリズムと比較して) 非常に高速であり、大量のデータ ストリームに対して暗号変換を実行する場合に適しています。Secret-key encryption algorithms are very fast (compared with public-key algorithms) and are well suited for performing cryptographic transformations on large streams of data. RSA などの非対称暗号化アルゴリズムは、暗号化できるデータ量に数学的に制限があります。Asymmetric encryption algorithms such as RSA are limited mathematically in how much data they can encrypt. 通常、対称暗号化アルゴリズムではこれらの問題は発生しません。Symmetric encryption algorithms do not generally have those problems.

データをブロック単位で暗号化するときには、ブロック暗号と呼ばれる共有キー アルゴリズムの種類が使用されます。A type of secret-key algorithm called a block cipher is used to encrypt one block of data at a time. DES (Data Encryption Standard)、TripleDES、AES (Advanced Encryption Standard) などのブロック暗号では、 n バイトの入力ブロックが、暗号化されたバイト数の出力ブロックに変換されます。Block ciphers such as Data Encryption Standard (DES), TripleDES, and Advanced Encryption Standard (AES) cryptographically transform an input block of n bytes into an output block of encrypted bytes. バイト シーケンスを暗号化または復号化する場合は、ブロック単位で行う必要があります。If you want to encrypt or decrypt a sequence of bytes, you have to do it block by block. 8 は小さいため (DES および TripleDES では 8 バイト、AES では 16 バイト (既定)、24 バイト、または 32 バイト)、 8 よりも大きいデータ値は 1 ブロックずつ暗号化する必要があります。Because n is small (8 bytes for DES and TripleDES; 16 bytes [the default], 24 bytes, or 32 bytes for AES), data values that are larger than n have to be encrypted one block at a time. 8 よりも小さいデータ値を処理するためには、 8 に拡張する必要があります。Data values that are smaller than n have to be expanded to n in order to be processed.

ブロック暗号の 1 つに、ECB (Electronic Codebook) モードと呼ばれる単純な形式があります。One simple form of block cipher is called the electronic codebook (ECB) mode. ECB モードは、初期化ベクターを使用して最初の平文ブロックを初期化しないため、安全とは見なされません。ECB mode is not considered secure, because it does not use an initialization vector to initialize the first plaintext block. 秘密キーを kとする場合、初期化ベクターを使用しない単純なブロック暗号では、同じ平文の入力ブロックは同じ暗号文の出力ブロックに暗号化されます。For a given secret key k, a simple block cipher that does not use an initialization vector will encrypt the same input block of plaintext into the same output block of ciphertext. したがって、入力平文ストリーム内に重複するブロックがある場合、暗号文ストリームにも重複するブロックが生成されることになります。Therefore, if you have duplicate blocks in your input plaintext stream, you will have duplicate blocks in your output ciphertext stream. このような重複する出力ブロックが存在すると、アルゴリズムで弱い暗号化が使用されていて、攻撃が可能なモードであることが、承認されていないユーザーにわかります。These duplicate output blocks alert unauthorized users to the weak encryption used the algorithms that might have been employed, and the possible modes of attack. このため、ECB 暗号モードは分析に対してきわめて脆弱で、最終的にキーが検出されます。The ECB cipher mode is therefore quite vulnerable to analysis, and ultimately, key discovery.

基底クラス ライブラリに用意されているブロック暗号クラスでは、暗号ブロック チェイン (CBC: Cipher Block Chaining) と呼ばれる既定のチェイン モードが使用されます。ただし、この既定のモードは必要に応じて変更できます。The block cipher classes that are provided in the base class library use a default chaining mode called cipher-block chaining (CBC), although you can change this default if you want.

CBC 暗号は、初期化ベクター (IV: Initialization Vector) を使用して平文の最初のブロックを暗号化することにより、ECB 暗号に関連する問題を回避します。CBC ciphers overcome the problems associated with ECB ciphers by using an initialization vector (IV) to encrypt the first block of plaintext. 平文の後続の各ブロックは、前の暗号文ブロックを使用してビットごとの排他的 OR (XOR) 演算を実行してから、暗号化されます。Each subsequent block of plaintext undergoes a bitwise exclusive OR (XOR) operation with the previous ciphertext block before it is encrypted. このため、各平文ブロックは、前のすべてのブロックに依存します。Each ciphertext block is therefore dependent on all previous blocks. このシステムを使用した場合は、承認されていないユーザーが共通メッセージ ヘッダーを知っていたとしても、その情報からキーをリバース エンジニアリングすることはできません。When this system is used, common message headers that might be known to an unauthorized user cannot be used to reverse-engineer a key.

CBC 暗号によって暗号化されたデータを解読する 1 つの方法は、考えられるすべてのキーを徹底的に探索することです。One way to compromise data that is encrypted with a CBC cipher is to perform an exhaustive search of every possible key. ただし、暗号化の実行時に使用したキーのサイズによっては、どれほど高速なコンピューターを使用してもかなりの時間がかかるため、この探索方法は現実的ではありません。Depending on the size of the key that is used to perform encryption, this kind of search is very time-consuming using even the fastest computers and is therefore infeasible. キーのサイズを大きくするほど、復号化は困難になります。Larger key sizes are more difficult to decipher. 暗号化することにより、暗号データの復号化が理論的に不可能になるわけではありませんが、復号化にかかるコストを大きくできます。Although encryption does not make it theoretically impossible for an adversary to retrieve the encrypted data, it does raise the cost of doing this. 3 か月をかけて徹底的な探索を行っても、取得されたデータが数日間しか意味を持たないとすると、その探索方法は実用的とはいえません。If it takes three months to perform an exhaustive search to retrieve data that is meaningful only for a few days, the exhaustive search method is impractical.

共有キー暗号方式の弱点は、両者のキーと IV を一致させ、それぞれの値を転送しておく必要がある点です。The disadvantage of secret-key encryption is that it presumes two parties have agreed on a key and IV, and communicated their values. IV は秘密情報とは見なされないため、平文のメッセージで転送できます。The IV is not considered a secret and can be transmitted in plaintext with the message. しかし、キーは承認されていないユーザーから保護する必要があります。However, the key must be kept secret from unauthorized users. このような問題のため、共有キー暗号方式は公開キー暗号方式と併用されることがよくあります。公開キー暗号方式は、キーと IV の値を秘密に通信するために使用されます。Because of these problems, secret-key encryption is often used together with public-key encryption to privately communicate the values of the key and IV.

Alice と Bob は、安全でないチャネル経由で通信を希望する 2 つのパーティには、仮定ように秘密キーの暗号化を使用する場合があります。Alice と Bob は、1 つの特定のアルゴリズム (たとえば AES) を使用して、特定のキーと IV を使用することに同意します。Assuming that Alice and Bob are two parties who want to communicate over a nonsecure channel, they might use secret-key encryption as follows: Alice and Bob agree to use one particular algorithm (AES, for example) with a particular key and IV. Alice は、メッセージを作成し、メッセージを送信するためのネットワーク ストリーム (おそらく、名前付きパイプやネットワーク電子メール) を作成します。Alice composes a message and creates a network stream (perhaps a named pipe or network email) on which to send the message. 次に、キーと IV を使用してテキストを暗号化し、暗号化されたメッセージと IV をインターネット経由で Bob に送信します。Next, she encrypts the text using the key and IV, and sends the encrypted message and IV to Bob over the intranet. 暗号化されたテキストを受信した Bob は、IV とあらかじめ決めてあるキーを使用して復号化を行います。Bob receives the encrypted text and decrypts it by using the IV and previously agreed upon key. 通信が傍受されたとしても、傍受した人にはキーがわからないため、元のメッセージが復元されることはありません。If the transmission is intercepted, the interceptor cannot recover the original message, because he does not know the key. このシナリオでは、秘密にしておく必要があるのはキーだけです。In this scenario, only the key must remain secret. 実際のシナリオでは、Alice または Bob のどちらかが共有キーを生成し、公開キー (非対称) 暗号方式を使用して相手に共有 (対称) キーを転送することになります。In a real world scenario, either Alice or Bob generates a secret key and uses public-key (asymmetric) encryption to transfer the secret (symmetric) key to the other party. 公開キー暗号方式の詳細については、次のセクションを参照してください。For more information about public-key encryption, see the next section.

.NET Framework は、秘密キーの暗号化アルゴリズムを実装する次のクラスを提供します。The .NET Framework provides the following classes that implement secret-key encryption algorithms:

ページのトップへBack to top

公開キー暗号方式Public-Key Encryption

公開キー暗号方式では、承認されていないユーザーから保護する必要のある秘密キーと、だれに公開してもかまわない公開キーが使用されます。Public-key encryption uses a private key that must be kept secret from unauthorized users and a public key that can be made public to anyone. 公開キーと秘密キーは正確にリンクされ、公開キーで暗号化されたデータは、対応する秘密キーでしか復号化できません。また、秘密キーで署名されたデータは、対応する公開キーでしか検査できません。The public key and the private key are mathematically linked; data that is encrypted with the public key can be decrypted only with the private key, and data that is signed with the private key can be verified only with the public key. 公開キーはだれに公開してもかまいません。公開キーは、秘密キーの所有者に送信するデータを暗号化するために使用されます。The public key can be made available to anyone; it is used for encrypting data to be sent to the keeper of the private key. 公開キー暗号化アルゴリズムは、非対称アルゴリズムとしても知られています。これは、データの暗号化に 1 つのキーが使用され、データの復号化に別のキーが使用されるためです。Public-key cryptographic algorithms are also known as asymmetric algorithms because one key is required to encrypt data, and another key is required to decrypt data. 基本的な暗号化規則でキーの再使用を禁止し、いずれのキーも通信セッションごとに一意にする必要があります。A basic cryptographic rule prohibits key reuse, and both keys should be unique for each communication session. ただし、実際には、非対称キーの寿命は長いことが一般的です。However, in practice, asymmetric keys are generally long-lived.

2 つのパーティ (Alice と Bob) よう公開キーの暗号化に使用可能性があります。最初に、Alice は、公開/秘密キー ペアを生成します。Two parties (Alice and Bob) might use public-key encryption as follows: First, Alice generates a public/private key pair. 暗号メッセージを Alice に送信するとき、Bob は Alice に公開キーを送信するように依頼します。If Bob wants to send Alice an encrypted message, he asks her for her public key. Alice は安全でないネットワークを通して Bob に公開キーを送信し、Bob はこのキーを使用してメッセージを暗号化します。Alice sends Bob her public key over a nonsecure network, and Bob uses this key to encrypt a message. Bob は暗号メッセージを Alice に送信し、Alice は自分の秘密キーを使用してメッセージを復号化します。Bob sends the encrypted message to Alice, and she decrypts it by using her private key. 公衆ネットワークなどの安全でないチャネル経由で Alice のキーを受信した場合、Bob は man-in-the-middle 攻撃に対して無防備になります。If Bob received Alice's key over a nonsecure channel, such as a public network, Bob is open to a man-in-the-middle attack. したがって、Bob は所有している Alice の公開キーの正しいコピーを使用して、Alice であることを検証する必要があります。Therefore, Bob must verify with Alice that he has a correct copy of her public key.

Alice の公開キーの転送中に、承認されていないエージェントによってキーが傍受される可能性があります。During the transmission of Alice's public key, an unauthorized agent might intercept the key. さらに、同じエージェントが Bob からの暗号メッセージを傍受する可能性もあります。Furthermore, the same agent might intercept the encrypted message from Bob. しかし、公開キーを使用してもメッセージを復号化することはできません。However, the agent cannot decrypt the message with the public key. メッセージを復号化できるのは Alice の秘密キーだけですが、これは送信されていません。The message can be decrypted only with Alice's private key, which has not been transmitted. Alice は Bob への返信メッセージを暗号化するときに自分の秘密キーを使用しません。公開キーを持つ人は、だれでもそのメッセージを復号化できるためです。Alice does not use her private key to encrypt a reply message to Bob, because anyone with the public key could decrypt the message. Alice から Bob にメッセージを返信するときには、Alice が Bob の公開キーをたずね、その公開キーを使用してメッセージを暗号化します。If Alice wants to send a message back to Bob, she asks Bob for his public key and encrypts her message using that public key. その後、Bob は自分の秘密キーを使用してメッセージを復号化します。Bob then decrypts the message using his associated private key.

このシナリオでは、Alice と Bob は公開キー (非対称) 暗号方式を使用して共有 (対称) キーを転送し、その他のセッションでは共有キー暗号方式を使用することになります。In this scenario, Alice and Bob use public-key (asymmetric) encryption to transfer a secret (symmetric) key and use secret-key encryption for the remainder of their session.

次の一覧を使用して、公開キーと共有キーの暗号化アルゴリズムを比較します。The following list offers comparisons between public-key and secret-key cryptographic algorithms:

  • 公開キー暗号化アルゴリズムでは固定バッファー サイズが使用されますが、共有キー暗号化アルゴリズムでは可変長バッファーが使用されます。Public-key cryptographic algorithms use a fixed buffer size, whereas secret-key cryptographic algorithms use a variable-length buffer.

  • 公開キー アルゴリズムでは少量のデータしか暗号化できないため、共有キー アルゴリズムのようにデータをチェインしてストリームを作成することはできません。Public-key algorithms cannot be used to chain data together into streams the way secret-key algorithms can, because only small amounts of data can be encrypted. したがって、非対称操作では対称操作と同じストリーミング モデルは使用されません。Therefore, asymmetric operations do not use the same streaming model as symmetric operations.

  • 公開キーの暗号化方式では、秘密キーの暗号化と比較してキーのキースペース (使用できる値の範囲) が大幅に広がります。Public-key encryption has a much larger keyspace (range of possible values for the key) than secret-key encryption. そのため、公開キーの暗号化では、あらゆるキーを試すような徹底的な攻撃の影響を受けにくくなります。Therefore, public-key encryption is less susceptible to exhaustive attacks that try every possible key.

  • 送信元の身元を検証する方法が存在する場合、公開キーは保護する必要なく簡単に配布できます。Public keys are easy to distribute because they do not have to be secured, provided that some way exists to verify the identity of the sender.

  • いくつかの公開キー アルゴリズム (Diffie-Hellman 以外の RSA や DSA など) では、データの送信元の身元を検査するデジタル署名を作成できます。Some public-key algorithms (such as RSA and DSA, but not Diffie-Hellman) can be used to create digital signatures to verify the identity of the sender of data.

  • 公開キー アルゴリズムは秘密キー アルゴリズムと比較してきわめて低速であり、大量のデータを暗号化するようには設計されていません。Public-key algorithms are very slow compared with secret-key algorithms, and are not designed to encrypt large amounts of data. 公開キー アルゴリズムが便利なのは、少量のデータを転送する場合に限られます。Public-key algorithms are useful only for transferring very small amounts of data. 一般に、公開キー暗号方式は、共有キー アルゴリズムで使われるキーと IV を暗号化するために使用されます。Typically, public-key encryption is used to encrypt a key and IV to be used by a secret-key algorithm. キーと IV を転送した後の残りのセッションでは、共有キー暗号方式が使用されます。After the key and IV are transferred, secret-key encryption is used for the remainder of the session.

.NET Framework には、公開キー暗号化アルゴリズムを実装する次のクラスが用意されています。The .NET Framework provides the following classes that implement public-key encryption algorithms:

RSA は暗号化と署名の両方に使用できますが、DSA は署名にのみ使用可能で、Diffie-Hellman はキー生成にのみ使用可能です。RSA allows both encryption and signing, but DSA can be used only for signing, and Diffie-Hellman can be used only for key generation. 一般に、秘密キー アルゴリズムに比べて、公開キー アルゴリズムの使用には多くの制限があります。In general, public-key algorithms are more limited in their uses than private-key algorithms.

ページのトップへBack to top

デジタル署名Digital Signatures

公開キー アルゴリズムは、デジタル署名を形成するためにも使用できます。Public-key algorithms can also be used to form digital signatures. デジタル署名は、(送信元の公開キーを信頼している場合に) 送信元の ID を認証したり、データの整合性を保護することを支援したりします。Digital signatures authenticate the identity of a sender (if you trust the sender's public key) and help protect the integrity of data. Alice によって生成された公開キーを使用すると、Alice のデータの受信者は、Alice のデータに添付されたデジタル署名と Alice の公開キーを比較することによって、データの送信元が Alice かどうかを検査できます。Using a public key generated by Alice, the recipient of Alice's data can verify that Alice sent it by comparing the digital signature to Alice's data and Alice's public key.

Alice は、公開キー暗号方式を使用してメッセージにデジタル署名を添付するために、まずメッセージに対してハッシュ アルゴリズムを適用してメッセージ ダイジェストを作成します。To use public-key cryptography to digitally sign a message, Alice first applies a hash algorithm to the message to create a message digest. このメッセージ ダイジェストは、一意でコンパクトなデータ表現です。The message digest is a compact and unique representation of data. 次に Alice は、自分の秘密キーを使用してメッセージ ダイジェストを暗号化し、個人用の署名を作成します。Alice then encrypts the message digest with her private key to create her personal signature. Bob は、メッセージと署名を受信したときに Alice の公開キーを使用して署名を復号化し、メッセージ ダイジェストを復元します。そして、Alice が使用したのと同じハッシュ アルゴリズムを使用してメッセージをハッシュします。Upon receiving the message and signature, Bob decrypts the signature using Alice's public key to recover the message digest and hashes the message using the same hash algorithm that Alice used. Bob が計算したメッセージ ダイジェストが Alice から受け取ったメッセージ ダイジェストと正確に一致する場合、そのメッセージは秘密キーの所有者から送信されたことになり、データも変更されていないことが保証されます。If the message digest that Bob computes exactly matches the message digest received from Alice, Bob is assured that the message came from the possessor of the private key and that the data has not been modified. Alice が秘密キーの所有者であることが確かならば、Bob にはメッセージが Alice から送信されたことがわかります。If Bob trusts that Alice is the possessor of the private key, he knows that the message came from Alice.

注意

送信者の公開キーは公開された情報であり、通常はデジタル署名の書式に含まれるため、だれでも署名を検査できます。A signature can be verified by anyone because the sender's public key is common knowledge and is typically included in the digital signature format. この方法では、メッセージの秘密性は保持されません。メッセージを秘密にしておくためには、メッセージ自体も暗号化する必要があります。This method does not retain the secrecy of the message; for the message to be secret, it must also be encrypted.

.NET Framework は、デジタル署名アルゴリズムを実装する次のクラスを提供します。The .NET Framework provides the following classes that implement digital signature algorithms:

ページのトップへBack to top

ハッシュ値Hash Values

ハッシュ アルゴリズムは、任意の長さのバイナリ値を、ハッシュ値と呼ばれるより小さい固定長のバイナリ値に変換します。Hash algorithms map binary values of an arbitrary length to smaller binary values of a fixed length, known as hash values. ハッシュ値は、ひとまとまりのデータを数値で表現したものです。A hash value is a numerical representation of a piece of data. 平文の段落のハッシュを計算してから、段落の 1 文字だけでも変更すると、その後のハッシュでは別の値が生成されることになります。If you hash a paragraph of plaintext and change even one letter of the paragraph, a subsequent hash will produce a different value. 強力な暗号化におけるハッシュは、値が大幅に変わります。If the hash is cryptographically strong, its value will change significantly. たとえば、メッセージの 1 ビットを変更すると、強力なハッシュ関数では 50% 異なる出力が生成されます。For example, if a single bit of a message is changed, a strong hash function may produce an output that differs by 50 percent. 多くの入力値が同じ出力値にハッシュされる場合があります。Many input values may hash to the same output value. ただし、同一の値にハッシュされる 2 つの異なる入力を見つけることは、計算上不可能です。However, it is computationally infeasible to find two distinct inputs that hash to the same value.

二者 (ここでは Alice と Bob) は、ハッシュ関数を使用してメッセージの整合性を確保できます。Two parties (Alice and Bob) could use a hash function to ensure message integrity. Alice と Bob はハッシュ アルゴリズムを選択してメッセージに署名します。They would select a hash algorithm to sign their messages. Alice はメッセージを書き込み、選択したアルゴリズムを使用してそのメッセージのハッシュを作成します。Alice would write a message, and then create a hash of that message by using the selected algorithm. そして、次のいずれかの方法を使用します。They would then follow one of the following methods:

  • Alice はプレーンテキスト メッセージとハッシュしたメッセージ (デジタル署名) を Bob に送信します。Alice sends the plaintext message and the hashed message (digital signature) to Bob. Bob はメッセージを受信してハッシュ値を計算し、算出したハッシュ値を Alice から受け取ったハッシュ値と比較します。Bob receives and hashes the message and compares his hash value to the hash value that he received from Alice. ハッシュ値が同一の場合、メッセージは変更されていません。If the hash values are identical, the message was not altered. ハッシュ値が同一でない場合は、Alice がメッセージを作成した後でその内容が変更されています。If the values are not identical, the message was altered after Alice wrote it.

    残念ながら、この方法では送信元の信頼性を保証できません。Unfortunately, this method does not establish the authenticity of the sender. どのユーザーでも Alice を偽装して Bob にメッセージを送信できます。Anyone can impersonate Alice and send a message to Bob. だれもが同じハッシュ アルゴリズムを使用してメッセージに署名できます。Bob が判断できるのは、メッセージがその署名と一致するかどうかだけです。They can use the same hash algorithm to sign their message, and all Bob can determine is that the message matches its signature. これは、一種の man-in-the-middle 攻撃です。This is one form of a man-in-the-middle attack. 詳細については、次を参照してください。 Cryptography Next Generation (CNG) セキュリティで保護された通信の例します。For more information, see Cryptography Next Generation (CNG) Secure Communication Example.

  • Alice はセキュリティで保護されていないパブリック チャネルを使用して、Bob にプレーンテキスト メッセージを送信します。Alice sends the plaintext message to Bob over a nonsecure public channel. そして、セキュリティで保護されたプライベート チャネルを使用して、Bob にハッシュしたメッセージを送信します。She sends the hashed message to Bob over a secure private channel. Bob はプレーンテキスト メッセージを受信し、ハッシュを計算して、プライベートに交換したハッシュと比較します。Bob receives the plaintext message, hashes it, and compares the hash to the privately exchanged hash. ハッシュが一致すると、Bob は次の 2 つのことを判断できます。If the hashes match, Bob knows two things:

    • メッセージが変更されていないこと。The message was not altered.

    • メッセージの送信元 (Alice) は認証されていること。The sender of the message (Alice) is authentic.

    このしくみを機能させるために、Alice は元のハッシュ値を Bob 以外の人から隠す必要があります。For this system to work, Alice must hide her original hash value from all parties except Bob.

  • Alice はセキュリティで保護されていないパブリック チャネルを使用して Bob にプレーンテキスト メッセージを送信し、パブリックに参照できる Web サイトにハッシュしたメッセージを配置します。Alice sends the plaintext message to Bob over a nonsecure public channel and places the hashed message on her publicly viewable Web site.

    この方法は、だれかがハッシュ値を変更することを防ぐことで、メッセージの改ざんを防止します。This method prevents message tampering by preventing anyone from modifying the hash value. メッセージとそのハッシュ値はどのユーザーでも読み取ることができますが、ハッシュ値を変更できるのは Alice だけです。Although the message and its hash can be read by anyone, the hash value can be changed only by Alice. Alice を偽装しようとする攻撃者は、Alice の Web サイトにアクセスする必要があります。An attacker who wants to impersonate Alice would require access to Alice's Web site.

Alice のメッセージはプレーンテキストで送信されるため、前に説明した方法では、Alice のメッセージがだれかから読み取られないように防ぐことはできません。None of the previous methods will prevent someone from reading Alice's messages, because they are transmitted in plaintext. セキュリティを完全にするには、一般に、デジタル署名 (メッセージ署名) と暗号化が必要です。Full security typically requires digital signatures (message signing) and encryption.

.NET Framework は、ハッシュ アルゴリズムを実装する次のクラスを提供します。The .NET Framework provides the following classes that implement hashing algorithms:

注意

1996 年に MD5 に設計上の欠陥が発見され、代わりに SHA-1 が推奨されました。MD5 design flaws were discovered in 1996, and SHA-1 was recommended instead. 2004 年には、新しい欠陥が発見され、MD5 は安全なアルゴリズムと見なされなくなりました。In 2004, additional flaws were discovered, and the MD5 algorithm is no longer considered secure. SHA-1 アルゴリズムも安全でないことがわかり、現在は SHA-2 が推奨されています。The SHA-1 algorithm has also been found to be insecure, and SHA-2 is now recommended instead.

ページのトップへBack to top

乱数生成Random Number Generation

乱数生成は、多くの暗号化操作に欠かせない部分です。Random number generation is integral to many cryptographic operations. たとえば、暗号キーはできるだけランダムにして、再現できないようにする必要があります。For example, cryptographic keys need to be as random as possible so that it is infeasible to reproduce them. 暗号乱数ジェネレーターは、予測される確率が 50% よりも低い、計算上は不可能な出力を生成しなければなりません。Cryptographic random number generators must generate output that is computationally infeasible to predict with a probability that is better than one half. したがって、当て推量をされた場合でも予測できないような手段を使用する必要があります。Therefore, any method of predicting the next output bit must not perform better than random guessing. .NET Framework のクラスは、暗号化キーを生成するのに乱数ジェネレーターを使用します。The classes in the .NET Framework use random number generators to generate cryptographic keys.

乱数ジェネレーター アルゴリズムは、 RNGCryptoServiceProvider クラスに実装されています。The RNGCryptoServiceProvider class is an implementation of a random number generator algorithm.

ページのトップへBack to top

ClickOnce マニフェストClickOnce Manifests

.NET Framework 3.5 では、次の暗号化クラスを使用すると、取得しを使用してデプロイされたアプリケーションのマニフェストの署名に関する情報を確認ClickOnce テクノロジ:In the .NET Framework 3.5, the following cryptography classes let you obtain and verify information about manifest signatures for applications that are deployed using ClickOnce technology:

特定の署名情報を提供するクラスとしては、他にも次のようなものがあります。In addition, the following classes provide specific signature information:

ページのトップへBack to top

Suite B のサポートSuite B Support

.NET Framework 3.5 には、国家安全保障局 (NSA) によって公開された暗号化アルゴリズム、スイート B セットがサポートしています。The .NET Framework 3.5 supports the Suite B set of cryptographic algorithms published by the National Security Agency (NSA). Suite B の詳細については、「 NSA の Suite B 暗号化に関するファクト シート」を参照してください。For more information about Suite B, see the NSA Suite B Cryptography Fact Sheet.

次のアルゴリズムが含まれています。The following algorithms are included:

  • キー サイズが 128 ビット、192 ビット、および 256 ビットの AES (Advanced Encryption Standard) アルゴリズム。暗号化に使用されます。Advanced Encryption Standard (AES) algorithm with key sizes of 128, 192, , and 256 bits for encryption.

  • Secure Hash Algorithm (SHA-1、SHA-256、SHA-384、および SHA-512)。ハッシュ化に使用されますSecure Hash Algorithms SHA-1, SHA-256, SHA-384, and SHA-512 for hashing. (通常、最後の 3 つはまとめて SHA-2 と呼ばれます)。(The last three are generally grouped together and referred to as SHA-2.)

  • 256 ビット、384 ビット、および 521 ビットの素数の曲線を使用した ECDSA (Elliptic Curve Digital Signature Algorithm)。署名に使用されます。Elliptic Curve Digital Signature Algorithm (ECDSA), using curves of 256-bit, 384-bit, and 521-bit prime moduli for signing. NSA のドキュメントでは、これらの曲線が具体的に定義され、P-256、P-384、および P-521 と呼ばれています。The NSA documentation specifically defines these curves, and calls them P-256, P-384, and P-521. このアルゴリズムは、 ECDsaCng クラスによって提供されます。This algorithm is provided by the ECDsaCng class. 秘密キーを使用して署名したり、公開キーを使用した署名を検証したりできます。It enables you to sign with a private key and verify the signature with a public key.

  • 256 ビット、384 ビット、および 521 ビットの素数の曲線を使用した ECDH (Elliptic Curve Diffie-Hellman) アルゴリズム。キーの交換と秘密協定に使用されます。Elliptic Curve Diffie-Hellman (ECDH) algorithm, using curves of 256-bit, 384-bit, and 521-bit prime moduli for the key exchange and secret agreement. このアルゴリズムは、 ECDiffieHellmanCng クラスによって提供されます。This algorithm is provided by the ECDiffieHellmanCng class.

新たに追加された AesCryptoServiceProviderSHA256CryptoServiceProviderSHA384CryptoServiceProviderSHA512CryptoServiceProvider の各クラスでは、連邦情報処理規格 (FIPS: Federal Information Processing Standard) によって認定された AES、SHA-256、SHA-384、および SHA-512 実装のマネージド コード ラッパーを使用できます。Managed code wrappers for the Federal Information Processing Standard (FIPS) certified implementations of the AES, SHA-256, SHA-384, and SHA-512 implementations are available in the new AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider, and SHA512CryptoServiceProvider classes.

ページのトップへBack to top

CNG (Cryptography Next Generation) クラスCryptography Next Generation (CNG) Classes

CNG のクラスには、ネイティブ CNG 関数を扱うマネージド ラッパーが用意されていますThe Cryptography Next Generation (CNG) classes provide a managed wrapper around the native CNG functions. (CNG は CryptoAPI に代わるものです)。これらのクラスは、名前の一部に "Cng" が使用されています。(CNG is the replacement for CryptoAPI.) These classes have "Cng" as part of their names. CNG ラッパー クラスの中心は、CNG キーのストレージと使用を抽象化する CngKey キー コンテナー クラスです。Central to the CNG wrapper classes is the CngKey key container class, which abstracts the storage and use of CNG keys. このクラスにより、キー ペアまたは公開キーを安全に格納したり、単純な文字列名を使って参照したりすることが可能になります。This class lets you store a key pair or a public key securely and refer to it by using a simple string name. 楕円曲線ベースの ECDsaCng 署名クラスおよび ECDiffieHellmanCng 暗号化クラスは、 CngKey オブジェクトを使用できます。The elliptic curve-based ECDsaCng signature class and the ECDiffieHellmanCng encryption class can use CngKey objects.

CngKey クラスは、キーを開く、作成する、削除する、エクスポートするなど、さまざまな補足的な操作に使用されます。The CngKey class is used for a variety of additional operations, including opening, creating, deleting, and exporting keys. また、ネイティブ関数を直接呼び出すときに使用する、基になるキー ハンドルへのアクセスも提供します。It also provides access to the underlying key handle to use when calling native functions directly.

.NET Framework 3.5 には、さまざまなサポートなど、次の CNG クラスも含まれます。The .NET Framework 3.5 also includes a variety of supporting CNG classes, such as the following:

  • CngProvider は、キー ストレージ プロバイダーを管理します。CngProvider maintains a key storage provider.

  • CngAlgorithm は、CNG アルゴリズムを管理します。CngAlgorithm maintains a CNG algorithm.

  • CngProperty は、よく使用される主要なプロパティを管理します。CngProperty maintains frequently used key properties.

ページのトップへBack to top

タイトルTitle 説明Description
暗号モデルCryptography Model 基底クラス ライブラリに暗号化がどのように実装されているかについて説明します。Describes how cryptography is implemented in the base class library.
チュートリアル: 暗号化アプリケーションの作成Walkthrough: Creating a Cryptographic Application 基本的な暗号化タスクと復号化タスクについて説明します。Demonstrates basic encryption and decryption tasks.
暗号化クラスの設定Configuring Cryptography Classes アルゴリズム名を暗号クラスに割り当てる方法と、オブジェクト ID を暗号化アルゴリズムに割り当てる方法について説明します。Describes how to map algorithm names to cryptographic classes and map object identifiers to a cryptographic algorithm.