私は .NET 2 で RSACryptoServiceProvider を使用していますが、公開鍵と秘密鍵のペアの秘密部分には常に公開部分も含まれているようです。
公開鍵を使用して一部の情報を暗号化し、相手が暗号化したもののみを復号化できるようにする必要があります。メッセージをどのように暗号化したかを彼らに知られたくありません。.NET で RSACryptoServiceProvider を使用することは可能ですか?
私は .NET 2 で RSACryptoServiceProvider を使用していますが、公開鍵と秘密鍵のペアの秘密部分には常に公開部分も含まれているようです。
公開鍵を使用して一部の情報を暗号化し、相手が暗号化したもののみを復号化できるようにする必要があります。メッセージをどのように暗号化したかを彼らに知られたくありません。.NET で RSACryptoServiceProvider を使用することは可能ですか?
秘密鍵には常に公開鍵が含まれています。
あなたが本当に欲しいのは署名です。同じ .NET クラスを使用して、自分の秘密鍵でデータに署名し、公開鍵 (明らかに秘密鍵は含まれていません) で相手側の署名を検証できます。
public static string Sign(string data, string privateAndPublicKey)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
RSACryptoServiceProvider provider = CreateProviderFromKey(privateAndPublicKey);
byte[] signatureBytes = provider.SignData(dataBytes, "SHA1");
return Convert.ToBase64String(signatureBytes);
}
public static bool Verify(string data, string signature, string publicKey)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = Convert.FromBase64String(signature);
RSACryptoServiceProvider provider = CreateProviderFromKey(publicKey);
return provider.VerifyData(dataBytes, "SHA1", signatureBytes);
}
private static RSACryptoServiceProvider CreateProviderFromKey(string key)
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(key);
return provider;
}
使い方:
相手の公開鍵:
相手だけが (他の誰も) 解読できないものを暗号化したい場合は、(自分の鍵ではなく) 相手の公開鍵で暗号化する必要があります。
相手から署名を取得した場合は、相手の公開鍵を使用して、署名が (他の誰かによって作成されたものではなく) 正しいことを確認できます。
自分の秘密鍵:
あなたがコンテンツを作成したことを誰もが確認できるように何かに署名したい場合は、自分の秘密鍵で署名します。あなたの公開鍵はそれを検証するために使用されます。コンテンツはまったく暗号化されません (個別に暗号化しない限り)。
誰かがあなたの公開鍵で暗号化されたメッセージを送信した場合 (あなただけが読むことができるようにするため)、秘密鍵で復号化できます。
自分の公開鍵:
独自の公開鍵は使用しません。相手はそれを使用して署名を検証し、メッセージを暗号化してあなただけに見せます。
相手の秘密鍵:
あなたはそれを持っていません。
秘密鍵/公開鍵を使用したデータ暗号化は、そのようには機能しません。他の人の公開鍵を使用する必要があるため、その人は自分の秘密鍵を使用して暗号化を解除できます。
それにもかかわらず、これは非常に遅いため、実際にメッセージを暗号化するために実際に使用されるのは、セッション時に生成される対称鍵です。対称鍵は、相手側の公開鍵 (メッセージ全体よりもはるかに少ないデータ) によって暗号化され、暗号化されたメッセージに添付されます。たとえば、SSLはそのように機能します。