2012-01-12 39 views
13

Có ai biết về một hướng dẫn đơn giản hay mã mẫu về cách ký dữ liệu trong C# bằng cách sử dụng lâu đài bouncy. Trong Java có rất nhiều hướng dẫn và mẫu. Tôi không thể tìm thấy một ví dụ duy nhất trong C#. Có ai biết cách để làm điều này không?C# Ký dữ liệu với RSA bằng BouncyCastle

+0

Có lý do nào bạn muốn sử dụng bouncycastle cho điều này không? .NET có các lớp mã hóa RSA riêng. – blowdart

+0

Tôi cho rằng đó là một câu hỏi công bằng. Tôi đã sử dụng BouncyCastle trong Java trong quá khứ và biết nó làm việc với không có vấn đề tương thích khôn ngoan với backend tôi cần phải giao tiếp với. Nó có thể là phiên bản .Net cũng như vậy, nhưng nó có vẻ ít linh hoạt hơn và có ít lựa chọn hơn với paddings vv. –

+0

Điều đó có ý nghĩa - đặc biệt nếu bạn lo lắng về interop :) – blowdart

Trả lời

28

OK Tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện việc này. Nhưng tôi đã tìm ra nó. Tôi dán mã đầy đủ ở đây để hy vọng nó có thể giúp ai đó trong tương lai.

Lớp này sẽ tính toán chữ ký RSA với hàm băm sha1 cho chuỗi được cung cấp và xác minh nó.

using System; 
using System.IO; 
using System.Text; 
using Org.BouncyCastle.Asn1; 
using Org.BouncyCastle.Crypto; 
using Org.BouncyCastle.Crypto.Parameters; 
using Org.BouncyCastle.OpenSsl; 
using Org.BouncyCastle.Security; 
using Org.BouncyCastle.Utilities.Encoders; 

namespace API.Crypto 
{ 
    public class RsaSha1Signing 
    { 
     private RsaKeyParameters MakeKey(String modulusHexString, String exponentHexString, bool isPrivateKey) 
     { 
      var modulus = new Org.BouncyCastle.Math.BigInteger(modulusHexString, 16); 
      var exponent = new Org.BouncyCastle.Math.BigInteger(exponentHexString, 16); 

      return new RsaKeyParameters(isPrivateKey, modulus, exponent); 
     } 

     public String Sign(String data, String privateModulusHexString, String privateExponentHexString) 
     { 
      /* Make the key */ 
      RsaKeyParameters key = MakeKey(privateModulusHexString, privateExponentHexString, true); 

      /* Init alg */ 
      ISigner sig = SignerUtilities.GetSigner("SHA1withRSA"); 

      /* 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); 
      byte[] signature = sig.GenerateSignature(); 

      /* Base 64 encode the sig so its 8-bit clean */ 
      var signedString = Convert.ToBase64String(signature); 

      return signedString; 
     } 

     public bool Verify(String data, String expectedSignature, String publicModulusHexString, String publicExponentHexString) 
     { 
      /* Make the key */ 
      RsaKeyParameters key = MakeKey(publicModulusHexString, publicExponentHexString, false); 

      /* Init alg */ 
      ISigner signer = SignerUtilities.GetSigner("SHA1withRSA"); 

      /* Populate key */ 
      signer.Init(false, key); 

      /* Get the signature into bytes */ 
      var expectedSig = Convert.FromBase64String(expectedSignature); 

      /* Get the bytes to be signed from the string */ 
      var msgBytes = Encoding.UTF8.GetBytes(data); 

      /* Calculate the signature and see if it matches */ 
      signer.BlockUpdate(msgBytes, 0, msgBytes.Length); 
      return signer.VerifySignature(expectedSig); 
     } 
    } 
} 
+0

Nó đã giúp tôi rất nhiều, cảm ơn bạn rất nhiều – Recurrsion

+0

Bạn có thể nhận xét về http://stackoverflow.com/questions/18344670/rsa-and-publickey-interop-with-dotnet – gpa

+0

Vâng, cuối cùng. Ai đó đã đăng một hướng dẫn rõ ràng. Cảm ơn rất nhiều! –

0

Bạn đã thử dùng Signtool chưa. Công cụ này sẽ nằm trong thư mục Microsoft framework.

+2

Signtool là để ký thực thi, nó không dành cho dữ liệu. – blowdart

0

.NET không hiển thị các thuật toán mã hóa để chọn. Và có rất nhiều hướng dẫn cho RSA.

For example.

+0

".NET không hiển thị các thuật toán mã hóa để chọn". Điều đó nghĩa là gì? Liên kết này không phải là ký kết RSA, mã hóa của nó. –

+0

Điều đó có nghĩa là bạn không thể chỉ định thuật toán sẽ được sử dụng để mã hóa. Tôi không nói liên kết là để ký. Đó là để làm việc với RSA. SignData chỉ là một phương thức khác trên RSACryptoServiceProvider. –

4

Nhìn vào trang web Bouncy Castle. Có kho lưu trữ với các nguồn và ví dụ. http://www.bouncycastle.org/csharp/download/bccrypto-net-1.7-src-ext.zip

Ví dụ: có nhiều thử nghiệm NUnit. Dưới đây là mã của phương pháp mã hóa mảng byte dữ liệu bằng thuật toán RSA như một mẫu, nhưng trong các nguồn Bouncy Castle và kiểm tra bạn có thể tìm thấy nhiều mẫu hơn.

public static byte[] Encrypt(byte[] data, AsymmetricKeyParameter key) 
    { 
     RsaEngine e = new RsaEngine(); 
     e.Init(true, key); 
     int blockSize = e.GetInputBlockSize(); 
     List<byte> output = new List<byte>(); 

     for (int chunkPosition = 0; chunkPosition < data.Length; chunkPosition += blockSize) 
     { 
      int chunkSize = Math.Min(blockSize, data.Length - (chunkPosition * blockSize)); 
      output.AddRange(e.ProcessBlock(data, chunkPosition, chunkSize)); 
     } 
     return output.ToArray(); 
    } 
Các vấn đề liên quan