簡體   English   中英

RSA加密:將代碼從js移動到C#

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

我正在研究一個登錄teamcity的useragent,我正在嘗試將密碼加密從js移到c#。

這是javascript

名為rsa.js和encrypt.js的部分很重要。 他們用函數調用

rsa.setPublic(publicKey,"10001");

根據我的判斷,指數看起來像十六進制數x10001,這是65537 base10

這是teamcity的演示網站

請注意,以下帳戶不屬於teamcity的演示網站

此測試驗證加密文本是否等於使用公鑰加密的明文。

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

到目前為止,實現看起來像

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

但這抱怨

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

謝謝你的任何幫助都會讓這個聖誕快樂

編輯:看起來我的測試存在缺陷,因為每個播種時間會生成不同的encryptedPassword

答:我打開訪客訪問權限,繞過了這個問題,但我還是想解決它

您RSAKeyValue XML格式錯誤,格式正確http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue

你的函數應該看起來像(假設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);
}

在你的情況下,你的指數是10001。

因為在你的情況下,你看起來沒有八位字符串

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

我希望有幫助,我還沒有測試過。 我今天回家的時候會的。

由於加密使用PKCS#1隨機填充,因此生成的“encryptedPassword” 必須始終不同。 這里的關鍵字是“隨機填充”;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM