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.