Функции безопасного шифрования / дешифрования - PullRequest
0 голосов
/ 23 августа 2010

Учитывая входную строку (на самом деле будет целочисленным значением) и ключ шифрования, мне нужно зашифровать входную строку таким образом, чтобы полученная строка была:

  1. URL safe (myразрешенные символы URI в настоящее время: az 0-9 ~%.: _-)
  2. Безопасное имя файла (имеется в виду, что используются только допустимые символы каталога / имени файла)
  3. Безопасное имя пользователя учетной записи FTP
  4. Имя пользователя учетной записи электронной почты безопасно

Затем, учитывая зашифрованную строку и тот же ключ шифрования, расшифруйте строку в ее незашифрованном виде.

Это не предназначено длямера безопасности.Реализация должна быть в PHP.Спасибо.

РЕДАКТИРОВАТЬ 1 (декодирование по-прежнему содержит нежелательные символы; плюс, нет способа убедиться, что результирующая зашифрованная строка имеет определенную длину):

function decrypt($string, $encryption_key)
{
    assert(isset($string) === TRUE);
    assert(isset($encryption_key) === TRUE);

    $result = '';
    $string = base64_decode($string);

    for ($i = 0; $i < strlen($string); $i++)
    {
        $char    = substr($string, $i, 1);
        $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1);
        $char    = chr(ord($char) - ord($keychar));
        $result .= $char;
    }

    return $result;
}


function encrypt($string, $encryption_key)
{
    assert(isset($string) === TRUE);
    assert(isset($encryption_key) === TRUE);

    $string = (string) $string;
    $result = '';

    for ($i = 0; $i < strlen($string); $i++)
    {
        $char    = substr($string, $i, 1);
        $keychar = substr($encryption_key, ($i % strlen($encryption_key)) - 1, 1);
        $char    = chr(ord($char) + ord($keychar));
        $result .= $char;
    }

    return base64_encode($result);
}

Ответы [ 2 ]

1 голос
/ 23 августа 2010

Для шифрования, в зависимости от ваших требований безопасности, функции mcrypt_encrypt (http://us2.php.net/manual/en/function.mcrypt-encrypt.php) могут быть достаточно простыми.

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

После шифрования вы можете использовать кодировку base-64 (http://us2.php.net/manual/en/function.base64-encode.php),, которая является известным шаблоном, хорошо проверенным.

Поскольку вы шифруете int длиной не более 8 байтов, любая длина ключа должна быть в порядке, чтобы получить известный размер, ваш ключ должен> = 8 байтов.

Я бы посоветовал вам не писать свой собственный алгоритм шифрования, так как он будет небезопасным, и есть много таких, которые отвечают вашим потребностям, в зависимости от того, какие у вас другие требования. Как уже упоминалось, вы можете вернуться назад и определить размер, который вы хотите, чтобы была закодированная строка, которая скажет вам, сколько байтов может быть зашифрованный результат. Затем вы можете определить размер ключа, чтобы получить размер зашифрованного сообщения.

Если вы хотите зашифровать строку произвольной длины, то предыдущий абзац будет неправильным, поскольку размер зашифрованного сообщения не будет известен.

1 голос
/ 23 августа 2010

Рассмотрите шифрование и кодирование как два отдельных и несвязанных шага. В одном направлении вы шифруете незашифрованные байты, чтобы получить зашифрованные байты, а затем кодируете байты, чтобы получить строку. В другом направлении вы декодируете строку, чтобы получить байты зашифрованного текста, затем расшифровываете байты зашифрованного текста, чтобы получить байты открытого текста.

Ваши требования могут быть наиболее просто удовлетворены с помощью простого шестнадцатеричного или базового кодировщика 16, который преобразует байт в два шестнадцатеричных символа. Если эффективность пространства кодирования абсолютно необходима, вы можете реализовать свой собственный кодер base-62, который использует только прописные и строчные буквы и цифры. Это будет медленнее и, возможно, хуже, чем шестнадцатеричное кодирование.

РЕДАКТИРОВАТЬ 1:

Если кодировка base-64 дает приемлемые строки, тем лучше. Base-64 использует 4 символа для кодирования 3 байтов. Поэтому, если вы ограничены 64 символами, вы не можете кодировать более (64/4) * 3 = 48 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...