3 votes

RSA Encryption : déplacement du code de js à C#

Je travaille sur un useragent qui se connecte à teamcity et j'essaie de déplacer le cryptage du mot de passe de js à c#.

Voici le javascript

les sections appelées rsa.js et encrypt.js sont importantes. Ils font un appel de fonction avec

rsa.setPublic(publicKey,"10001");

L'exposant semble être un nombre hexagonal x10001, ce qui correspond à 65537 en base 10, d'après ce que je sais.

voici le site de démonstration de teamcity

Notez que le compte ci-dessous n'appartient pas au site de démonstration de Teamcity.

Ce test valide si le texte crypté est égal au texte en clair crypté avec la clé publique.

[Test]
public void should_be_able_to_encode_a_string() {
    string public_key = "00b46e5cd2f8671ebf2705fd9553137da082b2dd3dbfa06f254cdfeb260fb21bc2c37a882de2924d7dd4c61eb81368216dfea7df718488b000afe7120f3bbbe5b276ac7f2dd52bd28445a9be065bd19dab1f177e0acc035be4c6ccd623c1de7724356f9d6e0b703d01583ebc4467d8454a97928b5c6d0ba3f09f2f8131cc7095d9";
    string expected = "1ae1d5b745776f72172b5753665f5df65fc4baec5dd4ea17d43e11d07f10425b3e3164b0c2ba611c72559dc2b00149f4ff5a9649b1d050ca6a5e2ec5d96b787212874ab5790922528a9d7523ab4fe3a002e8f3b66cab6e935ad900805cf1a98dc6fcb5293c7f808917fd9015ba3fea1d59e533f2bdd10471732cccd87eda71b1";
    string data = "scott.cowan";
    string actual = new EncryptionHelper().Encrypt(public_key, data);
    Assert.AreEqual(expected,actual);
}

jusqu'à présent, l'implémentation ressemble à

public string Encrypt(string public_key, string data)
{
    rsa = new RSACryptoServiceProvider(); 
    rsa.FromXmlString(String.Format("<RSAKeyValue>{0}</RSAKeyValue>",public_key));
    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data);
    byte[] cipherbytes = rsa.Encrypt(plainbytes,false);
    return Convert.ToBase64String(cipherbytes);
}

mais ce dernier se plaint avec

System.Security.Cryptography.CryptographicException
Message: Input string does not contain a valid encoding of the 'RSA' 'Modulus' parameter.

Merci de votre aide, cela fera de ce Noël un très joyeux Noël.

Edit : il semble que mon test soit faussé puisqu'un encryptedPassword différent est généré à chaque temps d'amorçage.

Réponse : J'ai activé l'accès invité, ce qui contourne le problème, mais j'aimerais quand même le résoudre.

3voto

Jake Points 1900

Votre RSAKeyValue XML est mal formé, le format correct est ici http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue

votre fonction devrait probablement ressembler à (en supposant que public_key et exponent sont des chaînes d'octets...)

public string Encrypt(string public_key,string exponent, string data)
{
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
    rsa.FromXmlString(String.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",public_key,exponent));
    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data);
    byte[] cipherbytes = rsa.Encrypt(plainbytes,false);
    return Convert.ToBase64String(cipherbytes);
}

Dans votre cas, votre exposant est 10001.

puisque dans votre cas il semble que vous n'ayez pas de chaînes d'octets

public string Encrypt(string public_keyHex,uint exp,string data)
{
    byte[] bytes = new byte[public_keyHex.Length / 2];
    for (int i = 0; i < public_keyHex.Length-1; i+=2)
    {
        bytes[i / 2] = byte.Parse(public_keyHex.Substring(i, 2),System.Globalization.NumberStyles.HexNumber);
    }
    string public_key=Convert.ToBase64String(bytes);
    return Encrypt(public_key,Convert.ToBase64String(BitConverter.GetBytes(exp)),data);
}

J'espère que cela vous aidera, je ne l'ai pas encore testé. Je le ferai en rentrant chez moi aujourd'hui.

3voto

WKleinschmit Points 11

Étant donné que le cryptage utilise le remplissage aléatoire PKCS#1, le "encryptedPassword" résultant doit sera toujours différent. Le mot clé ici est "rembourrage aléatoire" ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X