Bouncycastle PGP解密期间的PartialInputStream
我正在尝试解密我刚刚使用bouncycastle加密的文件,但是我得到了这个例外:
Premature end of stream in PartialInputStream
我正在使用bouncycastle的示例代码,并没有改变任何东西。
当我使用此代码进行加密时,我得到了这个:
private static byte[] EncryptFile(byte[] clearData, string fileName, PgpPublicKey encKey, bool withIntegrityCheck) { MemoryStream encOut = new MemoryStream(); try { MemoryStream bOut = new MemoryStream(); PgpCompressedDataGenerator comData = new PgpCompressedDataGenerator( CompressionAlgorithmTag.Zip ); //PgpUtilities.WriteFileToLiteralData( // comData.Open(bOut), // PgpLiteralData.Binary, // new FileInfo(fileName)); Stream cos = comData.Open(bOut); PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator(); Stream pOut = lData.Open( cos, PgpLiteralData.Binary, fileName, clearData.Length, DateTime.UtcNow ); lData.Close(); comData.Close(); PgpEncryptedDataGenerator cPk = new PgpEncryptedDataGenerator( SymmetricKeyAlgorithmTag.Cast5, withIntegrityCheck, new SecureRandom() ); cPk.AddMethod(encKey); byte[] bytes = bOut.ToArray(); Stream os = encOut; Stream cOut = cPk.Open(os, bytes.Length); cOut.Write(bytes, 0, bytes.Length); cOut.Close(); encOut.Close(); } catch (PgpException e) { Console.Error.WriteLine(e); Exception underlyingException = e.InnerException; if (underlyingException != null) { Console.Error.WriteLine(underlyingException.Message); Console.Error.WriteLine(underlyingException.StackTrace); } } return encOut.ToArray(); }
我认为这与PgpLiteralDataGenerator
。 但我需要使用它,因为我想从字节数组加密数据,而不是从文件加密。 还有其他方法吗?
任何人都是一个工作代码:
using System; using System.Xml; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Text; using Org.BouncyCastle.Bcpg.OpenPgp; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities.IO; using Org.BouncyCastle.Utilities.Encoders; using Org.BouncyCastle.Bcpg; class Program { private static PgpPublicKey ReadPublicKey(Stream inputStream) { inputStream = PgpUtilities.GetDecoderStream(inputStream); PgpPublicKeyRingBundle pgpPub = new PgpPublicKeyRingBundle(inputStream); // // we just loop through the collection till we find a key suitable for encryption, in the real // world you would probably want to be a bit smarter about this. // // // iterate through the key rings. // foreach (PgpPublicKeyRing kRing in pgpPub.GetKeyRings()) { foreach (PgpPublicKey k in kRing.GetPublicKeys()) { if (k.IsEncryptionKey) { return k; } } } throw new ArgumentException("Can't find encryption key in key ring."); } private static byte[] EncryptFile(byte[] clearData, string fileName, PgpPublicKey encKey, bool withIntegrityCheck) { MemoryStream bOut = new MemoryStream(); PgpCompressedDataGenerator comData = new PgpCompressedDataGenerator( CompressionAlgorithmTag.Zip); Stream cos = comData.Open(bOut); // open it with the final destination PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator(); // we want to Generate compressed data. This might be a user option later, // in which case we would pass in bOut. Stream pOut = lData.Open( cos, // the compressed output stream PgpLiteralData.Binary, fileName, // "filename" to store clearData.Length, // length of clear data DateTime.UtcNow // current time ); pOut.Write(clearData, 0, clearData.Length); lData.Close(); comData.Close(); PgpEncryptedDataGenerator cPk = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.Cast5, new SecureRandom()); cPk.AddMethod(encKey); byte[] bytes = bOut.ToArray(); MemoryStream encOut = new MemoryStream(); Stream os = encOut; Stream cOut = cPk.Open(os, bytes.Length); cOut.Write(bytes, 0, bytes.Length); // obtain the actual bytes from the compressed stream cOut.Close(); encOut.Close(); return encOut.ToArray(); } static void Main(string[] args) { try { byte[] dataBytes = File.ReadAllBytes("test.xml"); Stream keyIn = File.OpenRead("cert.asc"); Stream outStream = File.Create("data.bpg"); byte[] encrypted = EncryptFile(dataBytes, "data", ReadPublicKey(keyIn), false); outStream.Write(encrypted, 0, encrypted.Length); keyIn.Close(); outStream.Close(); } catch (Exception e) { Console.WriteLine(e.Message); } Console.ReadLine(); } }
当我试图从’stream’读取时,我得到了同样的错误。
PgpLiteralData ld = (PgpLiteralData)message; var stream = ld.GetInputStream(); // the stream to read form
对我来说,一个解决方案是将流复制到一个新的.net Stream对象,如MemoryStream
。 之后从memoryStream对象中读取。
因此,我的基本流类型与Org.BouncyCastle.Bcpg
流类型无关。
- 使用C#,BouncyCastle和导入的RSA密钥进行RSA签名和validation – 内部使用Python示例和非工作C#代码示例
- 需要C#中的BouncyCastle PGP文件加密示例
- Bouncy Castle,RSA:将密钥转换为String格式
- 仅使用公钥创建AsymmetricCipherKeyPair
- 如何使用BouncyCastle生成根证书,然后使用由该根证书签名的站点证书?
- 使用BouncyCastle AesFastEngine加密C#AesCryptoServiceProvider加密数据
- 转换椭圆曲线参数(BC到MS)
- Bouncy Castle PGP解密问题
- 在C#中使用BouncyCastle构建证书链