openssl验证失败

Openssl verification fails

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

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

但是当我使用 openssl 验证签名文件(使用 c# 代码生成)时,它显示 "Verification Failure error in 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;
    }

[评论中的解决方案]

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

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

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

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

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

换成

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