2009-05-19 5 views
0

Je dois passer la clé publique et la clé privée au format de chaîne pour le cryptage et le décryptage dans pgp. J'ai généré les clés comme ça mais je ne suis pas capable de les utiliser. Alors quelqu'un peut-il me dire comment obtenir la clé publique et la clé privée en format de chaîne à partir de cela. Et aussi le rsakeygenerator n'a pas donné le mot de passe pour la clé privée. Alors, où puis-je obtenir une phrase secrète pour une clé privée?Problème lors de la transmission d'une clé privée et d'une clé publique?

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; 
} 

Répondre

0

Vous devez demander la phrase secrète à l'utilisateur. Le point entier de ayant une phrase secrète est que vous ne serez pas en mesure de travailler sur la clé privée sans elle, et que seul l'utilisateur peut fournir.

(je n'ai pas regardé le reste de votre code, ne pas être familier avec l'API BouncyCastle. Je ne doute la sagesse d'une struct mutable avec beaucoup de tableaux d'octets mais ...)

0

La réponse juste votre question est de les convertir à la conversion Base64Strings

Si vous voulez en hexadécimal (de sorte qu'un utilisateur peut entrer plus facilement), vous pouvez utiliser l'espace de noms System.Runtime.Remoting.Metadata.W3cXsd2001 pour obtenir convertir/d'un représentant HEX. Voici un example in C#.

Je dirai aussi qu'il y a peut-être un défaut de sécurité dans votre processus, mais je ne suis pas sûr d'être qualifié pour y remédier. (Voir le post de Jon)

Questions connexes