我必须将文件加密为 pgp格式。我有.asc格式的公钥。
cipher init()方法需要传入公钥。使用文件创建该密钥的方法是什么。就我而言,它是.asc文件。
Cipher cipher;
Key publicKey = null;
try
{
cipher = Cipher.getInstance("RSA", "BC");
} catch (NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException e) {
String msg = "failed to create output stream";
LOGGER.error( msg, e );
throw new RuntimeException( msg, e );
}
try {
publicKey = getPublicKey(publicKeyPath);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ( new CipherOutputStream(outputStream, cipher));
我收到错误: java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:无效的密钥格式
我的getPublicKey方法看起来像(但我想,我不必这样做,因为文件本身有公钥)
public static PublicKey getPublicKey(String filename)
throws Exception {
byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
X509EncodedKeySpec spec =
new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
Public_key.asc看起来像:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: Encryption Desktop 10.3.2 (Build 16127)
mQENBFYhXNoBCACgX/u03wm8cLqmTZiKGx6H/1ZUoBsfaDB2rdG2D8jYQzvaq4MA
hZWBEVhA2BGKrNI+a2SDhKGAY4OK7aUZVAVG1bfQNVdNe80TbEF8g/wO2FreYPkb
ojPtkwgyzsvb1BKwgRM1UMjkM5OWnhAPDhFDc39SFbmHLsXrURqFqJd9T3xzF6ty
................................................................
D4WXvHpPXCJcwCBe+/81ZpjxlrLkUu8bO79jxZdKcI5ZRpmIe/VPJoDUVKLvl9n3
ANvDJGdGcW3x6RyL9QOnoRDf6njimqcTm8UqImdLCz4TFdv94dvM4K0NOWuFdYal
E9Q+U0Q7aiaWn+Kt+OYpd6++m7wnJRH/q0H69LIR9v3Td3udzOaxv/gzXF1BFuAS
DQs6iA==
=ckOV
-----END PGP PUBLIC KEY BLOCK-----
以下是此密钥的属性:
答案 0 :(得分:1)
Robert和Maarten Bodewes的回复是其中一条路。
我的公钥是.asc文件和.skr中的私钥(密钥密钥环)
我以这种方式实现它,它对我有用:
public static PublicKey getPublicKey(
String filePath)
throws PGPException, NoSuchProviderException, FileNotFoundException, IOException
{
PGPPublicKey encKey = readPublicKey(new FileInputStream(filePath));
return new JcaPGPKeyConverter().setProvider("BC").getPublicKey(encKey);
}
public static PrivateKey getPrivateKey(
InputStream in, char[] passwd)
throws IOException, PGPException, NoSuchProviderException
{
in = PGPUtil.getDecoderStream(in);
PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(in);
//
// we just loop through the collection till we find a key suitable for encryption, in the real
// world you would probably want to be a bit smarter about this.
//
//
// iterate through the key rings.
//
Iterator<?> rIt = pgpSec.getKeyRings();
while (rIt.hasNext())
{
PGPSecretKeyRing kRing = (PGPSecretKeyRing)rIt.next();
Iterator<?> kIt = kRing.getSecretKeys();
while (kIt.hasNext())
{
PGPSecretKey k = (PGPSecretKey)kIt.next();
if (k != null)
{
PGPPrivateKey pk = k.extractPrivateKey(passwd, "BC");
return new JcaPGPKeyConverter().setProvider("BC").getPrivateKey(pk);
}
}
}
throw new IllegalArgumentException("Can't find secured key in key ring.");
}
public static PGPPublicKey readPublicKey(
InputStream in)
throws IOException, PGPException
{
in = PGPUtil.getDecoderStream(in);
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);
//
// we just loop through the collection till we find a key suitable for encryption, in the real
// world you would probably want to be a bit smarter about this.
//
//
// iterate through the key rings.
//
Iterator<?> rIt = pgpPub.getKeyRings();
while (rIt.hasNext())
{
PGPPublicKeyRing kRing = (PGPPublicKeyRing)rIt.next();
Iterator<?> kIt = kRing.getPublicKeys();
while (kIt.hasNext())
{
PGPPublicKey k = (PGPPublicKey)kIt.next();
if (k.isEncryptionKey())
{
return k;
}
}
}
throw new IllegalArgumentException("Can't find encryption key in key ring.");
}