2015-10-23 19 views
5

İstemci için sunucu ve C# form uygulaması için PHP'yi kullanarak bir çevrimiçi veritabanı uygulaması oluşturmaya çalışıyorum. Sunucuda, PHPSecLib ile ortak bir RSA anahtarı kullanarak basit bir dize şifreliyorum. Daha sonra C# uygulaması dizeyi alır ve karşılık gelen özel anahtarı kullanarak şifresini çözmeye çalışır. Baytlar sunucuda kodlanmış base64'tir ve C# ile yeniden bayt olarak çözülür. PHPSecLib kullanarak anahtar çifti oluşturdum. Ben^yukarıda belirtilen satırda aşağıdaki hatayı alıyorum,System.IO.IOException: ----- END RSA ÖZEL ANAHTARI bulunamadı

public string rsa_decrypt(string encryptedText, string privateKey) { 
     byte[] bytesToDecrypt = Convert.FromBase64String(encryptedText); 
     Pkcs1Encoding decrypter = new Pkcs1Encoding(new RsaEngine()); 
     //the error occurs on this line: 
     AsymmetricCipherKeyPair RSAParams = (AsymmetricCipherKeyPair)new PemReader(new StringReader(privateKey)).ReadObject(); 

     decrypter.Init(false, RSAParams.Private); 
     byte[] decryptedBytes = decrypter.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length); 
     string decryptedString = Convert.ToBase64String(decryptedBytes); 
     return decryptedString; 
    } 

Ama:

Bu

ben istemci uygulaması kullanmak koddur. ----- END RSA ÖZEL ANAHTAR

bulunamadı:

türü 'System.IO.IOException' işlenmeyen bir özel durum

bilgiye BouncyCastle.Crypto.dll

oluştu Herhangi bir şeyin şifresini çözmeyi denemeden önce bir hata aldığımda anahtar çiftiyle yanlış bir şey olmadığına inanıyorum. privateKey parametre şu anda bu biçimi kullanarak komut dosyası içine kodlanmış:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----XXXXXXXX-----END RSA PRIVATE KEY-----"; 

Yani aslında dize dahildir altbilgi ... Ben debug ve her yerde googled var gibi geliyor bana ama ben gibi olamaz çöz onu. Ben RSA & Bouncycastle için oldukça yeni, bu yüzden sadece yanlış yöntemler kullanıyorum.

Yardım edersiniz, teşekkürler! - G4A

P.S. Bu benim ilk Stackoverflow sorumuydu, sadece bir hesap oluşturdum, bu yüzden bu soruyu formüle ettiğim yol hakkında bana bir geri bildirim verebilirseniz; harika!

+2

IIRC Önceden sınır arasında bir çizgiye ihtiyacınız vardır; '' ----- BEGIN RSA ÖZEL ANAHTAR ----- \ r \ nXXXXXXXX \ r \ n ----- SON RSA ÖZEL ANAHTAR ----- "' –

+1

SO, G4A'ya hoş geldiniz! Soru, iyi soru, mükemmel biçimlendirme ile ilgili çok fazla yanlış yoktur. Daha fazla iyileştirme için dört şey: 1) gerçek bir soru ile bitebilir (bir soru işareti ile biten bir şey bilirsiniz) 2) "Umarım yardımcı olabilirsiniz, teşekkürler! -4GA" gerekli değildir ve aslında tercih edilmez 3) PS Sorunun altında bir yorum olmalı ve 4) lütfen örneğin AlexK. Bir çözüm önerdiğinde (ki bundan emin değildir, dolayısıyla cevabın yerine yorum). –

+1

Bu @AlexK trick yaptı! Bunu zaten denedim ama arabayı geri almayı unuttum. Yorumunuzu silebilir ve bir cevap haline getirebilir misiniz, böylece size karma verebilirim, ya da her ne olursa olsun. Ve teşekkür ederim @Maarten Bodewes hatırlayacağım. Son olarak, geç cevap için üzgünüm; Sanırım e-posta adresim henüz düzgün bir şekilde ayarlanmadı. – G4A

cevap

6

Öyle öncesi/sonrası kapsülleme sınır metin ve Base64 verileri arasında yeni bir satır eklemek gerekir:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nXXX\r\n-----END RSA PRIVATE KEY-----"; 

pem şartname iki arasındaki diğer metinsel başlıklarının varlığına olanak sağlar olmasıdır .

+1

Pro ipucu - '\ n' ve '\ r' çıkış sıralarını görmezden gelecek bir sözdizimi dizesini ('@" ... "') kullanmadığınızdan emin olun. –