我有一个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
可能是什么问题?
以下是我用来签名数据的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;
}
答案 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)