我使用两种方法使用RSA算法签署文件:
两者都会导致两个不同的输出和openssl结果生成有效文件。我不知道为什么我的c#代码输出错误。
这是我在c#
中的充气城堡代码 private void GenerateSignatureFile(string sourceFile)
{
try
{
var stringToSign = ReadText(sourceFile).ToString();
var sig = Sign(stringToSign);
var fileContent = Encoding.UTF8.GetString(sig);
using (var sw = File.CreateText(Path.Combine(_projectLocation, _sigFileName)))
{
sw.WriteLine(fileContent);
}
}
catch (Exception ex)
{
LoggingService.Log(ex.Message);
}
}
public byte[] Sign(String data)
{
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);
/* Get the bytes to be signed from the string */
var bytes = Encoding.UTF8.GetBytes(data);
/* Calc the signature */
sig.BlockUpdate(bytes, 0, bytes.Length);
return sig.GenerateSignature();
}
public static IEnumerable<string> ReadText(string scriptPath)
{
var buffer = new StringBuilder();
foreach (var line in File.ReadLines(scriptPath))
{
if (line == "GO")
{
yield return buffer.ToString();
buffer.Clear();
}
else
{
buffer.AppendLine(line);
}
}
}
private AsymmetricKeyParameter readPrivateKey()
{
AsymmetricCipherKeyPair keyPair;
using (var reader = new StringReader(_privateKey))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
return keyPair.Private;
}
在openssl中我使用以下命令对数据进行签名
openssl dgst -sha256 -sign content_private_key.pem -out content.zip.sig content.zip
我不知道为什么我的c#代码导致不同的输出。
答案 0 :(得分:0)
我不认为ReadText
将始终返回与openssl
处理的二进制文本相同的文本。可以肯定的是,在执行以下行之后,只需将bytes
变量写入文件:
var bytes = Encoding.UTF8.GetBytes(data);
例如,您可以使用sha256sum
来比较这两个文件。
如果这确实是罪魁祸首,那么只需将文件读入二进制文件并签名即可。