к примеру, этот сэмпл :
Код | using System; using System.Security.Cryptography; using System.Text;
class RSACSPSample {
static void Main() { try { //Create a UnicodeEncoder to convert between byte array and string. UnicodeEncoding ByteConverter = new UnicodeEncoding();
//Create byte arrays to hold original, encrypted, and decrypted data. byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt"); byte[] encryptedData; byte[] decryptedData;
//Create a new instance of RSACryptoServiceProvider to generate //public and private key data. using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) {
//Pass the data to ENCRYPT, the public key information //(using RSACryptoServiceProvider.ExportParameters(false), //and a boolean flag specifying no OAEP padding. encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
//Pass the data to DECRYPT, the private key information //(using RSACryptoServiceProvider.ExportParameters(true), //and a boolean flag specifying no OAEP padding. decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
//Display the decrypted plaintext to the console. Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData)); } } catch (ArgumentNullException) { //Catch this exception in case the encryption did //not succeed. Console.WriteLine("Encryption failed.");
} }
static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { try { byte[] encryptedData; //Create a new instance of RSACryptoServiceProvider. using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) {
//Import the RSA Key information. This only needs //toinclude the public key information. RSA.ImportParameters(RSAKeyInfo);
//Encrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding); } return encryptedData; } //Catch and display a CryptographicException //to the console. catch (CryptographicException e) { Console.WriteLine(e.Message);
return null; }
}
static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { try { byte[] decryptedData; //Create a new instance of RSACryptoServiceProvider. using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { //Import the RSA Key information. This needs //to include the private key information. RSA.ImportParameters(RSAKeyInfo);
//Decrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding); } return decryptedData; } //Catch and display a CryptographicException //to the console. catch (CryptographicException e) { Console.WriteLine(e.ToString());
return null; }
} }
|
Вопрос, наверное стоит уже больше теоретический. Ситуация : Есть клиенты и сервер. Сервер хочет знать, что ему приходят данные только от его клиентов. Значит клиенты должны сначала отправить запрос к серверу(что-то типа "я хочу отправить тебе данные, дай мне ключ"), сервер отправляет (при этому генерирует приватный и публичный ключи) публичный ключ клиенты, клиент его получает, создает подпись(т.е. сначала вычислят хеш, потом создает подпись публичным ключем), отправляет всё это серверу, а сервер проверяет с помощью приватного ключа чьи это данные - его клиентов или нет.
это правильный подход? |