Как расшифровать PGP в C# (System.Exception: 'исключение дешифрования секретного ключа') - PullRequest
0 голосов
/ 13 июля 2020

Я пытался расшифровать зашифрованные данные с помощью 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...