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

标签 c# cryptography rsa

我有一个公钥:

a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303
(Not Base64)

还有一个指数:

010001
(Again not 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);
}

CryptographicException:错误数据。
发生于:rsa.ImportParameters(rsap);

我确实有最终的结果:

PV7v6F8AOJvIJA6yYJReUf3jRD8HL5LzNIIqs4ehKlwxt00xyvnCCy/MiSX/4ZP6+IZfXPGAs57kM2/KsUau+fgU4p0rxJM569MLZ+RFjBnI/ATE1Ru5v8D2ZcJ89Y0Z3xowVnNMaytwacRf/LZqxIAFpBr/E5G6KSHkSg+3zQIu6RrxbHPrWeiYYUWB5XfYDKlPcezW3QYi9lktGCp2Eqsg+ULX1GD6qIlHySslYlT3kqVZbQb1B5ak416Rq1RMLhUgpsBazuB50jr5I1zfrFdi4UeNlkBWxFcJaGOY8HScCKwvlGU7TqGbjucB1rA3mQhGvSTUmfDeGBnGrLwCdA==
(Got this from using the same data in a non c# non open-source application).

最佳答案

对我来说,您拥有的公钥字符串看起来像是字节数组的十六进制表示形式。因此,我测试使用以下转换将其转换为 byte[]:

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

此外,指数可能具有相同的格式(3 个字节,0x01 0x00 0x01),因此我使用相同的方法将其转换为 byte[]

最后,代码如下:

string publicKey = "a383a2916281721498ff28226f851613bab6f89eb0536e9f237e158596d3b012e5707eba9f2a2963faca63fcb10f5de79caf246c1f587ee6e8f895fd848f2da5aba9d71af4dd8d06e99ff3729631626ed3f3202e56962957c0110a99d2b3893feb148291e09b54fe7df121751fb8bb589576542321b4f548be06b9845ebc6bbef1427741c00b632c05854146b597fdef5a89ace1556a769c5eaff8fc0589e7ad4adb2e2a929969c77f395b2f5a276a9389d1f43c061c9459a65b77bcd581c107aa8424223a0b44ee52582362cc96b90eea071a0dda5e9cb8fd5c9fd4ac86e177c07d79071788cb08231240dc1c9169af2629ecec31751069f0c7ccc1c1752303";
            string exponant = "010001";
            string toEncrypt = "Test123";
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                RSAParameters rsap = new RSAParameters
                {
                    Modulus = HexStringToByteArray(publicKey),
                    Exponent = HexStringToByteArray(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);

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==

关于C# - 使用公钥 (mod) 和指数 RSA PKCS#1.5 转换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46895398/

相关文章:

java - 无法在 Android 上生成 RSA 私钥

c# - 使用 OpenSSL 兼容格式在 C# 中加密,在 Poco 中解密

cryptography - 通过套接字发送公钥的安全方法

c# - 如何分配在 xaml 中充当占位符的基类的属性?

c# - 以编程方式创建的文件并不总是继承父文件夹的权限

c# - 方法参数的动态长度

c# - 当文件名为 unicode 字符时无法打开文件

java - 使用对称 key (AES -128) 签署和验证消息

c# - RSA C# 中的 key 大小没有改变!

Node.js:尝试解密加密的对称 key 时出现无效的 RSAES-OAEP 填充