PHP: как генерировать разные выходные данные для той же строки

Есть ли какой-нибудь способ генерировать разные выходные данные для одной и той же строки, вот пример:

echo md5('test');

Это всегда порождает одно и то же fb469d7ef430b0baf0cab6c436e70375 для данного входа. Как каждый раз генерировать различный зашифрованный текст и, при необходимости, расшифровывать его позже?

Я видел такие функции, как md5, base64_encode, crypt, sha1и т. д., но они генерируют тот же результат, и во-вторых, я не могу расшифровать позже, если это необходимо.

PS: я знаю, что могу использовать одностороннее шифрование и сравнивать зашифрованные тексты, но для конкретного сценария у меня есть требование иметь возможность полностью расшифровать текст, если это потребуется позже, однако я не могу выяснить, есть ли какой-либо способ или функция в PHP для этого.

Любая помощь будет оценена. Спасибо

0

Решение

Чтобы зашифровать то же самое plaintext так что он генерирует разные ciphertext вы меняете ключ (и / или Initialization Vector (IV) в зависимости от режима работы алгоритма, например CBC).

Пример:

$string = 'Some Secret thing I want to encrypt';
$iv = '12345678';
$passphrase = '8chrsLng';

$encryptedString = encryptString($string, $passphrase, $iv);
// Expect: 7DjnpOXG+FrUaOuc8x6vyrkk3atSiAf425ly5KpG7lOYgwouw2UATw==

function encryptString($unencryptedText, $passphrase, $iv) {
$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $passphrase, $unencryptedText, MCRYPT_MODE_CBC, $iv);
return base64_encode($enc);
}

Оба одинаковые IV и passphrase должен использоваться при расшифровке в CBC Режим. passphrase НЕОБХОДИМО хранить в тайне (от подслушивающих), пока IV может быть передано в открытом виде.

Вы МОЖЕТЕ (но не должны) использовать то же самое passphrase для каждого сообщения / данных, но вы должны ВСЕГДА менять IV за каждое сообщение / данные.

Это основа шифрования, но в зависимости от ваших потребностей вам может потребоваться изменить архитектуру, чтобы обеспечить безопасность системы.

1

Другие решения

MD5 — это метод хеширования, а не шифрование.

короче. нет «хорошего» пути назад от md5.

base64_encode и base64_decode и будут использоваться для передачи сообщений, но это не расшифровка.

пожалуйста, гуглите на тему RSA, ROT-13 или базовое шифрование с помощью php.

0

Я создал этот класс (спасибо @Sani Huttunen за идею) для этой цели. Это позволяет генерировать различный текст, генерируемый каждый раз даже для одного и того же входного текста, и успешно его декодирует.

class Encoder
{
private static $prefix = '@!@';

public static function php_aes_encrypt($text, $key)
{
if (!trim($text)) {
return '';
}

$iv = self::generateRandomString();
$key = self::mysql_aes_key($key);

$pad_value = 16 - (strlen($text) % 16);
$text = str_pad($text, (16 * (floor(strlen($text) / 16) + 1)), chr($pad_value));
$ciphertext = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
$text,
MCRYPT_MODE_CBC,
$iv
);

$ciphertext = self::getPrefix() . base64_encode($ciphertext . $iv);
return $ciphertext;
}

public static function php_aes_decrypt($text, $key)
{
$text = str_replace(self::getPrefix(), '', $text);
$text = base64_decode($text);

if (!trim($text)) {
return '';
}

$iv = substr($text, -16);
$text = str_replace($iv, '', $text);

$key = self::mysql_aes_key($key);
$text = mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$text,
MCRYPT_MODE_CBC,
$iv
);

return rtrim($text, "\0..\16");
}

private static function mysql_aes_key($key)
{
$new_key = str_repeat(chr(0), 16);

for ($i = 0, $len = strlen($key); $i < $len; $i ++) {
$new_key[$i % 16] = $new_key[$i % 16] ^ $key[$i];
}

return $new_key;
}

private static function getPrefix()
{
return base64_encode(self::$prefix);
}

public static function isEncrypted($ciphertext)
{
$isEncrypted = (false !== strpos($ciphertext, self::getPrefix()));
return $isEncrypted;
}

private static function generateRandomString()
{
return substr(sha1(rand()), 0, 16);
}
}

Использование:

$encrypted = Encoder::php_aes_encrypt('my test string', 'key');
echo $encrypted . '<br>';
echo Encoder::php_aes_decrypt($encrypted, 'key');
0
По вопросам рекламы [email protected]