2010-02-19 6 views
0

dans une brève question: Comment puis-je remplir RSAParameters si j'avoir l'entrée suivante du tiers ?:Quel est le format du module de clé publique RSA et de l'exposant dans .net?

: Modulus 123456

Exponet: 111

Dans une longue histoire, je utilisez le code suivant:

RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider (2048);

RSAParameters rsaPublic = RSAalg.ExportParameters (false);

alors je peux obtenir le module et l'exposant de la clé publique rsa dans byte []. Pour écrire ces informations dans le format ASN.1

 RSAPublicKey ::= SEQUENCE { 
      modulus   INTEGER, -- n 
      publicExponent INTEGER -- e 
     } 

J'utilise une bibliothèque ASN.1 pour convertir octet [] à son format BigInteger, mais cet octet [] devrait être dans le format comme { '0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 '} en supposant qu'il est décimal.

Mais il semble que rsaPublic.modulus et rsaPublic.exponent ne sont pas dans ce format, il y a beaucoup de non-chiffres dans le byte [] du module et de l'exposant. Alors, quel est le format de rsaPublic.modulus et rsaPublic.exponent, et comment les convertir en un byte [] avec le format comme {'0', '1', '2', '3', '4', '5 ',' 6 ',' 7 ',' 8 ',' 9 '}?

Merci beaucoup

Répondre

0

Le format est spécifié dans la référence ASN.1. Le format utilisé est appelé le codage DER et pour les entiers. Un reference est disponible pour ces codages laids. Êtes-vous sûr qu'il n'y a pas un moyen plus facile d'obtenir ces valeurs comme bigints?

EDIT

Il semble que vous pouvez obtenir les octets [] tableaux en obtenant un objet RSAParameters via RSACryptoServiceProvider.ExportParameters() puis extraire de cela les Exponent et Modulus champs.

+0

J'utilise une bibliothèque asn.1. Il peut facilement gérer le format de clé publique asn.1. Mais le problème est que je ne sais pas comment convertir le module .net en byte [] en un octet raisonnable [] comme {'0', '1', '2', '3', '4', '5' , '6', '7', '8', '9'}, le module rsa en byte [] semble peu simple, est-il encodé dans un format quelconque? – travellover

+0

Il s'agit essentiellement de l'entier sous la forme d'un tableau d'octets big-endian, avec des octets d'en-tête à l'avant. De manière équivalente, il s'agit de l'entier représenté sous la forme d'un nombre de base 256. Que voulez-vous faire avec l'octet [], alors peut-être que je peux donner une meilleure idée.? –

+0

J'ai besoin d'eux pour générer la clé publique RSA PKCS # 1 asn.1 par un module et un exposant .net RSA. mon chemin est d'utiliser une librairie asn.1. il peut accepter le module et l'exposant en byte [] en base-2, en base-18, en base-10 ou en base-16, puis générer son propre grand entier, puis générer le format de clé publique PKCS # 1. donc d'abord je veux générer biginteger par module .net RSA et exposant. .net Le module RSA et l'exposant sont en octets [], mais tous les éléments de ces octets [] ne sont pas des chiffres ASCII, n'est-ce pas? J'espère que vous pouvez comprendre ce que je dis. – travellover

0

Les valeurs byte[] représentent la représentation Big Endian codée en octets des grands entiers. C'est presque, mais pas exactement, le même que le codage DER.

Pour Modulus, la structure RSAParameters attend la valeur DER mais avec le remplissage de signe optionnel 0x00 octet supprimé. Pour Exponent c'est pareil.

Si vous avez une structure clé privée alors D doit avoir la même longueur que byte[]Modulus (ce qui pourrait signifier que vous avez à préfixer 0x00 valeurs). P, Q, DP, DQ et InverseQ sont tous nécessaires si D est spécifié, et ils doivent tous avoir exactement la moitié la longueur de Modulus, ce qui peut nécessiter la suppression DER octets de bourrage ou peut nécessiter l'insertion d'un peu.

+0

Si vrai alors ma réponse est fausse et je vais le supprimer. Comment avez-vous compris cela? –

+0

@JamesKPolk Il est un peu torturé, mais https://github.com/dotnet/corefx/blob/6225e48bd3945f245a9f96fe46ee1cfc05fa57bd/src/System.Security.Cryptography.X509Certificates/tests/PublicKeyTests.cs#L129-L152. Si vous lisez le certificat approprié dans un décodeur DER/ASN.1, vous verrez que le module et l'exposant attendus sont les mêmes que les valeurs DER sans l'étiquette et la longueur (et l'octet de remplissage pour la valeur du module). Bien que je m'inquiète un peu, ma réponse implique que l'étiquette et la longueur sont censées être présentes ... – bartonjs

Questions connexes