C#-使用公钥(mod)和指数RSA PKCS#1.5转换字符串

C#-使用公钥(mod)和指数RSA PKCS#1.5转换字符串,c#,cryptography,rsa,C#,Cryptography,Rsa,我有一个公钥,它是: A383A2916281721498FF2826F851613BAB6F89EB0536E9F237E158596D3B012E5707EBA9F2A2963FACAF3FCB10F5DE79CAF246C1F587EE6E8F895FD848F2DA5ABA9D71AF4D8D06E99FF3729631626ED3F3202E5662957C0110A99D2B3893FEB148291E09B544FE7DF121751F8B55895B557B5542B548B54

我有一个公钥,它是:

A383A2916281721498FF2826F851613BAB6F89EB0536E9F237E158596D3B012E5707EBA9F2A2963FACAF3FCB10F5DE79CAF246C1F587EE6E8F895FD848F2DA5ABA9D71AF4D8D06E99FF3729631626ED3F3202E5662957C0110A99D2B3893FEB148291E09B544FE7DF121751F8B55895B557B5542B548B548B548B548B548B548B567B548B548B5F597B548B548F597B568B957F597B568F597B568B95957B9F597B568B957B957B957B568B568B568B568B568B9B9B9B9276A9389D1F43C061C9459A65B77BCD581C107AA8424223A0B44EE52582362CC96B90EEA071A0DDA5E9CB8FD5C9FD4AC86E177C07D79071788CB08231240DC1C9169AF2629ECECEC31751069F0C7CCC1752303
(不是Base64)

一个指数是:

010001
(同样不是base64)

我需要将其与一个小字符串一起转换为RSA PKCS#1.5 但是我有点困惑,当我尝试这样做的时候,它总是给我错误 显然指数格式错误,公钥不是base64

这是我的密码

string publicKey = "a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303";
string exponant = "010001";
string toEncrypt = "Test123";
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
    RSAParameters rsap = new RSAParameters {
        Modulus = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(publicKey))),
        Exponent = Encoding.UTF8.GetBytes(Convert.ToBase64String(Encoding.UTF8.GetBytes(exponant)))
    };
    //Tried with and without the whole base64 thing
    rsa.ImportParameters(rsap);
    byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(toEncrypt), false);
    string base64Encrypted = Convert.ToBase64String(encryptedData);
    x = x.Replace(match, text.Contains("(URLENCODE)") ? WebUtility.UrlEncode(base64Encrypted) : base64Encrypted);
}
加密异常:错误数据。
发生于:rsa.进口参数(rsap)

我有最终的结果:

6)VVV6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(V6)V6(6)V6(6)Z6(6)Z6(6)ZZ6(6)Z6(6)Z6(6)Z6(6(6)ZZ6)Z6(6)Z6(6)Z6(6)Z6)Z6(6)Z6)ZZ6(6)Z6)Z6(6)Z6(6(6)Z6)Z6)Z6)Z6)Z6)Z6(8)Z6(8(8(8(8(8)Z6)Z6)Z6)Z6)Z6)Z6)Z6)Z6)Z6(6)Z6(VSTUMFDEGBNGRLWCDA==
(这是通过在非c#非开源应用程序中使用相同的数据得到的)


在我看来,您拥有的公钥字符串类似于字节数组的十六进制表示形式。因此,我测试了使用以下转换将其转换为
字节[]

public static byte[] HexStringToByteArray(string hexString)
{
    MemoryStream stream = new MemoryStream(hexString.Length / 2);

    for (int i = 0; i < hexString.Length; i += 2)
    {
        stream.WriteByte(byte.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier));
    }
    return stream.ToArray();
}
RSA参数导入成功,加密也成功

输出如下所示。它不必与您的(通过使用非C#,非开源应用程序生成的,通过这种方式我感觉到某种责备)相同,因为还有其他因素,如填充,会影响结果,但加密是成功的

VXg8wRZz7SDnhg3T1GPs8CztjPsGwES+ngJAaBBVMSNkBiBOU+ju70pI5sAjvFS34+ztY8VLUZZ4vzf9
NkBNCgEn7Q2NezOwgP029yHY169Jc7Kqkwy0UbJLAwCwmqR+/G6B/S2hL2ADV+5EeaEn4ZmmKl/WRp+P
ruwWKDQx46/ih0itvh7uF5/OfKCqeIrcsqpZgQ4pByNQNOTs1sFlKB+/8TZ6Ey00lYU8c3bRLOef0Nh+
uivY0LI2ryOYI//EtmoZqfkeJH2ZqOQPy/I4R/OXHs1RcEZpnam8/OF1c/DlGVp3//RO8owmStxSj/eF
TD5arc3a1kiNma+/DDQYuQ==

请编辑您的问题并添加您面临的错误。我猜您面临的错误与
testData
size有关,对吗?用一个较小的纯文本字符串测试加密。@Dalton编辑过,我稍微更新了代码,代码不小心试图加密公钥(我这边没有发生,只是在提问时编辑错误)。testData字符串的长度大约为7个字符。我可能需要将其“填充”到1.5标准并手动转换为ASE64()?如果我将模数转换为字节数组,然后从该字节数组转换为base64字符串,则会出现错误:FormatException:Base-64字符数组或字符串的长度无效。
VXg8wRZz7SDnhg3T1GPs8CztjPsGwES+ngJAaBBVMSNkBiBOU+ju70pI5sAjvFS34+ztY8VLUZZ4vzf9
NkBNCgEn7Q2NezOwgP029yHY169Jc7Kqkwy0UbJLAwCwmqR+/G6B/S2hL2ADV+5EeaEn4ZmmKl/WRp+P
ruwWKDQx46/ih0itvh7uF5/OfKCqeIrcsqpZgQ4pByNQNOTs1sFlKB+/8TZ6Ey00lYU8c3bRLOef0Nh+
uivY0LI2ryOYI//EtmoZqfkeJH2ZqOQPy/I4R/OXHs1RcEZpnam8/OF1c/DlGVp3//RO8owmStxSj/eF
TD5arc3a1kiNma+/DDQYuQ==