web-dev-qa-db-fra.com

Chiffrer / déchiffrer en C # à l'aide d'un certificat

J'ai du mal à trouver un bon exemple de cryptage/décryptage de chaînes en C # à l'aide d'un certificat . J'ai pu trouver et implémenter un exemple de signature et valider une signature, comme indiqué ci-dessous. Quelqu'un pourrait-il m'indiquer un exemple simple et similaire de chiffrement?

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

Selon le directives de l'équipe .NET Framework (devez rechercher "Mises à jour de cryptographie", il ne semble pas y avoir d'ancre à proximité - ou, regardez simplement les exemples de code =).

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);
    }
}

Déchiffrer serait donc

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);
    }
}

Mises en garde:

  • RSA.Encrypt (octet [], RSAEncryptionPadding) a été ajouté dans .NET Framework 4.6 (et .NET Core 1.0/.NET Standard 1.3), alors assurez-vous de créer un projet avec une version cible suffisamment élevée.
  • Le cryptage RSA est principalement utilisé pour crypter les clés symétriques, pas les charges utiles de données réelles, car il est cher et a une limite de taille (toujours inférieure à la taille de la clé (en octets), les différents modes de remplissage consomment différentes quantités d'espace disponible).
  • Alors que la classe de base RSA parle d'OaepSHA256 (etc.), seuls Pkcs1 et OaepSHA1 sont pris en charge par tous les fournisseurs dans .NET Core. (OaepSHA256 + est limité à RSACng)
16
bartonjs