Bu benim ilk yazı, umarım önemli bir şey kaçırmadım. Bir iletiyi şifrelemek ve sonra bir SSL bağlantısı üzerinden göndermek için genel/özel anahtar şifrelemeyi kullanmam gereken C# içinde bir proje yapıyorum.RSA C büyük veri şifreleme C#
Verileri şifrelemek için kullanılan tek asimetrik şifreleme şeması olan belgelere göre RSACryptoService
'u kullanmayı seçtim. Sorun şu ki bu konuda çok fazla sorun yaşıyorum. (Simetrik şifreleme yapmak istedim, ama öğretmenimin yapmamı istediği şey bu değil ve ona göre bir blok boyutunu belirlemek kolay olmalı ve sonra tüm işi sizin için yapmalı.) Peki, çok uzak hiçbir şans ve bazı farklı yaklaşımlar denedim fakat şimdi geri temelleri ve yeniden denemeden için, bu da benim şimdiki kodudur: Gördüğünüz gibi
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;
}
, anahtarları oluşturmak ve PKI mimmick Ortak anahtarı, onu depolayan basit bir sınıfa göndererek ve sonra özel anahtar bir dosyaya yazılır. (Aynı zamanda bunu yapan ancak bir dizi yerine saklayan başka bir yönteme sahip olduğumu farkettim, sadece test etmek istediğim için) ve ben No such key exceptions
olsun ve bazen eskide gösterilen şekilde kriptografik istisnalar alıyorum gibi şeyleri basitleştirmek bol, bu yüzden sadece dizideki bir dize, ancak hiçbir şans olarak, rsa.ToXmlString
dize saklayarak onu basitleştirmek istedi) Şimdi
Bir şifrelemek ve aşağıdaki gibi bir yöntem şifresini:.
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;
}
Şifre çözme :
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;
}
Ben bu metnin bir duvar olduğunu biliyorum, ama ben kafamı duvara vurarak oldum çünkü bana yardım umut kadar uzun şimdi komik değil :)
sorun Birlikte şifreleme mesajlar hakkında gitmek nasıl olduğunu RSA
(veya başka bir kamu/özel anahtar şifreleme) İşte
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);
}
Ben de belirtildiği gibi
, dize diziler var XML belgelerinden hatalı ayrıştırma hatasını ortadan kaldırmak istediğim için ...Test istemcisini çalıştırdığımda, şifrelemek için özel anahtarı ve şifreyi çözmek için ortak anahtarı kullanırsam, bir "Anahtar var istisnası yok" alıyorum ve Bunu diğer yoldan yaparsam, kötü bir veri istisnası olur. Lütfen iyi bir kılavuzdan haberdar olursanız ya da dize mesajlarında kamu/özel anahtar şifrelemeyi nasıl düzeltebileceğimi bana anlatabilirseniz lütfen bana yardımcı olun, lütfen bana yardımcı olun.
Yardımlarınız için minnettarım.
Profesörümle konuştum ve o sırada bakış açım bir anahtarı şifrelemek, anahtarı değiştirmek ve sonra, şifreli/şifrelemek için rijndael gibi simetrik bir algoritma için temel olarak kullanın, ancak simetrik şifrelemeyi kullanmamızı istemiyordu, bu yüzden şu an için sorta off-limit olan bir pozisyondayım. Performans bilgisi, kullanıcı adı ve parola içeren HTTP mesajları hakkında konuştuğumuzda, iletileri (5096 bit RSA anahtarları kullanarak) 501 bayta şifrelemek ne kadar zaman alırdı? blok bloğu ile bloke olsun ya da olmasın, hala RSA kullanarak problemlerim var :( –
RSA şifreleme/şifre çözme işlemini boyut sınırının altında kalmak (döngü dahil) yapabilir ve sonucu birleştirebilir/bölebilirsiniz. CPU'nuz, eski bir akıllı telefon ve yeni 8 çekirdekli bir sunucu mu? ;-) ama doğru bir alternatiften çok daha uzun. – poupou
Keşke zamana bakabilseydim, ama şimdi bunu herhangi bir veri için çalışmaya bile başaramıyorum. Basitleştirilmiş bir sürüm aldım ve bunu kullanmaya devam ettim, ancak hala "Anahtar yok" hatası alıyorum ve tek yaptığım tasarımları, yöntemleri ayırmak için tek bir ana yöntemden yeniden yapılandırmaktı. Belki yapıcıyı doğru kullanıyorum? Anahtar ayarlarını aldığım kısım? Bir blok şifresinin simetrik bir algoritmadan 1000 kat daha yavaş olduğunu biliyorum, ama şu anda sadece çalışmasını istiyorum, her bir veri bloğunu parçalara ayırmam gerekirse (keysize/8 - 11 (dolgu için)) bayt. –