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)
我有一个 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)