简体   繁体   English

RSA加密:将代码从js移动到C#

[英]RSA Encryption : moving code from js to C#

I'm working on an useragent that logs into teamcity and I'm trying to move the password encryption from js to c#. 我正在研究一个登录teamcity的useragent,我正在尝试将密码加密从js移到c#。

this is the javascript 这是javascript

the section called rsa.js and encrypt.js are important. 名为rsa.js和encrypt.js的部分很重要。 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 根据我的判断,指数看起来像十六进制数x10001,这是65537 base10

here is teamcity's demo site 这是teamcity的演示网站

Note the account below does not belong to teamcity's demo site 请注意,以下帐户不属于teamcity的演示网站

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 编辑:看起来我的测试存在缺陷,因为每个播种时间会生成不同的encryptedPassword

Answer: I turned on guest access, that bypasses this problem, but I'd still like to solve it 答:我打开访客访问权限,绕过了这个问题,但我还是想解决它

You RSAKeyValue XML is malformed, the correct format is here http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue 您RSAKeyValue XML格式错误,格式正确http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue

your function should probably look like (assuming that public_key and exponent are octet strings...) 你的函数应该看起来像(假设public_key和exponent是八位字符串...)

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);
}

In your case your exponent is 10001. 在你的情况下,你的指数是10001。

since in your case it looks like you do not have octet strings 因为在你的情况下,你看起来没有八位字符串

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);
}

I hope that helps, I haven't tested it yet. 我希望有帮助,我还没有测试过。 i will when i get home today. 我今天回家的时候会的。

Since the encryption uses PKCS#1 random padding, the resulting "encryptedPassword" must always be different. 由于加密使用PKCS#1随机填充,因此生成的“encryptedPassword” 必须始终不同。 The keyword here is "random padding" ;-) 这里的关键字是“随机填充”;-)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM