0

PGP で暗号化と復号化を行うには、公開鍵と秘密鍵を文字列形式で渡す必要があります。このようなキーを生成しましたが、それらを使用できません。公開鍵と秘密鍵をこれから文字列形式で取得する方法を教えてください。また、rsakeygenerator は秘密鍵のパスフレーズを与えていません。では、秘密鍵のパスフレーズはどこで入手できますか?

private void button2_Click(object sender, EventArgs e)
{
    // keyPair = createASymRandomCipher();
    //CipherPublicKey publicKey = getCipherPublicKey(keyPair);
    AsymmetricCipherKeyPair keyPair = createASymRandomCipher();
    Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters pubkey = (Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)keyPair.Public;
    Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters privkey = (Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters)keyPair.Private;
    CipherPublicKey pbkey = getCipherPublicKey(pubkey);
    CipherPrivateKey prvkey = getCipherPrivateKey(privkey);

}

private static AsymmetricCipherKeyPair createASymRandomCipher() 
{
    RsaKeyPairGenerator r = new RsaKeyPairGenerator();
    r.Init(new KeyGenerationParameters(new SecureRandom(),
          1024));
    AsymmetricCipherKeyPair keys = r.GenerateKeyPair();
    return keys;
}

[Serializable]
private struct CipherPrivateKey
{
    public byte[] modulus; 
    public byte[] publicExponent; 
    public byte[] privateExponent; 
    public byte[] p; 
    public byte[] q; 
    public byte[] dP; 
    public byte[] dQ; 
    public byte[] qInv;
}

[Serializable]
private struct CipherPublicKey 
{ 
    public bool isPrivate; 
    public byte[] modulus; 
    public byte[] exponent;
}

private static CipherPublicKey getCipherPublicKey(Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters cPublic) 
{ 
    CipherPublicKey cpub = new CipherPublicKey(); cpub.modulus = cPublic.Modulus.ToByteArray(); 
    cpub.exponent = cPublic.Exponent.ToByteArray(); 
    return cpub; 
}

private static CipherPrivateKey getCipherPrivateKey(Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters cPrivate)
{
    CipherPrivateKey cpri = new CipherPrivateKey(); 
    cpri.dP = cPrivate.DP.ToByteArray(); 
    cpri.dQ = cPrivate.DQ.ToByteArray(); 
    cpri.modulus = cPrivate.Modulus.ToByteArray(); 
    cpri.p = cPrivate.P.ToByteArray(); 
    cpri.privateExponent = cPrivate.Exponent.ToByteArray(); 
    cpri.publicExponent = cPrivate.PublicExponent.ToByteArray(); 
    cpri.q = cPrivate.Q.ToByteArray(); 
    cpri.qInv = cPrivate.QInv.ToByteArray(); 
    return cpri;
}
4

2 に答える 2

0

変換の質問に対する答えは、それらをBase64Stringsに変換することです。

16進数で表示する場合(ユーザーが簡単に入力できるようにするため)、System.Runtime.Remoting.Metadata.W3cXsd2001名前空間を使用してHEX担当者との間で変換を行うことができます。これがC#の例です。

また、あなたのスループロセスにセキュリティ上の欠陥があるかもしれないと言いますが、私がそれに対処する資格があるかどうかはわかりません。(ジョンの投稿を参照)

于 2009-05-20T04:57:07.467 に答える
0

ユーザーにパスフレーズを尋ねる必要があります。パスフレーズを持つことの要点は、それなしでは秘密鍵を作成することができず、ユーザーだけがそれを提供できるということです。

(BouncyCastle API に慣れていないため、残りのコードは見ていません。ただし、多くのバイト配列を持つ変更可能な構造体の知恵には疑問があります...)

于 2009-05-19T11:16:06.013 に答える