【问题标题】:Openssl verification failsOpenssl 验证失败
【发布时间】:2017-07-17 05:44:35
【问题描述】:

我有一个 zip 文件,我正在使用带有 Bouncy castle 的 c# 代码对其进行签名。生成的签名文件与使用以下命令使用 openssl 生成的签名文件相同(我已经比较了输出字符串和二进制代码)

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

但是当我使用 openssl 验证签名文件(使用 c# 代码生成)时,它显示“dgst 中的验证失败错误”错误。而使用 openssl 生成的签名文件验证成功。

我用于验证的命令是

openssl dgst -sha256 -verify content_public_key.pem -signature content.zip.sig content.zip 

openssl output

可能是什么问题?

这是我用来签署数据的 C# 代码

    /// <summary>
    /// Method to generate signature file
    /// </summary>
    private void GenerateSignatureFile(string sourceFile)
    {
        try
        {
            var bytesToSign = File.ReadAllBytes(sourceFile);
            var sig = Sign(bytesToSign);

            var fileContent = Encoding.GetEncoding(1252).GetString(sig);

            using (var sw = File.CreateText(Path.Combine(_projectLocation, _sigFileName)))
            {
                sw.Write(fileContent);
            }

        }
        catch (Exception ex)
        {
            LoggingService.Log(ex.Message);
            var errorWhileCreatingSignatureFile = Resource.ResourceManager.GetString("ErrorWhileCreatingSignatureFile");
            throw new Exception(errorWhileCreatingSignatureFile, ex);
        }
    }


    public byte[] Sign(byte[] bytes)
    {
        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);

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

    }


    private AsymmetricKeyParameter ReadPrivateKey()
    {
        AsymmetricCipherKeyPair keyPair;

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

        return keyPair.Private;
    }

【问题讨论】:

  • 生成的签名文件与使用 openssl 生成的签名文件相同 如果文件相同,则两种情况下都可以进行验证
  • 这就是重点。但不工作@pedrofb
  • 由于 digital.signature 验证是确定性的,这意味着文件不相等。寻找差异。并显示您的代码,以便人们对其进行分析
  • 好的@pedrofb 我已经添加了 c# 代码。
  • 我不是 c# 专家,但似乎 File.CreateText 创建了一个文本文件并且签名是二进制的。可能是添加了一些额外的字符

标签: c# openssl bouncycastle signature


【解决方案1】:

[cmets 中的解决方案]

如果文件相同,则验证将在两种情况下都有效,因为数字签名验证是确定性的。这意味着文件不相等。

byte[] 类型的签名结果是二进制而不是文本。以任何语言应用文本编码的任何尝试都会产生意想不到的结果,因为它包含不可表示的字符

在此处将二进制数据保存到文件时遇到问题

  var fileContent = Encoding.GetEncoding(1252).GetString(sig);

  using (var sw = File.CreateText(Path.Combine(_projectLocation, _sigFileName)))

改变它

 File.WriteAllBytes(string path, byte[] bytes)

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 2015-10-19
    • 2012-05-26
    • 1970-01-01
    • 2016-07-23
    • 2023-03-31
    • 2011-08-29
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多