【问题标题】:Encrypt String with SHA256 Algorithm and sign with private key and base64 string resulted in c#使用 SHA256 算法加密字符串并使用私钥和 base64 字符串签名导致 c#
【发布时间】:2023-01-29 16:37:47
【问题描述】:

我想根据以下列表对我的应用程序进行加密: 1- 首先我想用 sha256 算法加密我的简单字符串 2秒我想用我拥有的私钥签署加密文本 3- 第三,我想将结果字节数组转换为 base64,以便在我的 api 请求中作为标头传递

下面是我的代码,它没有创建正确的签名字符串:

byte[] signedBytes, originalData;
string temp_inBase64;
using (SHA256 hash = SHA256Managed.Create())
{
Encoding enc = Encoding.UTF8;
originalData = hash.ComputeHash(enc.GetBytes(message));
}
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString("xxxxxx"); //Final
try
{
signedBytes = rsa.SignData(originalData, new SHA256CryptoServiceProvider());
temp_inBase64 = Convert.ToBase64String(signedBytes);
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
return temp_inBase64;

原始数据是我传递给函数的消息, 但是验证结果不正确,,

谁能帮我?

【问题讨论】:

  • 请问您可以对您的代码应用正常缩进吗?目前很难阅读。它还会真的如果您可以提供示例数据,包括您从哪里获得期望,请提供帮助。 (顺便说一句,如果您只是在计算后直接返回值,而不是将其保存在局部变量中,我认为代码会更清晰。我认为 temp_inBase64 没有添加任何值。)
  • 这回答了你的问题了吗? Base64 encoding of a SHA256 string

标签: c# .net rsa sha256


【解决方案1】:

我认为您误解了什么是散列 - 那部分不是加密。哈希是一种计算数据块“指纹”的方法。改变数据的任何字节(哪怕是一点点)都会完全改变“指纹”。 rsa 签名过程本身计算数据的散列值,并对散列值进行签名。这允许接收方确保两个数据都没有被篡改(他们可以计算哈希值并确保它匹配)它是由(哈希是用您的密钥加密的)。

所以而不是计算哈希你自己并将其传递给 RSA 签名函数,您需要传递您的数据签名,并确保签名功能是配置使用 SHA256。

【讨论】:

    【解决方案2】:

    签名算法的过程是正确的,但如果结果字符串不起作用 我建议您尝试使用此函数对 sha256 进行哈希处理,然后使用私钥对转换为 base 64 的字节数组进行签名,

    以下是您请求的示例代码:

     // Generate a new RSA key pair
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    
                // Get the private key
                rsa.FromXmlString("xxxxx"); //Final ;
                
    
                // The string to sign
                string originalString = message;
    
                // Sign the string
                byte[] signedData = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(originalString), CryptoConfig.MapNameToOID("SHA256"));
    
    
    
                // Verify the signature
                bool signatureVerified = rsa.VerifyData(System.Text.Encoding.UTF8.GetBytes(originalString), CryptoConfig.MapNameToOID("SHA256"), signedData);
                var temp_inBase64 = Convert.ToBase64String(signedData);
    

    正如您在代码末尾看到的那样,我返回 base 64 格式的签名数据并且不使用经过验证的签名数据,, 结果消息对我有用 但你可以测试经过验证的标志数据,,

    最良好的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2015-11-02
      • 2013-09-19
      • 2018-07-19
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多