对称解密抛出错误

时间:2015-09-04 19:49:57

标签: c# bouncycastle encryption-symmetric openpgp

我正致力于添加解密使用GPG& amp;对称加密。

但是,无论何时尝试获取私钥数据,此异常都会受到影响:

  

无法投射类型' Org.BouncyCastle.Bcp​​g.OpenPgp.PgpPbeEncryptedData'输入' Org.BouncyCastle.Bcp​​g.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;
            }
        }

我引用了here

中的代码

我迷失了为什么它没有工作,也不确定下一步该去哪里。

1 个答案:

答案 0 :(得分:0)

Hybrid Cryptosystems

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,它似乎采用输入流和密码短语,并将解密后的信息作为输出流提供。有一个example for the Java Bouncy Castle package,它可能非常相似,大部分归结为

byte[] decryptedAgainByteArray = ByteArrayHandler.decrypt(encryptedAgain, PASS.toCharArray());