usar publica gpg encriptar desencriptar crear como clave archivos c# encryption public-key pgp public-key-encryption

c# - publica - desencriptar archivos pgp



C#¿Cómo simplemente cifrar un archivo de texto con una clave pública de PGP? (4)

¿Has echado un vistazo al bouncycastle pgp? http://www.bouncycastle.org/

Aquí hay un ejemplo de fuente de cifrado de un archivo tomado del sitio BouncyCastle: se necesita un ejemplo para el cifrado del archivo BouncyCastle PGP en C #

He investigado un poco acerca de cómo lograr lo que dije en la pregunta y encontré varias API, pero la mayoría de ellas parecen muy complicadas y, como soy un novato en esta área, solo quiero un método simple como:

public String Encrypt(String message, PublicKey publicKey)

No sé si esto se puede hacer? Si no es así, por favor, alguien me ilumine de otra manera para lograr esto :)

Gracias.

ACTUALIZAR:

Hasta ahora solo he visto que toda la biblioteca para el cifrado OpenPGP requiere tanto la clave pública como la privada para encriptar, mientras que solo quiero cifrar con la clave pública (porque no tengo la clave privada para usarla) !


Aquí es quizás un enfoque más limpio:

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


Encontré un tutorial here pero requiere tanto la clave secreta como la clave pública para cifrar los datos. Sin embargo, modifiqué un poco los códigos para requerir solo una clave pública (sin firma, sin comprimir) y pensé que debería publicarlo aquí en caso de que alguien también busque una solución para esta pregunta. Belows son los códigos modificados, todos los créditos para el autor, el Sr. Kim.

public class PgpEncrypt { private PgpEncryptionKeys m_encryptionKeys; private const int BufferSize = 0x10000; /// <summary> /// Instantiate a new PgpEncrypt class with initialized PgpEncryptionKeys. /// </summary> /// <param name="encryptionKeys"></param> /// <exception cref="ArgumentNullException">encryptionKeys is null</exception> public PgpEncrypt(PgpEncryptionKeys encryptionKeys) { if (encryptionKeys == null) { throw new ArgumentNullException("encryptionKeys", "encryptionKeys is null."); } m_encryptionKeys = encryptionKeys; } /// <summary> /// Encrypt and sign the file pointed to by unencryptedFileInfo and /// write the encrypted content to outputStream. /// </summary> /// <param name="outputStream">The stream that will contain the /// encrypted data when this method returns.</param> /// <param name="fileName">FileInfo of the file to encrypt</param> 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); } }

Por supuesto, para ejecutar estos códigos, debe incluir la biblioteca BouncyCastle en su proyecto.
He probado el cifrado y luego descifrado y funciona bien :)


Hay un artículo sobre el proyecto de código http://www.codeproject.com/KB/security/sharpprivacy.aspx?df=100&forumid=15716&exp=0&select=573797 , que tiene métodos:

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

Lo que puede ser lo que estás buscando, o al menos te indica la dirección correcta para escribir el tuyo.