C# Ve RSA (Sorun)
-
aşağıdaki gibi bir class oluşturdum fakat bu class ile şifreleme yaparken her seferinde (aynı metin) şifrelenen data farklı çıkıyor ve şifrelenen veriyi aynen çözmeye çalışınca program hata veriyor. c# ile yeni yeni tanışıyorum işin içinden çıkamadım.
örneğin;
RSAsinifi rsa = new RSAsinifi();
string x = rsa.Sifrele("asd");
burada x'i textbox'a aktardığımda gördüğüm şey:
�v��!��䟠�ӝ�D����cL�U��j�������5���EV���JA�[��7.��y3?�s �7�>��;�L:�y�����k��^I��ڌH���1/������Hf�
]�T�yazdığım sınıf:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace RSAcom { class RSAsinifi { RSACryptoServiceProvider RSAx = new RSACryptoServiceProvider(); UTF8Encoding encoder = new UTF8Encoding(); public string Sifrele(string metin) { byte[] x; x = encoder.GetBytes(metin); x = RSAx.Encrypt(x, false); metin = encoder.GetString(x); return metin; } public string Coz(string metin) { byte[] x; x = encoder.GetBytes(metin); x = RSAx.Decrypt(x, false); metin = encoder.GetString(x); return metin; } } } -
hacı stringe çevirmeden eklesene text boxa
demek istediğim
123 432 567 423 532
şeklinde eklettir
-
hocam fonksiynlarındaki
encoder.GetString yerine Convert.ToBase64String, encoder.GetBytes yerine Convert.FromBase64String kullanırsan sorun çözülür ;)
pardon birden fazla varmış. şu şekilde düzenle..
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace RSAcom { class RSAsinifi { RSACryptoServiceProvider RSAx = new RSACryptoServiceProvider(); UTF8Encoding encoder = new UTF8Encoding(); public string Sifrele(string metin) { byte[] x; x = encoder.GetBytes(metin); x = RSAx.Encrypt(x, false); metin = Convert.ToBase64String(x); return metin; } public string Coz(string metin) { byte[] x; x = Convert.FromBase64String(metin); x = RSAx.Decrypt(x, false); metin = encoder.GetString(x); return metin; } } }
unbalanced tarafından 10/Kas/12 00:59 tarihinde düzenlenmiştir
-
@wert text box'a stringe çevirmeden koyamıyorum ki
@unbalanced hocam senin dediğin gibi yapmaya çalıştım şu şekilde
public string Sifrele(string metin) { byte[] x; x = Convert.FromBase64String(metin); x = RSAx.Encrypt(x, false); metin = Convert.ToBase64String(x); return metin; }bu seferde aşağıdaki hatayı verdi:
Invalid length for a Base-64 char array.
-
x i aldiktan sonra, koyacagin yere x.ToString("X2"); yaparak koy bakalim, belki daha anlasilir olur sifrelenmis metin gosterim acisindan.
-
overbite bunu yazdı
@wert text box'a stringe çevirmeden koyamıyorum ki
@unbalanced hocam senin dediğin gibi yapmaya çalıştım şu şekilde
public string Sifrele(string metin) { byte[] x; x = Convert.FromBase64String(metin); x = RSAx.Encrypt(x, false); metin = Convert.ToBase64String(x); return metin; }bu seferde aşağıdaki hatayı verdi:
Invalid length for a Base-64 char array.
düzelttim hocam, iki fonksiynda da ikişer tane varmış. herbirinden bi tanesini değiştirecektin
-
@unbalanced hocam sağolasın düzeldi, fakat bir noktayı anlamadım. "deneme" yazıp şifrelediğimde her seferinde şifreli metin değişik çıkıyor, anahtarlar değişmediği sürece şifreli metinin de aynı olması gerekmez mi?
-
muhtemelen şifrelenmiş bilginin içinde zamana göre oluşturulmuş dinamik şeyler var, çok bilgim yok şifreleme algritmaları hakkında. ama mesela şifrelenmiş bilgiye zaman bilgisini ekleyip vermiş olabilirler ve o zaman bilgisini okuyup onu anahtar olarak kullanıyor olabilirler, böyle bir mantık getirebildim. belki yanlıştır..
encription metodunun aslı burada
public byte[] Encrypt (byte[] rgb, bool fOAEP) { // choose between OAEP or PKCS#1 v.1.5 padding AsymmetricKeyExchangeFormatter fmt = null; if (fOAEP) fmt = new RSAOAEPKeyExchangeFormatter (rsa); else fmt = new RSAPKCS1KeyExchangeFormatter (rsa); return fmt.CreateKeyExchange (rgb); }tüm algoritma için buraya bakabilirsin. http://www.di-mgt.com.au/rsa_alg.html
