2008-12-02 5 views
3

Je travaille sur un useragent qui se connecte à teamcity et j'essaye de déplacer le cryptage du mot de passe de js à C#.RSA Encryption: déplacement du code de js vers C#

this is the javascript

la section appelée rsa.js et encrypt.js sont importants. Ils font un appel de fonction avec

rsa.setPublic(publicKey,"10001"); 

L'exposant ressemble à son un nombre hexadécimal x10001 qui est 65537 Base10 pour autant que je peux dire

here is teamcity's demo site

Notez le compte ne fait pas partie ci-dessous Le 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 la mise en œuvre 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 se plaint avec

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

Merci d'aide en fera un Noël

très joyeux Edit: regards comme mon test est erroné depuis un différent encryptedPassword est généré wi th chaque fois tête de série

Réponse: Je me suis tourné sur l'accès invité, qui contourne ce problème, mais je voudrais encore résoudre

Répondre

3

Vous RSAKeyValue XML est malformé, 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 exposant 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'avez pas des 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, je ne l'ai pas encore testé. Je le ferai quand je rentre à la maison aujourd'hui.

+0

ok cela compile, une fois que le résultat est converti en hexadécimal, il ne correspond pas aux exposants que j'utilisais. Ils utilisent x10001 qui est 65537 base10 mais cela ne donne pas le résultat attendu. le texte codé est à peu près la même longueur que le prévu –

3

Étant donné que le chiffrement utilise le remplissage aléatoire PKCS # 1, le mot de passe "encryptedPassword" doit toujours être. Le mot-clé ici est "padding aléatoire" ;-)

Questions connexes