2017-01-11 4 views
1

У меня возникли проблемы с поиском хорошего примера в строках шифрования/дешифрования в 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)); 
} 
+0

Вы спрашиваете, как загрузить сертификат для использования с RSA или у вас есть RSACryptoServiceProvider, уже загруженный ключом из сертификата? –

+0

Вы видели это [связанное сообщение] (http://stackoverflow.com/questions/202011/encrypt-and-decrypt-a-string/10366194#10366194)? –

+0

Обратите внимание, что вы бы/могли использовать RSA только для шифрования небольших объемов данных, а не для произвольной длины текста. –

ответ

3

согласно .NET Framework team's guidance (придется искать «Криптография Обновления», не кажется, что будет якорь рядом - или, просто посмотрите на the code samples).

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 (байт [], RSAEncryptionPadding) была добавлена ​​в .NET Framework 4.6 (и .NET Ядро 1.0/.NET Standard 1.3), поэтому убедитесь, что вы строите проект с достаточно высокой целевой версией.
  • Шифрование RSA в основном используется для шифрования симметричных ключей, а не фактических данных, потому что оно дорогое и имеет ограничение по размеру (всегда ниже, чем keyize (в байтах), различные режимы заполнения используют разные объемы доступного пространства).
  • В то время как базовый класс RSA говорит о OaepSHA256 (и т. Д.), Только Pkcs1 и OaepSHA1 поддерживаются всеми поставщиками в .NET Core. (OaepSHA256 + ограничен RSACng)
+0

Спасибо за ответ, но у меня возникли проблемы с его работой. У меня есть пример подписи, и когда я выполняю первоначальное подписание, он запрашивает у меня PIN-код CAC, и все работает. В вашем примере шифрование по какой-то причине не подсказывает мне PIN-код, хотя я использую закрытый ключ, я думаю, что он должен. Во всяком случае, при расшифровке я получаю исключение «Ключ не существует». Есть идеи? – Ilya

+2

@Ilya Encrypting не использует закрытый ключ, поэтому даже если у вас есть ключ с ключевым ключом (способным), поставщик ключей может быть готов выполнить операцию без запроса PIN. И ... Я вижу, что публичные/частные части назад в образце. Eep. Обновление моего ответа :) – bartonjs

+0

Я предполагаю, что он не будет запрашивать pin, потому что закрытый ключ закодирован на CAC, поэтому, если CAC отсутствует, нет возможности расшифровать. Я поменял код как в вашем обновленном примере, но теперь в расшифровке я получаю ошибку «Bad key». – Ilya

Смежные вопросы