Bouncy Castle for C# を使用して RSA キー ペアを生成しようとしています。http://bouncycastle-pgp-cookbook.blogspot.de/2013_01_01_archive.htmlにある Java のチュートリアルに従い、マスター キーと署名キーを作成しました。私のコードは次のようになります
IAsymmetricCipherKeyPairGenerator generator
= GeneratorUtilities.GetKeyPairGenerator("RSA");
generator.Init(keyRingParams.RsaParams);
/* Create the master (signing-only) key. */
PgpKeyPair masterKeyPair = new PgpKeyPair(
PublicKeyAlgorithmTag.RsaSign,
generator.GenerateKeyPair(),
DateTime.UtcNow);
Debug.WriteLine("Generated master key with ID "
+ masterKeyPair.KeyId.ToString("X"));
PgpSignatureSubpacketGenerator masterSubpckGen
= new PgpSignatureSubpacketGenerator();
masterSubpckGen.SetKeyFlags(false, PgpKeyFlags.CanSign
| PgpKeyFlags.CanCertify);
masterSubpckGen.SetPreferredSymmetricAlgorithms(false,
(from a in keyRingParams.SymmetricAlgorithms
where a.IsSelected
select (int) a.Value).ToArray());
masterSubpckGen.SetPreferredHashAlgorithms(false,
(from a in keyRingParams.HashAlgorithms
where a.IsSelected
select (int) a.Value).ToArray());
/* Create a signing and encryption key for daily use. */
PgpKeyPair encKeyPair = new PgpKeyPair(
PublicKeyAlgorithmTag.RsaGeneral,
generator.GenerateKeyPair(),
DateTime.UtcNow);
Debug.WriteLine("Generated encryption key with ID "
+ encKeyPair.KeyId.ToString("X"));
PgpSignatureSubpacketGenerator encSubpckGen
= new PgpSignatureSubpacketGenerator();
encSubpckGen.SetKeyFlags(false, PgpKeyFlags.CanEncryptCommunications
| PgpKeyFlags.CanEncryptStorage);
masterSubpckGen.SetPreferredSymmetricAlgorithms(false,
(from a in keyRingParams.SymmetricAlgorithms
where a.IsSelected
select (int) a.Value).ToArray());
masterSubpckGen.SetPreferredHashAlgorithms(false,
(from a in keyRingParams.HashAlgorithms
where a.IsSelected
select (int) a.Value).ToArray());
/* Create the key ring. */
PgpKeyRingGenerator keyRingGen = new PgpKeyRingGenerator(
PgpSignature.DefaultCertification,
masterKeyPair,
keyRingParams.Identity,
keyRingParams.PrivateKeyEncryptionAlgorithm.Value,
keyRingParams.GetPassword(),
true,
masterSubpckGen.Generate(),
null,
new SecureRandom());
/* Add encryption subkey. */
keyRingGen.AddSubKey(encKeyPair, encSubpckGen.Generate(), null);
/* Generate the key ring. */
keyRingGen.GenerateSecretKeyRing();
コードはこれまでのところ機能しており、デバッグ出力にも意味のあるキー ID が出力されます。ただし、秘密鍵をファイルに保存して GnuPG にインポートするとsec 0s/FFFFFFFF 2013-07-30
、マスター キーとして表示されます。暗号鍵はOKです。
編集:gpg --list-packet
ショー
:secret key packet:
version 4, algo 3, created 1375205303, expires 0
unknown algorithm 3
アルゴリズム 3 はPublicKeyAlgorithmTag.RsaSign
で、マスター キーには問題ないと思います (Java サンプルもそうしています) が、GnuPG はこれを好みません...
私は何を間違っていますか?
前もって感謝します、クリストフ