web-dev-qa-db-ja.com

証明書を使用してC#で暗号化/復号化する

証明書を使用してC#で文字列を暗号化/復号化する良い例を見つけるのに苦労しています。以下に示すように、署名の例を見つけて実装し、署名を検証することができました。誰かが暗号化の簡単で類似した例を教えてくれますか?

private static string Sign(RSACryptoServiceProvider privateKey, string content)
{
    SHA1Managed sha1 = new SHA1Managed();
    UnicodeEncoding  encoding = new UnicodeEncoding ();
    byte[] data = encoding.GetBytes(content);
    byte[] hash = sha1.ComputeHash(data);

    // Sign the hash
    var signature = privateKey.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    return Convert.ToBase64String(signature);
}

public static bool Verify(RSACryptoServiceProvider publicKey, string content, string hashString)
{
    SHA1Managed sha1 = new SHA1Managed();
    UnicodeEncoding  encoding = new UnicodeEncoding ();
    byte[] data = encoding.GetBytes(content);
    byte[] hash = sha1.ComputeHash(data);
    return publicKey.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), Convert.FromBase64String(hashString));
}
10
Ilya

。NET Frameworkチームのガイダンス (「暗号化の更新」を検索する必要があるため、近くにアンカーがないようです-または、単に コードサンプル =)。

public static byte[] EncryptDataOaepSha1(X509Certificate2 cert, byte[] data)
{
    // GetRSAPublicKey returns an object with an independent lifetime, so it should be
    // handled via a using statement.
    using (RSA rsa = cert.GetRSAPublicKey())
    {
        // OAEP allows for multiple hashing algorithms, what was formermly just "OAEP" is
        // now OAEP-SHA1.
        return rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1);
    }
}

したがって、復号化は

public static byte[] DecryptDataOaepSha1(X509Certificate2 cert, byte[] data)
{
    // GetRSAPrivateKey returns an object with an independent lifetime, so it should be
    // handled via a using statement.
    using (RSA rsa = cert.GetRSAPrivateKey())
    {
        return rsa.Decrypt(data, RSAEncryptionPadding.OaepSHA1);
    }
}

警告:

  • RSA.Encrypt(byte []、RSAEncryptionPadding)は.NET Framework 4.6(および.NET Core 1.0/.NET Standard 1.3)で追加されたので、ターゲットバージョンが十分に高いプロジェクトをビルドしていることを確認してください。
  • RSA暗号化は、実際のデータペイロードではなく、主に対称キーの暗号化に使用されます。これは、高価でサイズに制限があるためです(常に、キーサイズ(バイト単位)よりも低く、さまざまなパディングモードが異なる量の使用可能なスペースを消費します)。
  • RSA基本クラスはOaepSHA256(など)について話しますが、Pkcs1とOaepSHA1のみが.NET Coreのすべてのプロバイダーでサポートされています。 (OaepSHA256 +はRSACngに制限されています)
16
bartonjs