2016-12-13 123 views
0

我在閱讀這篇文章之前和之後都沒有做過類似的工作,但我仍然不確定如何進展。使用RSA簽署文檔

我有一個使用密碼保護的RSA私鑰,作爲文本存儲在本地數據庫中,這是我的第一個問題,即如何獲得原始RSA私鑰。

第二部分,涉及簽署文件。基本上,我有我要實現以下方法簽名:

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

所以在這個方法我一定要扭轉私鑰和thena應用RSA加密。

你們可以介紹一下如何歸檔嗎?由於

+0

請。請注意,簽名和加密之間存在細微差異。另外,你能否提供一些更詳細的信息(有些代碼會很好) – nozzleman

+0

這真的是我正在談論的簽名,以及如果Delphi代碼無法理解的唯一代碼。我有一個要求,說我需要簽署一份文件,並使用上面的方法簽名來開發一個提供者。 – Marco

+0

這取決於密鑰存儲的格式,例如,如果有相關的密碼,它可能是PKCS12/PFX,所以X509Certificate2可以加載並解密它,RSACryptoServiceProvider將接受它作爲密鑰並公開一個.SignData方法。 –

回答

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(); 
    } 
}