PHP/OpenSSL til C# / RSACryptoServiceProvider

Tags:    diverse php sikkerhed

Min titel siger vidst det hele.

Jeg har googlet og googlet nonstop i 18 timer nu og sad oppe hele natten igår.

Jeg kan SIMPELTHEN ikke finde en løsning. Kan det virkelig være rigtigt at man ikke kan lave en public key i PHP, sende den til C#, kryptere et eller andet i C#, sende det til PHP og så lade PHP dekryptere det igen?

Også meget gerne den anden vej (kryptere med privat nøgle i PHP, og authentikere at beskeden virkelig kom fra serveren i C# ved at dekryptere og tjekke indholdet).


Men hvordan pokker kan det være at to af de "største" sprog i verden ikke kan snakke sammen?


Ps. Jeg LOVER at lave en write up på det når/hvis jeg finder en løsning da det godt nok går mig på nerverne.

Jeg har prøvet både PHPSecLibs RSA og OpenSSL uden held. Jeg kan godt få public keyen fra OpenSSL ind i C# og kryptere noget med den. Men jeg kan aldrig få dekrypteret det igen hverken i PHP eller C# (i c# fordi jeg endnu ikke har fået private key'en ind endnu?)


Alt hvad jeg har kunnet finde siger "Brug Chillkats library" (det sker ikke!) eller "brug et certifikat"... Well, jeg ønsker at kreaere mine keys on the fly og sende dem direkte fra PHP. Jeg skal *** ikke igang med certifikater af nogen art.


Sorry for det lid grove sprogbrug her til sidst, men jeg tror vidst at alle udviklere har prøvet at VIRKELIG rive håret ud af hovedet på sig selv over et eller andet. Det gør jeg i hvert fald lige nu.

Håber i kan hjælpe ;)



6 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 10 karma
Sorter efter stemmer Sorter efter dato
Mhmm...men hvordan henter du så eksponenten og modulus ud af det som PHP har genereret ?
PHP genererer jo ikke XML.

PKCS1 er en måde at enkode nøgledata, ikke de krypterede data.



Indlæg senest redigeret d. 28.04.2011 19:23 af Bruger #2695
Prøv at poste lidt kode, som illustrerer problemet. Bare 10 linjer PHP og 10 linjer C# (eller i hvert fald så lidt som muligt).

PHP og C# skal være enige om, hvordan der paddes. PHP forstår følgende OPENSSL_PKCS1_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING.

PHP bruger OPENSSL_PKCS1_PADDING pr. default, måske bruger C# noget andet, og måske er det navngivet lidt anderledes.



Indlæg senest redigeret d. 29.04.2011 11:58 af Bruger #2695
Hvordan importerer/eksporterer du nøglerne og de krypterede data ?

Jeg bruger ikke C# men har ikke haft problemer i Java+PHP.



Jeg gemmer bare nøglerne fra PHP som en af de dersens filer hvor der står en masse bindestreger og "Private key" eller "public key" i toppen. (Pænt standard har jeg kunnet forstå?)

Og så i C# der bruger jeg FromXMLString funktionen.

Den tager så et input hvor der står noget i retning af

<RSAKeyValue><Modulus>172 tegn her</Modulus><Exponent>4 tegn her</Exponent></RSAKeyValue>

Og det passer fint med længden på hvad PHP virker og den indlæser det også som gyldig RSA key når jeg skriver det ind efter den formel.



Jeg kan bare ikke få dem til at snakke sammen på nogen måde fordi de åbenbart ikke forstår hinandens måde at gøre krypteringen på. Ligegyldigt om jeg bruger PKC1 eller hvad det nu hedder, eller jeg bruger OEMP padding.





Mhmm...men hvordan henter du så eksponenten og modulus ud af det som PHP har genereret ?
PHP genererer jo ikke XML.

PKCS1 er en måde at enkode nøgledata, ikke de krypterede data.




Jeg henter den offentlige nøgle ud af PHP så C# kan bruge den. Og det vil sige en modolus og en eksponent. Og ja, det er jeg godt klar over. Jeg prøver såmænd også bare at få C# til at kryptere så PHP kan dekryptere det. Og det irriterende er at C# jo fint kan indlæse nøglen men PHP kan stadig ikke læse beskeden.


De krypterede meddeleser bliver i øvrigt sendt i base64 hvis det er det du fisker efter?



Prøv at poste lidt kode, som illustrerer problemet. Bare 10 linjer PHP og 10 linjer C# (eller i hvert fald så lidt som muligt).

PHP og C# skal være enige om, hvordan der paddes. PHP forstår følgende OPENSSL_PKCS1_PADDING, OPENSSL_SSLV23_PADDING, OPENSSL_PKCS1_OAEP_PADDING, OPENSSL_NO_PADDING.

PHP bruger OPENSSL_PKCS1_PADDING pr. default, måske bruger C# noget andet, og måske er det navngivet lidt anderledes.


Bare glem det. Jeg gik for en anden metode alligevel. Det kan være jeg en skønne dag vender tilbage til dette irriterende emne, men for nu er "almindelig statisk" AES kryptering nok.

Har stemt alle dine indlæg op som tak for forsøget :)



t