2016-12-13 12 views
0

Я не делал ничего подобного до и после прочтения об этом, я все еще не уверен, как продвигаться.Подписать документ с использованием RSA

У меня есть закрытый ключ RSA, который защищен паролем, который хранится как текст в локальной базе данных, и это моя первая проблема, как получить оригинальный ключ RSA.

Вторая часть относится к подписанию документа. В принципе у меня есть метод следующей подпись, которая у меня есть, чтобы реализовать:

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

Итак, в этом методе, которые я придусь полностью изменить секретный ключ и Тен применить шифрование 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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^