PGP PgpPublicKeyEncryptedData выбрасывает преждевременное завершение потока в PartialInputStream - PullRequest
0 голосов
/ 21 ноября 2018

Я видел несколько потоков по Java для закрытия потока.Я просто не понимаю, к чему они клонят.Я преобразую все в использование снова, как только я выясню проблему.

Возможно ли, что это потому, что я храню закрытый ключ в виде строки, а затем преобразую его?

        public static MemoryStream StringToStream(string toConvert)
    {
        // convert string to stream
        var byteArray = Encoding.Default.GetBytes(toConvert);
        //byte[] byteArray = Encoding.ASCII.GetBytes(contents);
        var stream = new MemoryStream(byteArray);

        return stream;
    }

У меня есть намерения немного его улучшить, но когда я не смог заставить его работатьЯ вернулся в основном к версии, размещенной здесь Исходное сообщение

public static byte[] DecryptBytes(byte[] inputData)
    {
        if(!PrivateKeyPopulated)
        { throw new Exception("PrivateKey Must be populated!!!");}

        if (String.IsNullOrWhiteSpace(_passcode))
        { throw new Exception("Passcode Must be populated!!!"); }

        byte[] error = Encoding.ASCII.GetBytes("ERROR");

        Stream inputStream = new MemoryStream(inputData);
        inputStream = PgpUtilities.GetDecoderStream(inputStream);
        MemoryStream decoded = new MemoryStream();

        try
        {
            PgpObjectFactory pgpF = new PgpObjectFactory(inputStream);
            PgpEncryptedDataList enc;
            PgpObject o = pgpF.NextPgpObject();

            //
            // the first object might be a PGP marker packet.
            //
            if (o is PgpEncryptedDataList)
                enc = (PgpEncryptedDataList)o;
            else
                enc = (PgpEncryptedDataList)pgpF.NextPgpObject();

            //
            // find the secret key
            //
            PgpPrivateKey sKey = null;
            PgpPublicKeyEncryptedData pbe = null;
            PgpSecretKeyRingBundle pgpSec = new PgpSecretKeyRingBundle(
            PgpUtilities.GetDecoderStream(PSS_PGPEncrypt.StringToStream(_privateKey)));
            foreach (PgpPublicKeyEncryptedData pked in enc.GetEncryptedDataObjects())
            {
                sKey = FindSecretKey(pgpSec, pked.KeyId, _passcode.ToCharArray());
                if (sKey != null)
                {
                    pbe = pked;
                    break;
                }
            }
            if (sKey == null)
                throw new ArgumentException("secret key for message not found.");

            Stream clear = pbe.GetDataStream(sKey);<------ KABOOOM
            PgpObjectFactory plainFact = new PgpObjectFactory(clear);
            PgpObject message = plainFact.NextPgpObject();

            if (message is PgpCompressedData)
            {
                PgpCompressedData cData = (PgpCompressedData)message;
                PgpObjectFactory pgpFact = new PgpObjectFactory(cData.GetDataStream());
                message = pgpFact.NextPgpObject();
            }
            if (message is PgpLiteralData)
            {
                PgpLiteralData ld = (PgpLiteralData)message;
                Stream unc = ld.GetInputStream();
                Streams.PipeAll(unc, decoded);
            }
            else if (message is PgpOnePassSignatureList)
                throw new PgpException("encrypted message contains a signed message - not literal data.");
            else
                throw new PgpException("message is not a simple encrypted file - type unknown.");

            if (pbe.IsIntegrityProtected())
            {
                if (!pbe.Verify())
                     throw new Exception("PGP Error - Message failed integrity check.");
                //else
                    //"Message integrity check passed.", "PGP Error"
            }
            else
            {
                //MessageBox.Show(null, "No message integrity check.", "PGP Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            return decoded.ToArray();
        }

enter image description here

...