当前位置: 首页 > 知识库问答 >
问题:

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

冉昊
2023-03-14

我有一个公钥是:

作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为一家专业人士,作为作为作为一家专业人士,作为作为作为作为一家专业人士,作为作为作为作为作为作为作为一家专业人士,作为作为作为作为作为一家专业作为作为作为一部分,作为作为作为作为作为作为作为作为作为作为作为作为作为一家专业作为作为一家中国,作为一家专业作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为作为一部分,作为作为作为作为作为作为一家,作为作为一家,作为作为一家,作为作为作为作为作为作为作为作为作为作为一部分,作为一个9389D1F43C061C9459A65B77BCD581C107AA8424223A0B44EE5282362CC96B90EEA071A0DDA5E9CB8FD5C9FD4AC86E177C07D79071788CB08231240DC1C9169AF2629ECEC31751069F0C7CCC1752303
(非Base64)

还有一个指数:

010001
(再次不是base 64)

我需要将它和一个小html" target="_blank">字符串一起转换为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);

我有最终的结果:

2)文中给出了一个ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZGRLWCDA==
(这是在非c#非开源应用程序中使用相同数据得到的)。

共有1个答案

车嘉实
2023-03-14

您拥有的公钥字符串在我看来就像字节数组的十六进制表示。因此,我测试了使用以下转换将其转换为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),因此我使用相同的方法将其转换为字节[]

最后,代码如下所示:

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==
 类似资料:
  • 我正在尝试将RsaKeyParameter公钥保存到SQL数据库中。我得到一个错误,Bouncy Castle不能将RsaKeyParameters转换为字节。 使用BouncyCastle C#。 但它不喜欢ToAsn1Object。只是为了补充这是一个例子,我知道我的变量名是不同的。 公钥应该是字节,然后是字符串,保存到数据库中。

  • 问题内容: 我正在使用Swift 3,并且需要与C API进行交互,例如,C API接受以NULL终止的字符串列表 在Swift中,API的导入方式如下 在尝试使用类型转换数百次后,我还是无法完成这项工作。即使我传递通过编译的有效指针,它也会在运行时崩溃,提示无效的内存访问(在strlen函数中)。还是关于ARC的东西? 问题答案: 您可以像如何通过使用char **参数将Swift字符串数组传递

  • 问题内容: 我有以下格式的公钥 我需要将其转换为以下格式 基本上,问题是我正在使用用Java编写的第三方库。 第三方库使用Java类“ RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例。 我提供给该第三方库的字符串取自以下格式的文件: 仔细研究一下代码之后,我可以看到,如果我使用java类“ X509EncodedKeySpec”来加载此公共密钥,则代码的签名验证部

  • 问题内容: 如何在JavaScript中执行以下操作? 将“ 1”,“ 2”,“ 3”连接为“ 123” 将“ 123”转换为123 加123 + 100 = 223 将223转换为“ 223” 问题答案: 您想熟悉和。 在您的工具箱中有用的是查看变量以找出它是什么类型的:

  • 如何使用作为字符串提供的公共和私有RSA密钥进行加密和解密。因为我正在使用RSACryptoServiceProvider,它需要XML格式,所以是否有可能使用提供的字符串。谢谢。

  • 我有一个生成AES密钥的应用程序(使用security.cryptography)。我接受AES键,将其转换为字符串,并将其放入cookie中,如下所示: keyToSend如下所示:“K UI&*()”。