Мне нужно скрыть конфиденциальную информацию, такую как адреса электронной почты, написанные для файлов cookie посетителя на моем веб-сайте, и я надеялся на RC4. Но я написал простой тест для сравнения каждого символа в строках, выводимых из стандартной процедуры RC4, со всеми известными допустимыми символами для использования в файлах cookie, основываясь на документации, которую я извлек из https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie После нескольких случайных тестов я пришел к выводу, что Строки RC4 могут вызывать проблемы, если они записаны в значения cookie «как есть».
Конечно, я мог бы использовать что-то более простое, например base64, поскольку файлы cookie будут храниться в собственной системе посетителя. Но я бы лучше использовал что-то более сильное. Я был бы осторожен или переписывал подпрограмму RC4, чтобы «придерживаться» разрешенных символов, и знал бы, что могу восстановить исходные данные. Но прежде чем я попробую, я хотел бы подумать, что это уже «сделано». Но я не смог найти такую вещь.
Для справки: это процедура RC4, с которой я бы начал (PHP) ...
/*
* RC4 symmetric cipher encryption/decryption
*
* @license Public Domain
* @param string key - secret key for encryption/decryption
* @param string str - string to be encrypted/decrypted
* @return string
*/
function rc4($key, $str) {
$s = array();
for ($i = 0; $i < 256; $i++) {
$s[$i] = $i;
}
$j = 0;
for ($i = 0; $i < 256; $i++) {
$j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
$x = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $x;
}
$i = 0;
$j = 0;
$res = '';
for ($y = 0; $y < strlen($str); $y++) {
$i = ($i + 1) % 256;
$j = ($j + $s[$i]) % 256;
$x = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $x;
$res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
}
return $res;
}
Также для справки, на основе ссылки на mozilla.org, которую я связал, я построил эту простую функцию javascript для проверки выходных строк и подсчета ошибок (ошибки означают недопустимые символы) в строке.
function cookieSafe(str) {
var okchars = "!#$%&'()*+-./:<=>?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
var letterNumber = /^[0-9a-zA-Z]+$/;
var s;
var errors =0;
for (var i = 0; i < str.length; i++) {
s = str.substr(i,1);
if (okchars.indexOf(s) > -1) continue;
errors +=1;
}
return errors;
}
Спасибо за любую помощь, и спасибо, что НЕ проголосовали. Лучше бы мне посоветовали правильно исправить или удалить мой вопрос, чем снова «забанить».