使用 C# 签署数据

Signing Data Using C#

我有一个文件,我正在使用两种方法使用 RSA 算法对其进行签名:

  1. 充气城堡
  2. openssl

两者都会产生两个不同的输出,而 openssl 会产生有效文件。我不知道为什么我的 C# 代码输出错误。

这是我用 c# 编写的充气城堡代码

    private void GenerateSignatureFile(string sourceFile)
    {
        try
        {
            var stringToSign = ReadText(sourceFile).ToString();                
            var sig = Sign(stringToSign);                
            var fileContent = Encoding.UTF8.GetString(sig);
            using (var sw = File.CreateText(Path.Combine(_projectLocation, _sigFileName)))
            {
                sw.WriteLine(fileContent);
            }

        }
        catch (Exception ex)
        {
            LoggingService.Log(ex.Message);
        }
    }


    public byte[] Sign(String data)
    {
        var key = readPrivateKey();
        /* Make the key */
        var keyParameter = new RsaKeyParameters(key.IsPrivate, ((RsaPrivateCrtKeyParameters)key).Modulus, ((RsaPrivateCrtKeyParameters)key).Exponent);

        /* Init alg */
        ISigner sig = SignerUtilities.GetSigner("SHA256withRSA");

        /* Populate key */
        sig.Init(true, key);

        /* Get the bytes to be signed from the string */
        var bytes = Encoding.UTF8.GetBytes(data);

        /* Calc the signature */
        sig.BlockUpdate(bytes, 0, bytes.Length);
        return sig.GenerateSignature();
    }

    public static IEnumerable<string> ReadText(string scriptPath)
    {
        var buffer = new StringBuilder();
        foreach (var line in File.ReadLines(scriptPath))
        {
            if (line == "GO")
            {
                yield return buffer.ToString();
                buffer.Clear();
            }
            else
            {
                buffer.AppendLine(line);
            }
        }
    }

  private AsymmetricKeyParameter readPrivateKey()
    {
        AsymmetricCipherKeyPair keyPair;

        using (var reader = new StringReader(_privateKey))
            keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();

        return keyPair.Private;
    }

在 openssl 中,我使用以下命令对数据进行签名

openssl dgst -sha256 -sign content_private_key.pem -out content.zip.sig content.zip

我不知道为什么我的 C# 代码会导致不同的输出。

我不认为 ReadText 总是 return 与 openssl 处理的二进制文本相同的文本。可以肯定的是,只需在执行以下行后将 bytes 变量写入文件:

var bytes = Encoding.UTF8.GetBytes(data);

例如,您可以使用 sha256sum.

比较两个文件

如果这确实是罪魁祸首,那么只需将文件读入二进制文件并签名即可。