Открыть SSL Encrypt PHP - PullRequest
       0

Открыть SSL Encrypt PHP

0 голосов
/ 30 ноября 2018

Я пытаюсь использовать функцию PHP openssl_encrypt(), но мой ключ закодирован в шестнадцатеричном формате, и функция возвращает ошибку.При использовании функции hex2bin() для преобразования ключа в двоичный код возвращаемое значение искажается текстом ASCII.Затем при вставке в openssl_encrypt().Я получаю ошибку.

define('TEX_ENCRYPTION_KEY', 'hexadecimalkey...');
define('TEX_ENCRYPTION_IV', 'hexadecimalkey...');

$key = hex2bin(TEX_ENCRYPTION_KEY);
$iv = hex2bin(TEX_ENCRYPTION_IV);

$transData = '<Detail>blah blah blah</Detail>';
$alg = 'aes-256-cbc';

$encryptedData = openssl_encrypt(
    $transData,
    $alg,
    $key,
    OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$iv
);

Это выводит ошибку:

error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data 
not multiple of block length

Есть идеи, что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

После танцев с документацией openssl у меня было решение заменить устаревшую функцию Mcrypt на openssl (функции openssl_encrypt и openssl_decrypt) и вернуть текст ASCII с помощью base64_encode ():

//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $length   = 8;
  $cstrong  = true;
  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext_raw = openssl_encrypt(
      $plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
    $hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
    $encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
  }

  return $encodedText;
}


//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {

  $c = base64_decode($encodedText);
  $cipher   = 'aes-128-cbc';

  if (in_array($cipher, openssl_get_cipher_methods()))
  {
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = substr($c, 0, $ivlen);
    $hmac = substr($c, $ivlen, $sha2len=32);
    $ivlenSha2len = $ivlen+$sha2len;
    $ciphertext_raw = substr($c, $ivlen+$sha2len);
    $plainText = openssl_decrypt(
      $ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
  }

  return $plainText;
}
0 голосов
/ 30 ноября 2018

Хотя этого нет в официальной документации , есть довольно хорошее объяснение того, что делает опция OPENSSL_ZERO_PADDING в комментариях .По умолчанию OpenSSL дополняет ваш открытый текст кратным размеру блока шифра (16 байтов в случае AES-256-CBC.) Однако вы отключили этот механизм, и OpenSSL ожидает, что вы обеспечите длину ваших данныхкратно 16. Это не так, поэтому вы получаете сообщение об ошибке «данные не кратны длине блока».

Решение: добавьте данные или удалите эту опцию!

<?php
$transData = '<Detail>blah blah blah</Detail>';
$transData = str_pad(
    $transData,
    strlen($transData) + (16 - (strlen($transData) % 16)),
    chr(0)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...