【问题标题】:Sign document using RSA使用 RSA 签署文档
【发布时间】:2016-12-13 11:27:57
【问题描述】:

在阅读此内容之前和之后我没有做过类似的事情,但我仍然不确定如何取得进展。

我有一个使用密码保护的 RSA 私钥,以文本形式存储在本地数据库中,这是我的第一个问题,如何获取原始 RSA 私钥。

第二部分,与签署文件有关。基本上我有以下我必须实现的方法签名:

string GenerateDocumentSignature(string privateKey, string password, string documentId)

因此,在这种方法中,我必须反转私钥,然后应用 RSA 加密。

你们能解释一下如何存档吗?谢谢

【问题讨论】:

  • 请。请注意,签名和加密之间存在细微差别。另外,您能否提供更多详细信息(一些代码会很棒)
  • 这真的是我正在谈论的签名,并且我拥有的唯一代码是我无论如何都无法理解的 Delphi 代码。我有一个要求说我需要签署一份文件并使用上面的方法签名开发一个提供者。
  • 这取决于密钥的存储格式,例如如果有关联的密码,它可能是 PKCS12/PFX,因此 X509Certificate2 可以加载并解密它,RSACryptoServiceProvider 将接受它作为密钥并公开一个 .SignData 方法。
  • @AlexK。我与维护 Delphi 代码的人交谈过,但他不确定,实际上实现此功能的人几年前就离开了……不确定这是否有意义,但在获得私钥后使用“签名”文档SHA1。这是应该如何使用哈希对文档进行签名的方式吗?
  • @AlexK。我需要任何证书吗?我只有 RSA 私钥和密码。

标签: c# encryption rsa sha1 private-key


【解决方案1】:

我能够使用 BouncyCastle 让它工作:

public class SignDocsProvider : ISignDocsProvider
{
    public string GenerateSignature(string privateKey, string password, string documentId)
    {
        var keyPair = ReadPrivateKey(privateKey, password);
        var sha1Digest = new Sha1Digest();
        var rsaDigestSigner = new RsaDigestSigner(sha1Digest);

        rsaDigestSigner.Init(true, keyPair);

        var documentIdToSign = Encoding.ASCII.GetBytes(documentId);

        rsaDigestSigner.BlockUpdate(documentIdToSign, 0, documentIdToSign.Length);

        return Convert.ToBase64String(rsaDigestSigner.GenerateSignature());
    }

    private static AsymmetricKeyParameter ReadPrivateKey(string privateKey, string password)
    {
        AsymmetricCipherKeyPair keyPair;

        using (var reader = new StringReader(privateKey))
            keyPair = (AsymmetricCipherKeyPair)new PemReader(reader, new PasswordFinder(password)).ReadObject();

        return keyPair.Private;
    }
}

internal class PasswordFinder : IPasswordFinder
{
    private readonly string _password;


    public PasswordFinder(string password)
    {
        _password = password;
    }


    public char[] GetPassword()
    {
        return _password.ToCharArray();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2014-12-17
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2014-06-17
    相关资源
    最近更新 更多