【发布时间】: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
可能是什么问题?
这是我用来签署数据的 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