Я пытался расшифровать зашифрованные данные с помощью PGP
Мне удалось python
privateKey = '-----BEGIN PGP PRIVATE KEY BLOCK----- ...'
key = pgpy.PGPKey.from_blob(privateKey)[0]
db = sqlite3.connect("sqlite_path")
c = db.cursor()
for row in c.execute("SELECT * FROM MESSAGE"):
if row[0] == '':
continue
encMsg = pgpy.PGPMessage.from_blob(row[0])
print(row[0])
with key.unlock(passPhrase):
print(key.decrypt(encMsg).message)
, но у меня возникли проблемы при переводе python в c# (особенно form_blob ..). Приведенный ниже код - это то, что я считаю таким же, как код python.
, но он выдает исключения в pbe.GetDataStream(key);
: System.Exception: 'exception decrypting secret key'
.
Есть ли что-нибудь, что я должен учитывать при этой ошибке? Пожалуйста, дайте мне знать, что не так.
если key
неверно, как я могу получить правильный ключ?
Также privateKey
это строка, значение "-----BEGIN PGP PRIVATE KEY BLOCK----- ..."
в C#
public void DecryptData(Stream encData, string privateKey, string passPhrase)
{
encData = PgpUtilities.GetDecoderStream(encData);
try
{
PgpObjectFactory pgpObjF = new PgpObjectFactory(encData);
PgpEncryptedDataList enc;
PgpObject obj = pgpObjF.NextPgpObject();
if (obj is PgpEncryptedDataList)
{
enc = (PgpEncryptedDataList)obj;
}
else
{
enc = (PgpEncryptedDataList)pgpObjF.NextPgpObject();
}
PgpPrivateKey key= getPrivateKey(privateKey, passPhrase);
enc.GetEncryptedDataObjects();
PgpPublicKeyEncryptedData pbe = enc.GetEncryptedDataObjects().Cast<PgpPublicKeyEncryptedData>().First();
Stream clear;
clear = pbe.GetDataStream(key);
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 unc = Ld.GetInputStream();
byte[] buff = new byte[unc.Length];
unc.Read(buff, 0, (int)unc.Length);
Console.WriteLine(buff);
}
else
{
PgpLiteralData Ld = null;
Ld = (PgpLiteralData)message;
Stream unc = Ld.GetInputStream();
byte[] buff = new byte[unc.Length];
unc.Read(buff, 0, (int)unc.Length);
Console.WriteLine(buff);
}
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
private PgpPrivateKey getPrivateKey(string privateKey, string passPhrase)
{
MemoryStream keyIn = new MemoryStream(Encoding.UTF8.GetBytes(privateKey));
PgpSecretKeyRingBundle secretKeyRingBundle = new PgpSecretKeyRingBundle(PgpUtilities.GetDecoderStream(keyIn));
foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
{
foreach (PgpSecretKey secretKey in kRing.GetSecretKeys())
{
PgpPrivateKey key = secretKey.ExtractPrivateKey(passPhrase.ToCharArray());
return key;
}
}
return null;
}