【问题标题】:Signing Data Using C#使用 C# 对数据进行签名
【发布时间】:2017-12-05 08:46:42
【问题描述】:

我有文件,我使用 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# 代码会导致不同的输出。

【问题讨论】:

    标签: c# rsa digital-signature sha256


    【解决方案1】:

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

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

    例如,您可以使用 sha256sum 比较两个文件。

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

    【讨论】:

    • 谢谢@Maarten。是的,你是对的 ReadText() 是罪魁祸首。但现在我在将大文件转换为字节数组时面临另一个问题(抛出 outOfMemoryException)。我已经使用了stackoverflow.com/questions/17618925/…,但它没有用。你知道我如何在充气城堡中实现它吗?
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多