[PHP/JS] OpenSSL modulus key krijgen

Pagina: 1
Acties:
  • 169 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Omdat ik beveiliging vrij interessant vind ben ik bezig met OpenSSL binnen PHP en dit heb ik allemaal werkende nu;
- nieuw keypair aanmaken
- public -> private encryptie
- private -> public encryptie

Allemaal leuk en aardig, maar ik heb er alleen serverside iets aan. Wat ik wil is bij een form onsubmit de data encrypten met de public key. Nu heb ik hier zelf uiteraard naar gezocht en kwam ik terecht op de volgende pagina : http://www-cs-students.stanford.edu/~tjw/jsbn/

Daar staan scripts die het zouden moeten kunnen dus, blij :) Maar... de public key die ik nodig heb om te encrypten is niet de gewone key, maar een zogeheten 'modulus' die je kunt extracten uit je key.

Als ik die heb zou ik, zover ik begrijp, kunnen doen wat ik wil dus en veilig data oversturen zonder direct gebruik te maken van https. Het probleem is nu : hoe kan ik die modulus extracten uit mn key in PHP ? Ik kan er nergens een functie voor vinden namelijk. Ik hoopte dat de functie 'openssl_pkey_get_details' me de modulus kon verschaffen maar dit blijkt niet het geval, helaas.

Iemand een idee?


edit:

de informatie die ik terugkrijgen uit de openssl_pkey_get_details() :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [bits] => 1024
    [key] => -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNmkgZwY4zaPKQIUwYkscfszR4
bBbn3nYikUl5ihSXfPy93lfHAD7v2wjA9uSl3ZV/10f6KFad+qq4/8HGcjxZf76o
mSZjTXLjDCqalFpac6UcyW+69HmJcUN4ob0LG5uirWZGk7rvCeGenGiiPhTVuWo1
XD9Aym12FmGpSg5gSQIDAQAB
-----END PUBLIC KEY-----

    [type] => 0
)


Is dat dan toch de modulus :? Deze code is namelijk veel korter dan het javascript voorbeeld op die site.

edit2:

als ik die key invoer bij de demo (http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.html) RSA public key en ik de string 'test' ga encoden krijg ik een bepaalde value in 'Ciphertext (base64):'
Als ik die probeer te decoden krijg ik de volgende error in OpenSSL :

error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed

[ Voor 31% gewijzigd door Cartman! op 16-02-2007 12:15 ]


Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 15:16
Cartman! schreef op vrijdag 16 februari 2007 @ 11:47:
edit:

de informatie die ik terugkrijgen uit de openssl_pkey_get_details() :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [bits] => 1024
    [key] => -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNmkgZwY4zaPKQIUwYkscfszR4
bBbn3nYikUl5ihSXfPy93lfHAD7v2wjA9uSl3ZV/10f6KFad+qq4/8HGcjxZf76o
mSZjTXLjDCqalFpac6UcyW+69HmJcUN4ob0LG5uirWZGk7rvCeGenGiiPhTVuWo1
XD9Aym12FmGpSg5gSQIDAQAB
-----END PUBLIC KEY-----

    [type] => 0
)


Is dat dan toch de modulus :? Deze code is namelijk veel korter dan het javascript voorbeeld op die site.
De public key is de modulus ja. Hiermee wordt het bericht ge-encode. Waarom dit korter is dan op de site os omdat deze gecodeerd is in base64 en op de site als hexadecimaal getal. Deze zou je gewoon moeten kunnen gebruiken.

Waarom wil je trouwens handmatig RSA coderen over HTTP??? Dit is veel trager dan HTTPS en brengt ook nog veel moeilijkheden met zich mee. Hou je bijvoorbeeld wel rekening met padding?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Even deze pagina als leidraad : http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.html

Die modulus moet ik in HEX hebben, hoe moet ik deze converteren naar het goede formaat zoals het voorbeeld op die pagina? Ik krijg, wat ik ook doe, een langere of kortere string terug (bin2hex, base64_encode...). Dat is volgens mij t enige waar t nu op hangt. Als die modulus klopt tijdens de invoer kan ik met mn PHP script de encrypted string decoden met mn private key.

Waarom ik dit wil? Omdat ik dingen wil kunnen encrypten/decrypten via een normale http pagina. De padding is gelijk overigens in de javascript implementatie op die pagina en mijn php script namelijk 'PKCS1' padding.

Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 15:16
code:
1
2
3
4
5
<?php
echo bin2hex(base64_decode('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNmkgZwY4zaPKQIUwYkscfszR4bBbn3nYikUl5ihSXfPy93lfHAD7v2wjA9uSl3ZV/10f6KFad+qq4/8HGcjxZf76omSZjTXLjDCqalFpac6UcyW+69HmJcUN4ob0LG5uirWZGk7rvCeGenGiiPhTVuWo1XD9Aym12FmGpSg5gSQIDAQAB'));
?>

30819f300d06092a864886f70d010101050003818d0030818902818100cd9a4819c18e3368f290214c1892c71fb334786c16e7de76229149798a14977cfcbdde57c7003eefdb08c0f6e4a5dd957fd747fa28569dfaaab8ffc1c6723c597fbea89926634d72e30c2a9a945a5a73a51cc96fbaf47989714378a1bd0b1b9ba2ad664693baef09e19e9c68a23e14d5b96a355c3f40ca6d761661a94a0e60490203010001


Dit komt er bij mij uit :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat had ik net zelf al geprobeerd inderdaad maar als ik een string ermee encode dan krijg ik de error :

'error:0406506C:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len'

Acties:
  • 0 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 15:16
Cartman! schreef op vrijdag 16 februari 2007 @ 15:42:
Dat had ik net zelf al geprobeerd inderdaad maar als ik een string ermee encode dan krijg ik de error :

'error:0406506C:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len'
Als ik er nu naar kijk zie ik inderdaad dat dit 1296 bits zijn, 272 bits teveel dus. Waarschijnlijk heeft OpenSSL in de public key de modulus en exponent zitten en eventueel nog wat extra info (welk type padding gebruikt etc..). Ik denk dat je even moet opzoeken hoe certificaten gecodeerd worden.

edit:
Wat komt er uit de functie openssl_pkey_get_public()? Dit zou de publieke key moeten opleveren en ik zou denken dat die de modulus en de exponent zou moeten geven. (ik kan het hier niet testen)

[ Voor 14% gewijzigd door Marcj op 16-02-2007 16:03 ]

Pagina: 1