bouncycastle バージョン 1.49 で非推奨でないコンストラクターを使用しようとしていますが、これらが作成するオブジェクトの使用方法を理解するのに苦労しています。これは、私が見つけたチュートリアルのいずれとも少し異なるためです。ウェブ。
これまでのところ私のコードです。PGPContentSigner で何をすべきか、またそれを OutputStream に接続する方法を誰か教えてもらえますか? 私が達成したいのは、データを特定の誰かに暗号化する必要なしに、データに添付された署名です (のようにgpg --clearsign -a <textfile>
)。
私が調べたところArmoredOutputStream
、その方法beginClearText(int)
は有望に見えますが、それを呼び出し、データを出力ストリームにダンプし、 を呼び出しendClearText
、署名バイトを に書き込むだけではArmoredOutputStream
機能しません。ストリームの低レベルの操作、ストリームへの制御バイトの突っ込みなど、署名の開始を通知する必要があるように見えます。署名者とそのパケットジャグリングを処理する装甲出力ストリームを一緒に。
/**
* Generate a signature for the given bytes so that they can be sent off and the recipient can verify
* that the bytes have not been tampered with in transit.
*
* @param dataBytes the data to sign
* @return the data along with the signature
* @throws PGPException if there's a problem generating the signature
*/
public static byte[] clearSignBytes(byte[] dataBytes, PGPSecretKeyRingCollection skrCollection, String keyPass) throws PGPException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); // this is where we put the signed data
try {
// get our secret key so we can init the signature generator
Iterator<PGPSecretKeyRing> it = skrCollection.getKeyRings();
PGPSecretKeyRing skr = it.next();
PGPSecretKey skey = skr.getSecretKey();
PGPPrivateKey prKey = skey.extractPrivateKey(new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider()).build(keyPass.toCharArray()));
BcPGPContentSignerBuilder signerBuilder = new BcPGPContentSignerBuilder(skey.getPublicKey().getAlgorithm(), PGPUtil.SHA256);
PGPContentSigner signer = signerBuilder.build(PGPSignature.BINARY_DOCUMENT, prKey);
// Now, we're supposed to write dataBytes somewhere and we're supposed to hand them to the signer somehow
// and ultimately we're supposed to tell the signer to output a signature and we put the signature and
// dataBytes together into baos.
// TODO ??????
} catch (Exception e) {
__l.error("Exception generating signature", e);
throw new PGPException("Exception while signing the data", e);
}
return baos.toByteArray();
}