I'm working on an useragent that logs into teamcity and I'm trying to move the password encryption from js to c#.
the section called rsa.js and encrypt.js are important. They make a function call with
rsa.setPublic(publicKey,"10001");
The exponent looks like its a hex number x10001 which is 65537 base10 as far as I can tell
Note the account below does not belong to teamcity's demo site
This test validates if the encrypted text is equal to the clear text being encrypted with the public key.
[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);
}
so far the implementation looks like
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);
}
but this complains with
System.Security.Cryptography.CryptographicException
Message: Input string does not contain a valid encoding of the 'RSA' 'Modulus' parameter.
Thank you any help will make this a very merry christmas
Edit: looks like my test is flawed since a different encryptedPassword is generated with each seeded time
Answer: I turned on guest access, that bypasses this problem, but I'd still like to solve it