ошибка симметричного дешифрования

Я работаю над добавлением возможности дешифровать файл, зашифрованный с помощью GPG и симметричного шифрования.

Однако всякий раз, когда он пытается получить данные закрытого ключа, эти исключения продолжают попадать:

Невозможно преобразовать объект типа Org.BouncyCastle.Bcpg.OpenPgp.PgpPbeEncryptedData к типу Org.BouncyCastle.Bcpg.OpenPgp.PgpPublicKeyEncryptedData.

куда бы я ни посмотрел, вот как вы это делаете:

Stream inputStream = IoHelper.GetStream(inputData);
        PgpObjectFactory pgpFactory = new PgpObjectFactory(PgpUtilities.GetDecoderStream(inputStream));
        PgpObject pgp = null;
        if (pgpFactory != null)
        {
            pgp = pgpFactory.NextPgpObject();
        }

        PgpEncryptedDataList encryptedData = null;
        if (pgp is PgpEncryptedDataList)
        {
            encryptedData = (PgpEncryptedDataList)pgp;
        }
        else
        {
            encryptedData = (PgpEncryptedDataList)pgpFactory.NextPgpObject();
        }

        Stream privateKeyStream = File.OpenRead(PrivateKeyOnlyPath);

        // find secret key
        PgpSecretKeyRingBundle pgpKeyRing = new PgpSecretKeyRingBundle(PgpUtilities.GetDecoderStream(privateKeyStream));
        PgpPrivateKey privateKey = null;

        foreach (PgpPublicKeyEncryptedData pked in encryptedData.GetEncryptedDataObjects())
        {
            privateKey = FindSecretKey(pgpKeyRing, pked.KeyId, Password.ToCharArray());
            if (privateKey != null)
            {
                //pubKeyData = pked;
                break;
            }
        }

Я ссылаюсь на код здесь

Я не понимаю, почему это не работает, и не знаю, что делать дальше.


person Eddie    schedule 04.09.2015    source источник


Ответы (1)


Гибридные криптосистемы

«Обычным» способом шифрования в OpenPGP (который реализует GnuPG) является гибридное шифрование: криптография с открытым / закрытым ключом для управления ключами и шифрования сеансового ключа, а затем симметричное шифрование с использованием этого сеансового ключа фактических данных.

Из того, что вы пишете, похоже, что этап криптографии с открытым / закрытым ключом был опущен, а ключ сеанса вместо этого был сгенерирован с использованием парольной фразы, например, с помощью команды gpg --symmetric. Вы можете определить, как он был зашифрован, используя pgpdump. Вывод для симметрично зашифрованного файла выглядит так:

Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
    New version(4)
    Sym alg - CAST5(sym 3)
    Iterated and salted string-to-key(s2k 3):
        Hash alg - SHA512(hash 10)
        Salt - 3b be 1b 03 64 c3 bb 7e 
        Count - 102400(coded count 105)
New: Symmetrically Encrypted Data Packet(tag 9)(26 bytes)
    Encrypted data [sym alg is specified in sym-key encrypted session key]

Особенно рассмотрите первую строку с пакетом зашифрованного сеансового ключа с симметричным ключом.

Что делать

Извините, я действительно не знаю C #, и ни один из них еще не работал с Bouncy Castle, поэтому я не могу предоставить готовое решение. Более того, документация по C # кажется более или менее отсутствующей.

Думаю, вам придется использовать PgpPbeEncryptedData class, который, похоже, принимает входной поток и парольную фразу и предоставляет расшифрованную информацию в качестве выходного потока. Существует пример для пакета Java Bouncy Castle, который, вероятно, будет очень похож и в основном сводится к к

byte[] decryptedAgainByteArray = ByteArrayHandler.decrypt(encryptedAgain, PASS.toCharArray());
person Jens Erat    schedule 04.09.2015