コマンド ライン gnupg を使用して、"John Doe <john@doe.com>" の RSA キーでキー リングを作成できます。と を使用して、uid "Jane Doe <jane@doe.com>" を持つ別のユーザーを追加することもでき--edit-key
ますadduid
。その結果、secring.gpg は次のようになります。
$ gpg -vv secring.gpg
:secret key packet:
version 4, algo 1, created 1380898817, expires 0
skey[0]: [2048 bits]
skey[1]: [17 bits]
iter+salt S2K, algo: 9, SHA1 protection, hash: 2, salt: 3825c4409323d7b0
protect count: 65536 (96)
protect IV: ac f9 8d 4a b7 3a 5d 7c b2 3c 28 ff 82 6d 4c ef
encrypted stuff follows
:user ID packet: "John Doe <john@doe.com>"
:signature packet: algo 1, keyid 9991E2282A9906C7
version 4, created 1380898818, md5len 0, sigclass 0x13
digest algo 2, begin of digest bd 01
hashed subpkt 2 len 4 (sig created 2013-10-04)
hashed subpkt 27 len 1 (key flags: 03)
hashed subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
hashed subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
hashed subpkt 22 len 3 (pref-zip-algos: 2 3 1)
hashed subpkt 30 len 1 (features: 01)
subpkt 16 len 8 (issuer key ID 9991E2282A9906C7)
data: [2045 bits]
:trust packet: flag=00 sigcache=00
:user ID packet: "Jane Doe <jane@doe.com>"
:signature packet: algo 1, keyid 9991E2282A9906C7
version 4, created 1380899570, md5len 0, sigclass 0x13
digest algo 2, begin of digest 2f 50
hashed subpkt 2 len 4 (sig created 2013-10-04)
hashed subpkt 27 len 1 (key flags: 03)
hashed subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
hashed subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
hashed subpkt 22 len 3 (pref-zip-algos: 2 3 1)
hashed subpkt 30 len 1 (features: 01)
hashed subpkt 23 len 1 (key server preferences: 80)
subpkt 16 len 8 (issuer key ID 9991E2282A9906C7)
data: [2047 bits]
:trust packet: flag=00 sigcache=00
sec 2048R/2A9906C7 2013-10-04 John Doe <john@doe.com>
sig 2A9906C7 2013-10-04 [selfsig]
uid Jane Doe <jane@doe.com>
sig 2A9906C7 2013-10-04 [selfsig]
java.security.KeyPairから始めて、Bouncycastleを使用して、Javaで同じものを作成したいと思います。つまり、次のような署名を使用します。
public void createKeyRing(KeyPair keyPair, char[] pass, String[] ids)
ここで、pass はパスフレーズ、ids = new String[] {"John Doe <john@doe.com>", "Jane Doe <jane@doe.com>"}
. このチュートリアルの行に従いました。コードの重要な部分は次のとおりです。
PGPKeyRingGenerator keyRingGen =
new PGPKeyRingGenerator(
PGPSignature.POSITIVE_CERTIFICATION, rsakp_sign,
id, sha1Calc, signhashgen.generate(), null,
new BcPGPContentSignerBuilder(
rsakp_sign.getPublicKey().getAlgorithm(),
HashAlgorithmTags.SHA1),
pske);
// Add our encryption subkey, together with its signature.
keyRingGen.addSubKey(rsakp_enc, enchashgen.generate(), null);
ここで、rsakp_sign と rsakp_enc は、それぞれ署名キーと暗号化キーの RSA キーペアであり、signhashgen と enchashgen は、アルゴリズム設定などを含むサブパケットのジェネレータです。
John のキーのみを作成する限り、すべて問題ありません。しかし、私が Jane を追加したいとき、私は問題に遭遇します:どうやら addSubKey を使用して Jane の signhashgen 化されたキーペアを追加することはできません。最初の素朴な試みは次のようになります。
PGPSignatureGenerator sGen = new PGPSignatureGenerator(
new BcPGPContentSignerBuilder(PGPPublicKey.RSA_SIGN, PGPUtil.SHA1));
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, pgpPrivateKey);
PGPSignature certification = sGen.generateCertification("Jane Doe <jane@doe.com>", pgpPublicKey);
PGPPublicKey newKey = PGPPublicKey.addCertification(pgpPublicKey, "Jane Doe <jane@doe.com>", certification);
keyRingGen.addSubKey(new PGPKeyPair(newKey, pgpPrivateKey), enchashgen.generate(), null);
それは何もしません。追加のエントリは に表示されませんgpg --vv meeththedoes.asc
。
または、John のキーリングを取得して秘密鍵を抽出し、Jane を追加することもできます。
PGPSecretKeyRing keyRing = keyRingGen.generateSecretKeyRing();
PGPSecretKey pgpSecretKey = keyRing.getSecretKey();
BcPGPDigestCalculatorProvider calculatorProvider = new BcPGPDigestCalculatorProvider();
BcPBESecretKeyDecryptorBuilder decryptor = new BcPBESecretKeyDecryptorBuilder(calculatorProvider);
PGPPrivateKey pgpPrivateKey = pgpSecretKey.extractPrivateKey(decryptor.build(pass));
PGPPublicKey pgpPublicKey = pgpSecretKey.getPublicKey();
PGPSignatureGenerator sGen = new PGPSignatureGenerator(
new BcPGPContentSignerBuilder(PGPPublicKey.RSA_SIGN, PGPUtil.SHA1));
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, pgpPrivateKey);
PGPSignature certification = sGen.generateCertification("Jane Doe <jane@doe.com>", pgpPublicKey);
PGPPublicKey newKey = PGPPublicKey.addCertification(pgpPublicKey, "Jane Doe <jane@doe.com>", certification);
pgpSecretKey = PGPSecretKey.replacePublicKey(pgpSecretKey, newKey);
これはちょっとうまくいきますが、結果として得られるキー リングでは、John と Jane は異なるサブパケットのセットを持っています。
$ gpg -vv meetthedoes.asc
gpg: ASCII-Hülle: BEGIN PGP PRIVATE KEY BLOCK
gpg: ASCII-Hülle: Version: BCPG v1.48
:secret key packet:
version 4, algo 3, created 1380908986, expires 0
skey[0]: [2048 bits]
skey[1]: [17 bits]
iter+salt S2K, algo: 9, SHA1 protection, hash: 2, salt: 696d2d42bd6b727c
protect count: 65536 (96)
protect IV: 87 31 81 df 17 fa 74 c4 c3 35 39 26 98 c1 15 27
encrypted stuff follows
:user ID packet: "John Doe <john@doe.com>"
:signature packet: algo 3, keyid 3A80073198CF2010
version 4, created 1380908986, md5len 0, sigclass 0x13
digest algo 2, begin of digest a5 c8
hashed subpkt 2 len 4 (sig created 2013-10-04)
hashed subpkt 27 len 1 (key flags: 03)
hashed subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
hashed subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
hashed subpkt 22 len 3 (pref-zip-algos: 2 3 1)
hashed subpkt 30 len 1 (features: 01)
subpkt 16 len 8 (issuer key ID 3A80073198CF2010)
data: [2047 bits]
:user ID packet: "Jane Doe <jane@doe.com>"
:signature packet: algo 3, keyid 3A80073198CF2010
version 4, created 1380908986, md5len 0, sigclass 0x13
digest algo 2, begin of digest f6 e8
hashed subpkt 2 len 4 (sig created 2013-10-04)
subpkt 16 len 8 (issuer key ID 3A80073198CF2010)
data: [2039 bits]
sec 2048s/98CF2010 2013-10-04 John Doe <john@doe.com>
sig 98CF2010 2013-10-04 [selfsig]
uid Jane Doe <jane@doe.com>
sig 98CF2010 2013-10-04 [selfsig]
私はおそらく望んでいませんよね?いずれにせよ、方法も間違っているようです。最初にジェネレーターを完全にインストルメント化してから、Bouncycastle にキー リング ファイルを一気に生成させることはできませんか? ここで何が間違っていますか?