2017-02-16 1 views
1

J'essaie d'apprendre comment effectuer un cryptage/décryptage simple entre une machine Windows 64 (mon PC) et PHP fonctionnant sur un serveur web Linux en utilisant openSSL .Encrypt/Decrypt openSSL entre Windows PC et PHP fonctionnant sous Linux Web Server

Sur ma machine Windows, j'ai installé OpenSSL v1.0.2k pour Win64 et je suis en utilisant la commande suivante pour créer une chaîne cryptée en utilisant un mot de passe simple et une simple clé située dans secretkey.txt.

enc -aes-256-cbc -A -base64 -nopad -nosalt -pass pass:hello -in secretkey.txt

Quand je lance la commande ci-dessus, je reçois la chaîne suivante:

3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc=

Utilisation de la chaîne ci-dessus, je me attends PHP sur mon serveur web Linux pour pouvoir décrypter comme ceci:

$encrypted = '3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc='; 
$enc = 'aes-256-cbc'; 
$password = 'hello'; 
$key = openssl_decrypt($encrypted, $enc, $password, OPENSSL_ZERO_PADDING); 
echo $key .' should equal this-1234-is-4567-my-8910-secret'; 

Mais, au lieu que je reçois ceci:

9 (jT] $ WMaSèzz>. (Doit être égal à ce-1234-est-4567-my-8910 secret

I « ai passé en revue les sites, et essayé plusieurs versions, mais je ne peux pas le faire pour déchiffrer correctement:

Open SSL Enc
Open SSL Command Line
PHP Decrypt

+0

pas un doublon. la question est d'essayer de chiffrer à partir de la ligne de commande (windows) et décrypter en utilisant php. la solution recommandée est tout au sujet du cryptage et du décryptage tous dans PHP. – Marc

+0

Êtes-vous base64 décodant la sortie openssl dans votre code PHP? –

+0

Le rembourrage à zéro est une mauvaise idée, en général, le rembourrage PKCS # 7 (née PKCS # 5) est utilisé. Le remplissage à zéro n'autorise pas le cryptage de données binaires se terminant par un octet zéro (0x00). – zaph

Répondre

1

AES nécessite une clé de travailler . C'est une séquence d'octets de exactement la longueur exacte (32 dans le cas d'AES-256). Vous ne pouvez pas utiliser directement un mot de passe (à moins que les octets constituant le mot de passe aient la bonne longueur).

En outre, CBC mode nécessite un vecteur d'initialisation (IV) de 16 octets.

La commande OpenSSL dérive la clé et la clé à utiliser du mot de passe fourni à l'aide d'une fonction interne EVP_BytesToKey. Afin de déchiffrer un fichier qui a été chiffré avec enc vous devez reproduire cette fonction. Les détails de l'algorithme sont dans les docs. En PHP, il pourrait ressembler à ceci:

$password = 'hello'; 

$bytes = ""; 
$last = ""; 

// 32 bytes key + 16 bytes IV = 48 bytes. 
while(strlen($bytes) < 48) { 
    $last = md5($last . $password, true); 
    $bytes.= $last; 
} 

// First 32 bytes are the key, next 16 are the IV. 
$key = substr($bytes, 0, 32); 
$iv = substr($bytes, 32, 16); 

Vous pouvez ensuite utiliser ces valeurs dans la commande openssl_decrypt:

$enc = 'aes-256-cbc'; 
$result = openssl_decrypt($encrypted, $enc, $key, OPENSSL_ZERO_PADDING, $iv);