使用C#签名数据

时间:2017-07-01 15:28:12

标签: c# rsa digital-signature sha256

我使用两种方法使用RSA算法签署文件:

  1. bouncycastle
  2. openssl
  3. 两者都会导致两个不同的输出和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#代码导致不同的输出。

1 个答案:

答案 0 :(得分:0)

我不认为ReadText将始终返回与openssl处理的二进制文本相同的文本。可以肯定的是,在执行以下行之后,只需将bytes变量写入文件:

var bytes = Encoding.UTF8.GetBytes(data);

例如,您可以使用sha256sum来比较这两个文件。

如果这确实是罪魁祸首,那么只需将文件读入二进制文件并签名即可。