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
Trả lời
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);
}
}
}
Nó đã giúp tôi rất nhiều, cảm ơn bạn rất nhiều – Recurrsion
Bạn có thể nhận xét về http://stackoverflow.com/questions/18344670/rsa-and-publickey-interop-with-dotnet – gpa
Vâng, cuối cùng. Ai đó đã đăng một hướng dẫn rõ ràng. Cảm ơn rất nhiều! –
Bạn đã thử dùng Signtool chưa. Công cụ này sẽ nằm trong thư mục Microsoft framework.
Signtool là để ký thực thi, nó không dành cho dữ liệu. – blowdart
.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.
".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ó. –
Đ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. –
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();
}
- 1. Ký và xác minh RSA với C#, BouncyCastle và khóa RSA đã nhập - Ví dụ về Python hoạt động và mẫu C# mã không hoạt động bên trong
- 2. Mã hóa BouncyCastle RSA cho BlackBerry
- 3. cách xóa dữ liệu trước khi mã hóa bằng bouncyCastle
- 4. Bắt đầu với BouncyCastle crypto dll C#
- 5. Mã hóa RSA của dữ liệu lớn trong C#
- 6. Tạo chữ ký RSA-SHA1 bằng JavaScript
- 7. Tạo X509Certificate bằng bouncycastle X509v3CertificateBuilder
- 8. PBKDF2 với bouncycastle trong Java
- 9. Lớp đệm RSA PKCS1-OAEP có được hỗ trợ trong bouncycastle không?
- 10. Mã hóa và giải mã PgP bằng BouncyCastle C#
- 11. Nhận lỗi java.lang.ArrayIndexOutOfBoundsException: quá nhiều dữ liệu cho khối RSA
- 12. dữ liệu Đăng với MD5WithRSA từ .PEM/.Pkcs8 keyfile trong C#
- 13. cách sử dụng RSA để mã hóa các tệp (dữ liệu lớn) trong C#
- 14. RSA - BouncyCastle PEMReader trở PEMKeyPair thay vì AsymmetricCipherKeyPair cho việc đọc tin quan trọng
- 15. Ký một tài liệu XML sử dụng RSA-SHA256 phương pháp chữ ký vấn đề
- 16. Sử dụng RSA trong C#
- 17. Mã hóa RSA với khóa không thể xuất trong HSM bằng C#/CSP
- 18. Đọc dữ liệu từ USB bằng C#?
- 19. Kiểu dữ liệu C# so với kiểu dữ liệu MySql
- 20. BouncyCastle trên Android
- 21. Kết nối với SQLite bằng ODBC mà không cần đăng ký cơ sở dữ liệu
- 22. Ví dụ về mã hóa tệp BouncyCastle PGP trong C#
- 23. nhật ký nant với dữ liệu và dấu thời gian
- 24. Tại sao chữ ký RSA-SHA256 tôi tạo ra với OpenSSL và Java khác nhau?
- 25. C chức năng # với dữ liệu tĩnh
- 26. C# Thao tác với dữ liệu JSON
- 27. Ghi dữ liệu nhật ký vào nhật ký hệ thống bằng cách sử dụng log4j
- 28. Tạo cặp khóa RSA bằng Erlang?
- 29. Sử dụng dữ liệu nhật ký thời gian với TraMineR
- 30. Xác minh chữ ký OpenSSL RSA: băm và đệm?
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
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. –
Điều đó có ý nghĩa - đặc biệt nếu bạn lo lắng về interop :) – blowdart