2017-02-11 3 views
1

J'ai une paire de clés RSA codée DER créée en Crypto ++, ainsi qu'un chiffrement. Ils sont la chaîne Base64Encoded. Je décode d'abord les données de Base64 en tableau d'octets, mais je ne suis pas sûr de savoir comment les charger en RSACryptoServiceProvider.Charger une paire de clés RSA codée ASN.1/DER en C#

static void Main() 
{ 
    string pbkeystr = "mypublickey"; 
    string pvkeystr = "myprivatekey"; 
    string cipherstr = "mycipher"; 

    byte[] pbkey = Convert.FromBase64String(pbkeystr); 
    byte[] pvkey = Convert.FromBase64String(pvkeystr); 
    byte[] cipher = Convert.FromBase64String(cipherstr); 

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

    //Set keys here.. 

    //Decrypt the cipher using private key 
    rsa.Decrypt(pvkey, false); 
} 

Il n'existe aucune fonction permettant de définir des clés. La seule chose que j'ai trouvé était ImportParameters méthode, qui prend RSAParameters classe qui se compose de p, q, n, module, exposant etc. Je n'ai pas accès à ceux-ci.

Est-il possible de charger les clés sous forme de chaîne? Comment puis-je charger la clé dans RSACryptoServiceProvider?

+1

Que contient la chaîne encodée en Base64? Une clé DER/PEM ASN.1, ou autre chose? – yaakov

+0

C'est DER à partir de Crypto ++ – Kyojin

Répondre

1

Est-il possible de charger les clés sous forme de chaîne? Comment puis-je charger la clé dans RSACryptoServiceProvider?

De votre autre question Crypto ++, How to load Base64 RSA keys in Crypto++, il semble que vous avez seulement les clés publiques et privées parce que vous avez utilisé DEREncode et BERDecode. C'est-à-dire que vous avez les paramètres RSA, et non les informations sur la clé publique et les informations sur la clé privée. Vos clés n'ont pas les identifiants OID et les numéros de version. Les choses vont bien comme ça.

Sur le projet de code, vous aurez besoin d'une classe C# qui analyse l'ASN.1/DER après le décodage Base64. L'article CodeProject fournit une classe C# appelée AsnKeyParser pour lire l'ASN.1/DER et renvoie un RSAParameters pour charger dans un CSP.

Le code de la classe AsnKeyParser est d'environ 800 lignes, et il y a cinq autres fichiers de support pour que tout se passe, donc ce n'est pas vraiment approprié de le placer ici. Vous devriez le télécharger vous-même. Le fichier d'intérêt est appelé CSInteropKeys.zip.

Une fois que vous aurez introduit la classe AsnKeyParser, ce sera aussi simple que ce qui suit pour une clé publique RSA. La clé privée sera similaire et le code est donné sur le site CodeProject. Liaison à des fichiers sur un autre site est désapprouvée, mais je ne sais pas comment fournir les informations sinon. Il y a trop de code source impliqué pour placer une réponse.


Pour être complet, .NET ne pas make Interop facile. Ils n'acceptent pas ASN.1/DER ou PEM. Au contraire, .Net accepte une représentation XML des clés. Je crois que vous pouvez le trouver dans RFC 3275, XML-Signature Syntax and Processing. Microsoft does not state that for you. Je l'ai reconstitué quand j'ai écrit l'article Code Project. Peut-être devrions-nous ajouter une classe à Crypto ++ pour régurgiter XML en plus de ASN.1/DER et PEM.

+0

Ok, ce que j'ai fait, c'est que j'ai lu la chaîne Base64 et l'ai convertie en données de byte (Conversion de Base64 en octets DEREncoded à l'origine). L'écrire dans un fichier appelé "rsa-private.der" et le passer à AsnKeyParser comme dans votre exemple, mais j'ai une exception: CryptographicException: Parameter was invalid. http://pastebin.com/hLwErEfp Qu'ai-je fait de mal? – Kyojin

+0

@Kyojin - A partir de vos notes sur le PasteBin, il semble que l'exception se produise à 'var data = rsp.Decrypt (cipherArr, false)'. Est-ce exact? Si oui, je crois que cela signifie que la clé privée chargée comme prévu. Je devine que le problème est soit 'csp.KeyNumber = AT_KEYEXCHANGE' ou son remplissage de RSA. Peut-être que vous pouvez essayer ['Decrypt Method (Byte [], RSAEncryptionPadding)'] (https://msdn.microsoft.com/fr-fr/library/mt132683 (v = vs.110) .aspx). Si c'est plus que rembourrage, alors vous devriez probablement poser une nouvelle question. Stack Overflow aime garder les questions et réponses de portée limitée. – jww

+0

Oui, j'ai fait rsa.ToXmlString() et vérifié le et tout est correct et identique à la chaîne base64 dans le fichier. Alors pourquoi n'a-t-il pas décrypté le chiffre? Je suppose que c'est hors-sujet maintenant. – Kyojin