SExprParser.parseSecretKey:java.io.IOException:遇到未知字符:K
我正在尝试使用bouncy castlebcprov-jdk15on-1.66.jar从D:\Users\xxxxx\AppData\Roaming\gnupg\private-keys-v1.D加载密钥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
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的示例密钥与密码短语一起附加?