Проблема с шифрованием с помощью SSL ключа

476
28 мая 2017, 23:09

Шифрую с помощью открытого ключа, дешифрую с помощью закрытого.

часть данных шифруется и дешифруется хорошо, другая часть выдает ошибки

получаю ошибки всегда в рандомном месте

вывод через цикл одного и того-же текста:

Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
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
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
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
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
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
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
error:0906D06C:PEM routines:PEM_read_bio:no start line
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
354 -> Exception: DECODE
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
354 -> Exception: DECODE
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
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать
Текст, который надо шифровать -> string(354) -> Текст, который надо шифровать

вызываю

$txt = 'Текст, который надо шифровать';
for ($t=0;$t<30;$t++) {
    try {
        echo $txt, ' -> ';
        $except = 'ENCODE';
        $crypt_name = encode($txt);
        echo strlen($crypt_name), ' -> ';
        $except = 'DECODE';
        $uname = decode($crypt_name);
        echo $uname, PHP_EOL;
    }
    catch (Exception $e){
        echo 'Exception: ',$except, PHP_EOL;
        while ($msg = openssl_error_string())
            echo $msg,PHP_EOL;
    }
}

сами функции

шифрование

public function encode($data, $options=null) {
    if (!is_string($data))
        throw new InvalidArgumentException(sprintf('Argument $data must be a string, %s given', gettype($data)));
    $options = (array) $options;
    // с помощью открытого ключа
    if (empty($options['usePrivateKey'])) {
        if (!is_resource($this->public_key_resource))
            throw new RuntimeException('The public key is not installed');
        $encryptFunction = 'openssl_public_encrypt';
        $encryptKey = $this->public_key_resource;
        $encryptBlockSize = floor(($this->public_key_bits / 8) * .9);
    }
    // с помощью закрытого ключа
    else {
        if (!is_resource($this->private_key_resource))
            throw new RuntimeException('The private key is not installed');
        $encryptFunction = 'openssl_private_encrypt';
        $encryptKey = $this->private_key_resource;
        $encryptBlockSize = floor(($this->private_key_bits / 8) * .9);
    }
    $offset = 0;
    $encrypted = '';
    while ($part = substr($data, $offset * $encryptBlockSize, $encryptBlockSize)) {
        if (!$encryptFunction($part, $partenc, $encryptKey, OPENSSL_PKCS1_PADDING)) {
            $exception_msg = 'Error encrypting data';
            // while ($msg = openssl_error_string()) $exception_msg .= PHP_EOL . $msg;
            throw new RuntimeException($exception_msg);
        }
        $encrypted .= $partenc;
        $offset++;
    }
    return $encrypted;
}

дешифрование

public function decode($data, $options=null) {
    if (!is_string($data))
        throw new InvalidArgumentException(sprintf('Argument $data must be a string, %s given', gettype($data)));
    $options = (array) $options;
    // с помощью открытого ключа
    if (empty($options['usePublicKey'])) {
        if (!is_resource($this->private_key_resource))
            throw new RuntimeException('The private key is not installed');
        $decryptFunction = 'openssl_private_decrypt';
        $decryptKey = $this->private_key_resource;
        $decryptBlockSize = $this->private_key_bits/ 8;
    }
    // с помощью закрытого ключа
    else {
        if (!is_resource($this->public_key_resource))
            throw new RuntimeException('The public key is not installed');
        $decryptFunction = 'openssl_public_decrypt';
        $decryptKey = $this->public_key_resource;
        $decryptBlockSize = $this->public_key_bits/ 8;
    }
    $offset = 0;
    $decrypted = '';
    while ($partenc = substr($data, $offset * $decryptBlockSize, $decryptBlockSize)) {
        if (!$decryptFunction($partenc, $part, $decryptKey, OPENSSL_PKCS1_PADDING)) {
            $exception_msg = 'Error decrypting data';
            // while ($msg = openssl_error_string()) $exception_msg .= PHP_EOL . $msg;
            throw new RuntimeException($exception_msg);
        }
        $decrypted .= $part;
        $offset++;
    }
    return $decrypted;
}
READ ALSO
Перевести text в timestamp

Перевести text в timestamp

Есть текстовый <input name='time'>, куда вводится что-то типа "2605

266
PHP mail(): Как прикрепить pdf-файл к письму?

PHP mail(): Как прикрепить pdf-файл к письму?

Нужно, чтобы вместо message прикреплялся готовый файл с сервера и отправлялся mail()Или есть другое решение ?

1006
Не работает своя функция в opencart 2.0

Не работает своя функция в opencart 2.0

подскажите почему не работает своя функция в opecart 20 делаю так в контролере:

533