C # Como simplesmente criptografar um arquivo de texto com uma chave pública PGP?

Eu pesquisei um pouco sobre como conseguir o que eu disse na pergunta e encontrei várias APIs, mas a maioria delas parece muito complicada e, como sou apenas um noobie nessa área, eu só quero um método simples como:

public String Encrypt(String message, PublicKey publicKey) 

Não sei se isso pode ser feito? Se não, por favor, alguém me ilumine outra maneira de conseguir isso 🙂

Obrigado.

ATUALIZAR:

Até agora eu só vi que toda a biblioteca para criptografia OpenPGP requer tanto a chave pública e a chave privada para fazer a criptografia enquanto eu só quero criptografar com a chave pública (porque eu não tenho a chave privada para usá-lo) !

    Eu encontrei um tutorial aqui, mas requer a chave secreta e a chave pública para criptografar dados. No entanto, modifiquei os códigos um pouco para exigir apenas a chave pública (sem assinatura, sem compactação) e pensei que deveria publicá-la aqui, caso alguém também esteja procurando uma solução para essa pergunta. Belows é os códigos modificados, todos os créditos para o autor – o Sr. Kim.

     public class PgpEncrypt { private PgpEncryptionKeys m_encryptionKeys; private const int BufferSize = 0x10000; ///  /// Instantiate a new PgpEncrypt class with initialized PgpEncryptionKeys. ///  ///  /// encryptionKeys is null public PgpEncrypt(PgpEncryptionKeys encryptionKeys) { if (encryptionKeys == null) { throw new ArgumentNullException("encryptionKeys", "encryptionKeys is null."); } m_encryptionKeys = encryptionKeys; } ///  /// Encrypt and sign the file pointed to by unencryptedFileInfo and /// write the encrypted content to outputStream. ///  /// The stream that will contain the /// encrypted data when this method returns. /// FileInfo of the file to encrypt public void Encrypt(Stream outputStream, FileInfo unencryptedFileInfo) { if (outputStream == null) { throw new ArgumentNullException("outputStream", "outputStream is null."); } if (unencryptedFileInfo == null) { throw new ArgumentNullException("unencryptedFileInfo", "unencryptedFileInfo is null."); } if (!File.Exists(unencryptedFileInfo.FullName)) { throw new ArgumentException("File to encrypt not found."); } using (Stream encryptedOut = ChainEncryptedOut(outputStream)) { using (Stream literalOut = ChainLiteralOut(encryptedOut, unencryptedFileInfo)) using (FileStream inputFile = unencryptedFileInfo.OpenRead()) { WriteOutput(literalOut, inputFile); } } } private static void WriteOutput(Stream literalOut, FileStream inputFile) { int length = 0; byte[] buf = new byte[BufferSize]; while ((length = inputFile.Read(buf, 0, buf.Length)) > 0) { literalOut.Write(buf, 0, length); } } private Stream ChainEncryptedOut(Stream outputStream) { PgpEncryptedDataGenerator encryptedDataGenerator; encryptedDataGenerator = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.TripleDes, new SecureRandom()); encryptedDataGenerator.AddMethod(m_encryptionKeys.PublicKey); return encryptedDataGenerator.Open(outputStream, new byte[BufferSize]); } private static Stream ChainLiteralOut(Stream encryptedOut, FileInfo file) { PgpLiteralDataGenerator pgpLiteralDataGenerator = new PgpLiteralDataGenerator(); return pgpLiteralDataGenerator.Open(encryptedOut, PgpLiteralData.Binary, file); } } 

    É claro que para executar esses códigos você precisa include a biblioteca BouncyCastle em seu projeto.
    Eu testei criptografia e, em seguida, descriptografar e corre bem 🙂

    Você deu uma olhada no pgp bouncycastle? http://www.bouncycastle.org/

    Há um exemplo de fonte aqui de encriptação de um arquivo retirado do site BouncyCastle: Precisa de exemplo para criptografia de arquivo PGP BouncyCastle em C #

    Aqui está talvez uma abordagem mais limpa:


      var pkr = asciiPublicKeyToRing(ascfilein); if (pkr != null) { try { EncryptFile( tbUnencryptedFile.Text, tbEncryptedFile.Text, getFirstPublicEncryptionKeyFromRing(pkr), true, true); MessageBox.Show("File Encrypted."); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } } else { MessageBox.Show(ascfilein + " is not a public key."); } 

      private PgpPublicKeyRing asciiPublicKeyToRing(string ascfilein) { using (Stream pubFis = File.OpenRead(ascfilein)) { var pubArmoredStream = new ArmoredInputStream(pubFis); PgpObjectFactory pgpFact = new PgpObjectFactory(pubArmoredStream); Object opgp = pgpFact.NextPgpObject(); var pkr = opgp as PgpPublicKeyRing; return pkr; } } private PgpPublicKey getFirstPublicEncryptionKeyFromRing(PgpPublicKeyRing pkr) { foreach (PgpPublicKey k in pkr.GetPublicKeys()) { if (k.IsEncryptionKey) return k; } throw new ArgumentException("Can't find encryption key in key ring."); } public static void EncryptFile(string inputFile, string outputFile, PgpPublicKey encKey, bool armor, bool withIntegrityCheck) { using (MemoryStream bOut = new MemoryStream()) { PgpCompressedDataGenerator comData = new PgpCompressedDataGenerator(CompressionAlgorithmTag.Zip); PgpUtilities.WriteFileToLiteralData(comData.Open(bOut), PgpLiteralData.Binary, new FileInfo(inputFile)); comData.Close(); PgpEncryptedDataGenerator cPk = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.Aes256, withIntegrityCheck, new SecureRandom()); cPk.AddMethod(encKey); byte[] bytes = bOut.ToArray(); using (Stream outputStream = File.Create(outputFile)) { if (armor) { using (ArmoredOutputStream armoredStream = new ArmoredOutputStream(outputStream)) using (Stream cOut = cPk.Open(armoredStream, bytes.Length)) { cOut.Write(bytes, 0, bytes.Length); } } else { using (Stream cOut = cPk.Open(outputStream, bytes.Length)) { cOut.Write(bytes, 0, bytes.Length); } } } } } 

    Há um artigo sobre o projeto de código http://www.codeproject.com/KB/security/sharpprivacy.aspx?df=100&forumid=15716&exp=0&select=573797 , que possui methods:

     public static string EncryptText(string strMessage, PublicKeyRing pkrPublicKeyRing, SecretKeyRing skrSecretKeyRing, bool bSign private static void DecryptAndVerify(SecretKeyRing skrSecretKeyRing, PublicKeyRing pkrPublicKeyRing, byte[] bData) 

    Qual pode ser o que você está procurando, ou pelo menos você está na direção certa para escrever o seu próprio.