Openssl验证失败

时间:2017-07-17 05:44:36

标签: c# openssl bouncycastle signature

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

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

但是当我使用openssl验证签名文件(使用c#代码生成)时,它会在dgst"中显示" Verification Failure错误。错误。而使用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;
    }

1 个答案:

答案 0 :(得分:0)

[评论中的解决方案]

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

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

您在保存二进制数据到此处存档时遇到问题

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

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

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