2010-08-22 4 views
0

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

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

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

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

EDIT 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); 
} 
+1

С чем вы боретесь? Или это более сложный «дать код»? – Artefacto

+0

Ищете кого-то, у кого уже есть такая функция. Надеюсь, я не первый человек в мире, у которого есть такое требование. Если у вас есть такая функция (или даже что-то близкое к ней), и если вы не возражаете против совместного использования, то я бы хотел ее увидеть. – StackOverflowNewbie

+0

@Stack Итак, это не вопрос программирования, это задача [поиск информации] (http://en.wikipedia.org/wiki/Information_retrieval). Тогда голосование закрывается. – Artefacto

ответ

1

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

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

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

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

+0

это хорошая идея. У меня уже есть функция шифрования/дешифрования. Моя проблема заключалась в том, что я получал нежелательные персонажи. Есть ли способ убедиться, что результаты кодирования в строке не превышают определенной длины? (например, локальная часть адреса электронной почты, по-видимому, ограничена только 64 символами: http://en.wikipedia.org/wiki/Email_address#Specification) – StackOverflowNewbie

+0

Я отредактировал исходное сообщение. Любые предложения, как я могу улучшить кодировку? – StackOverflowNewbie

1

Для шифрования в зависимости от ваших требований безопасности функции 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 байт.

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

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

+0

Просто использовать mcrypt недостаточно. Вы должны знать, как его использовать. Большая часть кода, который я вижу там, который использует mcrypt, повторно использует один и тот же IV все время ... – Artefacto

+0

@Artefacto - я включил ссылку на руководство, поскольку я считаю, что комментарии других лучше, чем исходная документация, хотя это требует в то время как читать. Но, как использовать mcrypt, будет другой вопрос, также, поскольку тогда он мог бы показать, как он использует это, а другие могут затем показать, как сделать это более надежно. –