[C#] Xây dựng thuật toán RSA
Chào cả nhà. Cho em hỏi về việc xây dựng thuật toán RSA viết bằng C# Đầu vào: Có một bộ key Private, Public key, và Signature dùng để virefy cái data Cấu trúc public key như bên dưới, Private key cũng tương tự
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6oQ1Jh6+uMi7cYgc+t92NhgSa
WymCGhRUdArFFS4oVjhMwjf0WAQ2wFMUiS88zQJmd7xYRU5+Nmo099UnX15sknEe
f2FPdHEd7OPMGodXedw6HL1uwKUunfW6uJ4NKzKNFIWaIU8Y3PpupfFee0dw+Ggq
UrNHRwwxLADJkvIMXQIDAQAB
-----END PUBLIC KEY-----
Plain text: Hello world
Dùng public key để encrypt cái plainText ở trên được Cipher
Để decrypt cái cipher về lại plainText, ta đưa vào private key và Signature.
E mới hiểu tư tưởng thuật toán, không biết viết lại trên C#.
Trong C# có một object RSACryptoServiceProvider để làm điều này, nhưng nó nạp priv, pub lic key từ XML dạng PEM gì đó.
Còn e đang cần xử lý thuật toán từ chuỗi pub, priv key như trên
1 CÂU TRẢ LỜI
Mình chưa rõ bạn định dùng RSA để mã hóa giải mã thông điệp hay xác thực chữ ký. Tuy nhiên các ngôn ngữ mình biết (mình không biết C# :v) đều hỗ trợ thư viện, package làm việc với RSA. Bạn thử dùng phương thức ImportParameters của đối tượng RSA để import khóa vào mã hóa và giải mã xem
E có 1 project nhỏ là gửi nhận request với Server Trước khi send request mình mã hóa cái body đó. Trên server nó sẽ response kết quả về cho client Ở đầu client dùng private key và signature để decrypt cái mã hóa mà server trả về Nếu dùng lớp đối tượng RSACryptoServiceProvider có sẵn trong C# nó hiện Generate cho mình bộ key pub, priv dưới dạng PEM E đang có sẵn cặp khóa pub, và private key, ko biết convert hoặc import làm sao vào cái đối tượng RSACryptoServiceProvider kia
@mincasoft Mình cũng đã từng làm cái hệ thống tương tự như vậy nhưng bằng các package của PHP xử lý server và js xử lý phía client, 2 ngỗn ngữ này hỗ trợ các thư viện RSA khá tốt. Bạn sử dụng phương thức ImportParameters không được à? Thông thường các đối tượng RSA sẽ có phương thức để bạn import key để thực hiện mã hóa và giải mã :3
static public byte[] Encryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
{
try
{
byte[] encryptedData;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.ImportParameters(RSAKey);
encryptedData = RSA.Encrypt(Data, DoOAEPPadding); } return encryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
}
Thông thường các ngôn ngữ sẽ hỗ trợ các đối tượng RSA có các phương thức để import key, phục vụ việc mã hóa và giải mã :3
@minhnv RSA bên C# nó import bằng file xml định dạng PEM Còn bằng cái raw string như này thì e chưa biết cách ạ
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6oQ1Jh6+uMi7cYgc+t92NhgSa
WymCGhRUdArFFS4oVjhMwjf0WAQ2wFMUiS88zQJmd7xYRU5+Nmo099UnX15sknEe
f2FPdHEd7OPMGodXedw6HL1uwKUunfW6uJ4NKzKNFIWaIU8Y3PpupfFee0dw+Ggq
UrNHRwwxLADJkvIMXQIDAQAB
-----END PUBLIC KEY-----
@mincasoft Bản chất file PEM thì nội dung nó chỉ là chứa nội dung khóa kia như string thôi mà. Định dạng khóa thế kia đang theo các chuẩn PKCS mình cứ truyền trực tiếp vào hàm nó tự hiểu mà