Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SExprParser.parseSecretKey:java.io.IOException:遇到未知字符:K_Java_Cryptography_Bouncycastle_Gnupg - Fatal编程技术网

SExprParser.parseSecretKey:java.io.IOException:遇到未知字符:K

SExprParser.parseSecretKey:java.io.IOException:遇到未知字符:K,java,cryptography,bouncycastle,gnupg,Java,Cryptography,Bouncycastle,Gnupg,我正在尝试使用bouncy castlebcprov-jdk15on-1.66.jar从D:\Users\xxxxx\AppData\Roaming\gnupg\private-keys-v1.D加载密钥 import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.bouncycastl

我正在尝试使用bouncy castlebcprov-jdk15on-1.66.jar从D:\Users\xxxxx\AppData\Roaming\gnupg\private-keys-v1.D加载密钥

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.bouncycastle.gpg.SExprParser;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPSecretKey;
import org.bouncycastle.openpgp.operator.PBEProtectionRemoverFactory;
import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider;
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePBEProtectionRemoverFactory;
import org.bouncycastle.util.encoders.Hex;

public class LoadKey {
    public static void main(String[] args) throws IOException, PGPException {
        String filePath = "D:\\Users\\XXXX\\AppData\\Roaming\\gnupg\\private-keys-v1.d\\4B8379C14DED7818D546E3C4AF7F1D0DF5716BCD.key";
        String pass = "siv_test";
            PGPDigestCalculatorProvider calculatorProvider = new JcaPGPDigestCalculatorProviderBuilder()
                    .build();
            PBEProtectionRemoverFactory passphraseProvider = new JcePBEProtectionRemoverFactory(
                pass.toCharArray());
        InputStream in = new FileInputStream(filePath);


        PGPSecretKey key =

        new SExprParser(calculatorProvider).parseSecretKey(
                new BufferedInputStream(in), passphraseProvider,
                new JcaKeyFingerprintCalculator());

        System.out.println("Found key "
                + Hex.toHexString(key.getPublicKey().getFingerprint()));
            
        
    }
}
但是我越来越

线程“main”java.io.IOException中出现异常:遇到未知字符:K 在org.bouncycastle.gpg.SXprUtils.skipoppenincorlations(未知来源) 在org.bouncycastle.gpg.sexprprpparser.parseSecretKey(未知来源)

gpg(GnuPG)2.2.23


libgcrypt 1.8.6

在我看来,SExprParse只接受“原始”pgp密钥,而不接受“PEM”密钥

我的示例中的密钥取自Bouncy Castle SExprTest.java,因此它是一个带有密码“fred”的示例密钥

由于密钥是二进制形式,我使用
ByteArrayInputStream
来处理密钥,这是指向完整测试的链接:

程序正在成功运行,并最终显示一个密钥:

Found key 228f5c0cd3e1d2716760770be5ac9684b1a77195
也许我们的一位蹦蹦跳跳城堡专家能更好地解释这种行为

代码如下:

import org.bouncycastle.gpg.SExprParser;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPSecretKey;
import org.bouncycastle.openpgp.operator.PBEProtectionRemoverFactory;
import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider;
import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePBEProtectionRemoverFactory;
import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.util.encoders.Hex;
import java.io.*;
import java.security.Security;

public class LoadKeySo4 {
    public static void main(String[] args) throws IOException, PGPException {
        Security.addProvider(new BouncyCastleProvider());
        //String filePath = "D:\\Users\\XXXX\\AppData\\Roaming\\gnupg\\private-keys-v1.d\\4B8379C14DED7818D546E3C4AF7F1D0DF5716BCD.key";
        //String pass = "siv_test";
        byte[] key1 = Base64.decode(
                "KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AOpclatE"
                        + "WCIXSUA2y44L/jPGE1lU3d75nMN5+iJK/vXFGmQdvZWhewX2LSJ5vwpcLcQ1"
                        + "u3QXRbOcY0o+jRAER2vHZMEfyHfHir6QDibVTO5IOjLettW054hew/HoFbA2"
                        + "v3t0BB2HERWMFO6WLrC7wBVpgL85m85VhE/OmZGIOY7bapQtULoTQQ5Fwr0n"
                        + "+zG3gujxDcmpcTouz0DPtVLvMERnHMtJ4GEccWfiFrGUnLbBnYCnnsNoV/0m"
                        + "f/GseRltCnxPS2Fl+rhdkPmxC0Dkv6naV+NMiaZVk5FYdtY66xATvETv+xTa"
                        + "X8xHIhJc4CrR/e4T0VPBh/94o5nHL1cT6HcpKDE6ZTM6AQABKSg5OnByb3Rl"
                        + "Y3RlZDI1Om9wZW5wZ3AtczJrMy1zaGExLWFlcy1jYmMoKDQ6c2hhMTg6vqXu"
                        + "vvqQtUw4OjI3OTYxMzQ0KTE2OlYbNG/073BvJLzSjbvoxQYpNzM2OkcNABDe"
                        + "gU7iUAJwVxNszEG+ackC6qk7Y+dQ6NN4Avy9pkGo+Rufs0G4yjHhVQMkH0QF"
                        + "Wrzf5GOvsvrJQyJGVLn2amz5KxU+onNv66UVi4D3LlCOghDcGoe/V7hY+zsh"
                        + "GN7elPhnBYbk7X1Jb5D03YrCOOCTnGLTLMc7E5qy4YSyRWMzAGGj/jkcY/B+"
                        + "ZEeLkTlHsnnukIMb24+1/sZrsV57AaVPRZwgzInxDGC9Tkg4j6fsHvvVw6ZD"
                        + "cm+ET/YGOf1dhMKEq/7GXcd5qeEpMBFi+6p2PrPJUwUHu/PIOs1SCIYlrhGR"
                        + "iifAHtOIdFGefo+E1v6kKZMO+FgLTeiGYN6T6vjkG7FMiWwnmamF6qNd1D5i"
                        + "TS2E4uiS5Z3QuwyXJfGkYYDjEmV5rVSol95Kd4wpebC7mFNbOk+zA4TB5Ytb"
                        + "5KN/w2lSW4btuB/pD/akfg6xJQ9BREv1vpO4CtK+d8VLCPHI7et1tKjwJNxd"
                        + "obw9P4HOBIPYdzbHARpAfZRLQlLRNcYp8DbHfzmDhIEPymO6+3CCtdfRE7xY"
                        + "c0SMpFFYGX17WGlmjdOYWtbqYrhDQ3ylzD3vrIQr12ZZXw00xSJkNk4aJ8Lx"
                        + "SihOXTuLiHhueckfCCbkWPfdJQg1ukjRiNgHdEF+7rk/2aMDsSYULJqtjSed"
                        + "CDi9tLqawmCz405E+W+Htbrp2yv7ktST2IaV56JQB4Yay8WAlnngoBtdlSyA"
                        + "wFVFm5VrCeZ5ckdUfK1qSezd32uQlb27XCZYGiaco5AWkhBOrdPoiw4Z14Pf"
                        + "z6xhhV+vA+X6lm9k70iG7RO9vf3V+EAbKktFos72rGJGhWOZgv5xr8DRjbIf"
                        + "/dOQsgceYg4xrTzn/SjOSNmTQu++Q1Uo5jjtMozgXawJNFPKcZ28DLTxdHQl"
                        + "a7jZK/FiiXXBL8J/VbN9DWZq7IOUMEhRym8KcAoyC7wQgpua2qhp8EXX7Qqd"
                        + "7dU4EcdWzzz/lF8pKDEyOnByb3RlY3RlZC1hdDE1OjIwMTgwNTI4VDAyMjIw"
                        + "MikpKQ==");
        String pass = "fred";

        PGPDigestCalculatorProvider calculatorProvider = new JcaPGPDigestCalculatorProviderBuilder()
                .build();
        PBEProtectionRemoverFactory passphraseProvider = new JcePBEProtectionRemoverFactory(
                pass.toCharArray());
        //InputStream in = new FileInputStream(filePath);
        InputStream in = new ByteArrayInputStream(key1);
        PGPSecretKey key =
                new SExprParser(calculatorProvider).parseSecretKey(
                        new BufferedInputStream(in), passphraseProvider,
                        new JcaKeyFingerprintCalculator());
        System.out.println("Found key "
                + Hex.toHexString(key.getPublicKey().getFingerprint()));
    }
}

你好,Michael Fehr,非常感谢您的回复。但是我们的想法是为给定的用户加载私钥。我的代码在GNUPG版本2.1.X中运行良好,因为它引发了GNUPG版本2.2.X的异常。也许您可以编辑您的问题,并将带有GNUPG版本2.2.X的示例密钥与密码短语一起附加?