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

您需要向用户询问密码。拥有密码短语的全部意义在于,没有它你将无法计算出私钥,只有用户才能提供它。

(我没有看过你的其余代码,不熟悉 BouncyCastle API。我确实质疑具有大量字节数组的可变结构的智慧......)

于 2009-05-19T11:16:06.013 回答
0

您的转换问题的答案是将它们转换为 Base64Strings

如果您希望它以十六进制表示(以便用户可以更轻松地输入),您可以使用 System.Runtime.Remoting.Metadata.W3cXsd2001 命名空间来转换为十六进制代表/从十六进制代表转换。这是C# 中的一个示例

我还要说你的过程中可能存在安全漏洞,但我不确定我是否有资格解决它。(见乔恩的帖子)

于 2009-05-20T04:57:07.467 回答