To jest mój pierwszy post, więc mam nadzieję, że nie przegapiłem niczego ważnego. Robię projekt w C#, gdzie muszę użyć szyfrowania klucza publicznego/prywatnego, aby zaszyfrować wiadomość, a następnie wysłać go za pośrednictwem połączenia SSL.RSA Szyfrowanie dużych danych w C#
Wybrałem użycie RSACryptoService
, ponieważ zgodnie z dokumentacją był to jedyny asymetryczny schemat szyfrowania używany do szyfrowania danych. Problem polega na tym, że mam z tym wiele problemów. (Chciałem zrobić szyfrowanie symetryczne, ale to nie jest to, co mój nauczyciel chce, abym zrobił, i według niego powinno być łatwo określić rozmiar bloku, a następnie powinien wykonać całą pracę dla ciebie.) Cóż, do tej pory nie ma szczęścia i próbowałem kilka różnych podejść, ale teraz jestem z powrotem do podstaw i próbuje jeszcze raz, to jest mój bieżący kod:
public string[] GenerateKeysToStrings(string uniqueIdentifier)
{
string[] keys;
using (var rsa = new RSACryptoServiceProvider(4096))
{
try
{
string privateKey = rsa.ToXmlString(true);
string publicKey = rsa.ToXmlString(false);
this.pki.StoreKey(publicKey, uniqueIdentifier);
keys = new string[2];
keys[0] = privateKey;
keys[1] = publicKey;
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return keys;
}
Jak widać, wygenerować klucze i mimmick infrastruktury PKI przez wysłanie klucza publicznego do prostej klasy, która go przechowuje, a następnie klucz prywatny jest zapisywany do pliku (Zauważ, że mam też inną metodę, która robi to samo, ale przechowuje ją zamiast tablicy, tylko dlatego, że chciałem przetestować i upraszczaj rzeczy, gdy dostaję No such key exceptions
, a czasem wyjątki kryptograficzne, gdy robię to w sposób pokazany w obfite, więc chciałem uprościć go po prostu przechowywania ciąg rsa.ToXmlString
jako ciąg w tablicy, ale bez powodzenia)
Teraz mam szyfrowania i deszyfrowania metody w następujący sposób:.
public string Encrypt(string keyString, string message)
{
string encryptedMessage;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Load the key from the specified path
var encryptKey = new XmlDocument();
encryptKey.Load(@"C:\Test\PrivateKeyInfo.xml");
rsa.FromXmlString(encryptKey.OuterXml);
//// Conver the string message to a byte array for encryption
//// var encoder = new UTF8Encoding();
ASCIIEncoding byteConverter = new ASCIIEncoding();
byte[] dataToEncrypt = byteConverter.GetBytes(message);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);
//// Convert the byte array back to a string message
encryptedMessage = byteConverter.GetString(encryptedData);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return encryptedMessage;
}
deszyfrowania :
public string Decrypt(string keyString, string message)
{
string decryptedText;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Loads the keyinfo into the rsa parameters from the keyfile
/*
var privateKey = new XmlDocument();
privateKey.Load(keyString);
*/
rsa.FromXmlString(keyString);
//// Convert the text from string to byte array for decryption
ASCIIEncoding byteConverter = new ASCIIEncoding();
var encryptedBytes = byteConverter.GetBytes(message);
//// Create an aux array to store all the encrypted bytes
byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);
decryptedText = byteConverter.GetString(decryptedBytes);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return decryptedText;
}
wiem, że jest to ściana tekstu, ale mam nadzieję, że może mi pomóc, bo już walić głową o ścianę tak długo, teraz to nie jest zabawne :)
Problem polega na tym, w jaki sposób przejść o wiadomościach szyfrowanie z RSA
(lub jakakolwiek inna/szyfrowanie prywatny klucz publiczny)
Oto klient testowy:
public static void Main(string[] args)
{
PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
Cryptograph crypto = new Cryptograph();
string[] keys = crypto.GenerateKeysToStrings("[email protected]");
string plainText = "Hello play with me, please";
string publicKey = crypto.GetPublicKey("[email protected]");
string encryptedText = crypto.Encrypt(keys[0], plainText);
string decryptedText = crypto.Decrypt(keys[1], encryptedText);
}
Jak już wspomniano, układy łańcuchowe są tam ponieważ chciałem wyeliminować błędne parsowanie z dokumentów XML ...
Po uruchomieniu klienta testowego, jeśli użyję klucza prywatnego do zaszyfrowania i klucza publicznego do odszyfrowania, otrzymam komunikat "Klucz nie istnieje wyjątek" i jeśli robię to na odwrót, otrzymuję wyjątek zły.
Pomóżcie mi, chłopaki, jeśli znacie jakiś dobry przewodnik, lub możecie mi powiedzieć, jak w prosty sposób wdrożyć szyfrowanie klucza publicznego/prywatnego w wiadomościach tekstowych, proszę, pomóżcie mi.
Doceniam każdą pomoc.
Rozmawiałem z moim profesorem i wtedy mój punkt widzenia był taki, że lepiej byłoby zaszyfrować klucz, wymienić klucz i następnie użyj go, jako podstawy symetrycznego algorytmu, takiego jak rijndael do szyfrowania/odszyfrowania wiadomości, jednak nie chciał, abyśmy używali szyfrowania symetrycznego, więc teraz jestem w sytuacji, w której na razie jest to rodzaj off-limit. Wydajność, ile czasu zajęłoby szyfrowanie wiadomości, 501 bajtów (przy użyciu 4096bitowych kluczy RSA), gdy rozmawialiśmy o wiadomościach HTTP zawierających nazwę użytkownika i hasło? ciągle blokuję szyfrowanie RSA :( –
Można zaszyfrować szyfrowanie/odszyfrowanie RSA, aby pozostać poniżej limitu rozmiaru (dopełnienie) i konkatenować/podzielić wynik. Ile czasu? Twój procesor, czy to stary smartfon i nowy 8-rdzeniowy serwer? ;-), ale o wiele dłuższy niż odpowiednia alternatywa. – poupou
Chciałbym móc to zrobić, ale teraz nie mogę nawet uruchomić tego dla jakichkolwiek danych. Zrobiłem wersję uproszczoną i wykorzystałem to, jednak nadal otrzymuję błąd "Key does not exist" i wszystko, co naprawdę zrobiłem, to było refaktoryzowanie projektu, od jednej głównej metody do oddzielnych metod. Może używam konstruktora, prawda? Część, w której importuję kluczowe ustawienia? Wiem, że szyfr blokowy jest 1000 razy wolniejszy od algorytmu symetrycznego, ale w tej chwili chcę go uruchomić, niezależnie od tego, czy muszę go zakodować na twardym dysku tak, aby posiekać każdy blok danych na kawałki (keyize/8 - 11 (dla dopełnienia)) bajtów. –