Saltar al contenido

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

Este team de especialistas despúes de ciertos días de trabajo y recopilar de datos, hemos dado con los datos necesarios, esperamos que te sea útil en tu trabajo.

Solución:

Encontré un tutorial aquí, pero requiere tanto la clave secreta como la clave pública para cifrar los datos. Sin embargo, modifiqué un poco los códigos para que solo requieran público. key (sin firmar, sin comprimir) y pensé que debería publicarlo aquí en caso de que alguien también busque una solución para esta pregunta. Abajo están los códigos modificados, todos los créditos para el autor – 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);
             

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

Aquí hay 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);
                    
                
            
        
    

¿Le echaste un vistazo al bouncycastle pgp? http://www.bouncycastle.org/

Aquí hay un ejemplo fuente de encriptación de un archivo tomado del sitio de BouncyCastle: Necesita un ejemplo para la encriptación de archivos PGP de BouncyCastle en C#

Sección de Reseñas y Valoraciones

Si conservas alguna desconfianza y forma de arreglar nuestro artículo te recomendamos realizar una interpretación y con placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *