【问题标题】:symmetric decryption throwing error对称解密抛出错误
【发布时间】:2015-09-04 19:49:56
【问题描述】:

我正在努力添加对使用 GPG 和对称加密加密的文件进行解密的功能。

但是,每当它尝试获取私钥数据时,此异常就会不断受到攻击:

无法将“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的代码

我不知道为什么它不起作用,也不知道下一步该去哪里。

【问题讨论】:

    标签: c# bouncycastle encryption-symmetric openpgp


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多