Bouncy Castle C#PGP解密示例
昨天我找了一整天,似乎找不到一个使用c#中的Bouncy Castle进行PGP解密的工作示例,最后它成功了。我在其他示例中遇到的主要问题是,我的私钥环中包含了一个用于签名的密钥,这是在尝试加载密钥进行解密时首先出现的。这就是为什么我必须为键上的Bouncy Castle C#PGP解密示例,c#,encryption,bouncycastle,pgp,C#,Encryption,Bouncycastle,Pgp,昨天我找了一整天,似乎找不到一个使用c#中的Bouncy Castle进行PGP解密的工作示例,最后它成功了。我在其他示例中遇到的主要问题是,我的私钥环中包含了一个用于签名的密钥,这是在尝试加载密钥进行解密时首先出现的。这就是为什么我必须为键上的ElGamalPrivateKeyParameters类型添加检查 下面是我的代码。不是很干净,但它能工作 private static PgpPrivateKey GetPrivateKey(string privateKeyPath)
ElGamalPrivateKeyParameters
类型添加检查
下面是我的代码。不是很干净,但它能工作
private static PgpPrivateKey GetPrivateKey(string privateKeyPath)
{
using (Stream keyIn = File.OpenRead(privateKeyPath))
using (Stream inputStream = PgpUtilities.GetDecoderStream(keyIn))
{
PgpSecretKeyRingBundle secretKeyRingBundle = new PgpSecretKeyRingBundle(inputStream);
PgpSecretKey key = null;
foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
{
foreach (PgpSecretKey secretKey in kRing.GetSecretKeys())
{
PgpPrivateKey privKey = secretKey.ExtractPrivateKey("1234567890".ToCharArray());
if (privKey.Key.GetType() ==
typeof (Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters))
//Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters
{
return privKey;
}
}
}
}
return null;
}
public static void Decrypt(Stream input, string outputpath, String privateKeyPath)
{
input = PgpUtilities.GetDecoderStream(input);
try
{
PgpObjectFactory pgpObjF = new PgpObjectFactory(input);
PgpEncryptedDataList enc;
PgpObject obj = pgpObjF.NextPgpObject();
if (obj is PgpEncryptedDataList)
{
enc = (PgpEncryptedDataList)obj;
}
else
{
enc = (PgpEncryptedDataList)pgpObjF.NextPgpObject();
}
PgpPrivateKey privKey = GetPrivateKey(privateKeyPath);
PgpPublicKeyEncryptedData pbe = enc.GetEncryptedDataObjects().Cast<PgpPublicKeyEncryptedData>().First();
Stream clear;
clear = pbe.GetDataStream(privKey);
PgpObjectFactory plainFact = new PgpObjectFactory(clear);
PgpObject message = plainFact.NextPgpObject();
if (message is PgpCompressedData)
{
PgpCompressedData cData = (PgpCompressedData)message;
Stream compDataIn = cData.GetDataStream();
PgpObjectFactory o = new PgpObjectFactory(compDataIn);
message = o.NextPgpObject();
if (message is PgpOnePassSignatureList)
{
message = o.NextPgpObject();
PgpLiteralData Ld = null;
Ld = (PgpLiteralData)message;
Stream output = File.Create(outputpath + "\\" + Ld.FileName);
Stream unc = Ld.GetInputStream();
Streams.PipeAll(unc, output);
}
else
{
PgpLiteralData Ld = null;
Ld = (PgpLiteralData)message;
//Stream output = File.Create(outputpath + "\\" + Ld.FileName);
Stream output = File.Create(outputpath);
Stream unc = Ld.GetInputStream();
Streams.PipeAll(unc, output);
}
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
private静态PgpPrivateKey GetPrivateKey(字符串privateKeyPath)
{
使用(Stream keyIn=File.OpenRead(privateKeyPath))
使用(Stream-inputStream=PgpUtilities.GetDecoderStream(keyIn))
{
PgpSecretKeyRingBundle secretKeyRingBundle=新的PgpSecretKeyRingBundle(inputStream);
PgpSecretKey key=null;
foreach(secretKeyRingBundle.GetKeyRings()中的pgpsecretkeyringkring)
{
foreach(kRing.getsecretkey()中的PgpSecretKey secretKey)
{
PgpPrivateKey privKey=secretKey.ExtractPrivateKey(“1234567890.ToCharArray());
if(privKey.Key.GetType()==
类型(Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters))
//Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters
{
返回私钥;
}
}
}
}
返回null;
}
公共静态无效解密(流输入、字符串输出路径、字符串私有密钥路径)
{
输入=PgpUtilities.GetDecoderStream(输入);
尝试
{
PgpObjectFactory pgpObjF=新的PgpObjectFactory(输入);
PGPencryptedatalist enc;
PgpObject obj=pgpObjF.nextpgobject();
if(obj是PgpEncryptedDataList)
{
enc=(PGPencryptedatalist)obj;
}
其他的
{
enc=(PgpEncryptedDataList)pgpObjF.nextpgobject();
}
PgpPrivateKey privKey=GetPrivateKey(privateKeyPath);
PgpPublicKeyEncryptedData pbe=enc.GetEncryptedDataObjects().Cast().First();
溪流清澈;
clear=pbe.GetDataStream(privKey);
PgpObjectFactory plainFact=新的PgpObjectFactory(清除);
PgpObject message=plainFact.nextpgobject();
if(消息为PgpCompressedData)
{
PgpCompressedData cData=(PgpCompressedData)消息;
Stream compDataIn=cData.GetDataStream();
PgpObjectFactory o=新的PgpObjectFactory(compDataIn);
message=o.nextpgobject();
if(消息为PgpOnePassSignatureList)
{
message=o.nextpgobject();
PgpLiteralData Ld=null;
Ld=(PgpLiteralData)消息;
流输出=File.Create(outputpath+“\\”+Ld.FileName);
Stream unc=Ld.GetInputStream();
Streams.PipeAll(unc,输出);
}
其他的
{
PgpLiteralData Ld=null;
Ld=(PgpLiteralData)消息;
//流输出=File.Create(outputpath+“\\”+Ld.FileName);
流输出=File.Create(outputpath);
Stream unc=Ld.GetInputStream();
Streams.PipeAll(unc,输出);
}
}
}
捕获(例外e)
{
抛出新异常(e.Message);
}
}
我遇到了罗恩·哈列夫(Ron Harlev)的解密函数在程序终止前保存输出文件的问题。为了克服这个问题,我在流的周围添加了一些语句。我还替换了硬编码的密码短语以支持输入参数。我希望有人觉得这有用
private static bool DecryptFile(Stream inputStream, string outputDir, char[] passPhrase, string privateKeyLoc)
{
try
{
using (var newStream = PgpUtilities.GetDecoderStream(inputStream))
{
PgpObjectFactory pgpObjF = new PgpObjectFactory(newStream);
PgpEncryptedDataList enc;
PgpObject obj = pgpObjF.NextPgpObject();
if (obj is PgpEncryptedDataList)
{
enc = (PgpEncryptedDataList)obj;
}
else
{
enc = (PgpEncryptedDataList)pgpObjF.NextPgpObject();
}
PgpPrivateKey privKey = GetPrivateKey(privateKeyLoc, passPhrase, logger);
PgpPublicKeyEncryptedData pbe = enc.GetEncryptedDataObjects().Cast<PgpPublicKeyEncryptedData>().First();
using (Stream clear = pbe.GetDataStream(privKey))
{
PgpObjectFactory plainFact = new PgpObjectFactory(clear);
PgpObject message = plainFact.NextPgpObject();
if (message is PgpCompressedData)
{
PgpCompressedData cData = (PgpCompressedData)message;
Stream compDataIn = cData.GetDataStream();
PgpObjectFactory o = new PgpObjectFactory(compDataIn);
message = o.NextPgpObject();
if (message is PgpOnePassSignatureList)
{
message = o.NextPgpObject();
}
PgpLiteralData Ld = null;
Ld = (PgpLiteralData)message;
using (Stream output = File.Create(outputDir + "\\" + Ld.FileName))
{
Stream unc = Ld.GetInputStream();
Streams.PipeAll(unc, output);
}
}
}
}
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
return false;
}
}
私有静态bool解密文件(Stream-inputStream、string-outputDir、char[]密码短语、string-privateKeyLoc)
{
尝试
{
使用(var newStream=PgpUtilities.GetDecoderStream(inputStream))
{
PgpObjectFactory pgpObjF=新的PgpObjectFactory(新闻流);
PGPencryptedatalist enc;
PgpObject obj=pgpObjF.nextpgobject();
if(obj是PgpEncryptedDataList)
{
enc=(PGPencryptedatalist)obj;
}
其他的
{
enc=(PgpEncryptedDataList)pgpObjF.nextpgobject();
}
PgpPrivateKey privKey=GetPrivateKey(privateKeyLoc,密码短语,记录器);
PgpPublicKeyEncryptedData pbe=enc.GetEncryptedDataObjects().Cast().First();
使用(Stream clear=pbe.GetDataStream(privKey))
{
PgpObjectFactory plainFact=新的PgpObjectFactory(清除);
PgpObject message=plainFact.nextpgobject();
if(消息为PgpCompressedData)
{
PgpCompressedData cData=(PgpCompressedData)消息;
Stream compDataIn=cData.GetDataStream();
PgpObjectFactory o=新的PgpObjectFactory(compDataIn);
message=o.nextpgobject();
if(消息为PgpOnePassSignatureList)
{
message=o.nextpgobject();
}
PgpLiteralData Ld=null;
Ld=(PgpLiteralData)消息;
使用(Stream output=File.Create(outputDir+“\\”+Ld.FileName))
{
流unc=Ld.GetInp