.NET Core PGP加密解密

4

void Encryption() 函数中遇到了错误。

public void Encryption()
{
    #region PGP Encryption 

    PgpEncryptionKeys encryptionKeys = new PgpEncryptionKeys(@"C:\Keys\PGPPublicKey.asc", @"C:\Keys\PGPPrivateKey.asc", "password");
    PgpEncrypt encrypter = new PgpEncrypt(encryptionKeys);
    using (Stream outputStream = File.Create("C:\\Keys\\EncryptData.txt"))
    {
        encrypter.EncryptAndSign(outputStream, new FileInfo(@"D:\Keys\PlainText.txt"));
    }
    Console.WriteLine("Encryption Done !");

    #endregion
}

我用https://code.msdn.microsoft.com/vstudio/Pretty-Good-Privacy-using-4f473c67作为参考。
我对PgpEncryptionKeys中的参数感到困惑。
有没有人有一个可行的例子或帮助?这是我第一次加密,所以我有点迷失。
1个回答

1

我是这样做的:

我认为可以帮助你!

助手:

public static void EncryptPgpFile(string inputFile, string outputFile, string publicKeyFile, bool armor, bool withIntegrityCheck)
{
    using (Stream publicKeyStream = File.OpenRead(publicKeyFile))
    {
        PgpPublicKey pubKey = ReadPublicKey(publicKeyStream);

        using (MemoryStream outputBytes = new MemoryStream())
        {
            PgpCompressedDataGenerator dataCompressor = new PgpCompressedDataGenerator(CompressionAlgorithmTag.Zip);
            PgpUtilities.WriteFileToLiteralData(dataCompressor.Open(outputBytes), PgpLiteralData.Binary, new FileInfo(inputFile));

            dataCompressor.Close();
            PgpEncryptedDataGenerator dataGenerator = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.Cast5, withIntegrityCheck, new SecureRandom());

            dataGenerator.AddMethod(pubKey);
            byte[] dataBytes = outputBytes.ToArray();

            using (Stream outputStream = File.Create(outputFile))
            {
                if (armor)
                {
                    using (ArmoredOutputStream armoredStream = new ArmoredOutputStream(outputStream))                   
                    using (Stream outputStream = dataGenerator.Open(armoredStream, dataBytes.Length))
                        outputStream.Write(dataBytes, 0, dataBytes.Length);
                }
                else
                {
                    using (Stream outputStream = dataGenerator.Open(armoredStream, dataBytes.Length))
                        outputStream.Write(dataBytes, 0, dataBytes.Length);
                }
            }
        }
    }
}

private static PgpPublicKey ReadPublicKey(Stream inputStream)
{
    inputStream = PgpUtilities.GetDecoderStream(inputStream);
    PgpPublicKeyRingBundle pgpPub = new PgpPublicKeyRingBundle(inputStream);

    foreach (PgpPublicKeyRing keyRing in pgpPub.GetKeyRings())
    {
        foreach (PgpPublicKey key in keyRing.GetPublicKeys())
        {
            if (key.IsEncryptionKey)
                return key;
        }
    }

    throw new ArgumentException("Can't find encryption key in key ring.");
}

使用方法:

EncryptPgpFile(inputFile, outputFile, publicKeyPath, true, true);

我将PgpCore(1.3.1)添加到了我的项目中。PgpUtilities.WriteFileToLiteralData是从哪里来的?使用上述代码时,它无法解析。另外,我将else语句中的dataGenerator.Open更改为使用File.Create的outputStream。还有...我将if和else语句中的stream重命名为outStream,因为它与外部范围的outputStream冲突了。这是有意为之吗? - EricR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接