Скрипт простого шифрования

Скрипт простого шифрования

В свое время, чистя html-файлы от вирусов, я наткнулся на забавный способ шифрования строк. Строки авторы вируса формировали с помощью чисел, причем все это выглядело примерно так: window[17795081..toString(36)](‘!’); Ну, с window все понятно, доступ к свойству объекта осуществляется с помощью квадратных скобок (в javascript так можно), а круглые скобки означают вызов метода. Но, блин, что за фигня там в квадратных скобках?!

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

В javascript числа можно переводить в строки, вызывая метод toString(), который определен для Object (Number тоже наследуется от него). Если toString() вызвать с числовым параметром, это будет перевод числа в выбранную систему счисления. К примеру, var a = 31;a.toString(16); равно “1f”. Перевод в 36-значную систему позволяет использовать все цифры и буквы a-z. И все бы хорошо, но, если записать 31.toString(16);, получится ошибка, потому что после точки у числа должна идти дробная часть, а не вызов метода. Решить это можно несколькими способами, самые простые: 31 .toString(16);, 31..toString(16); и (31).toString(16);. Обрати внимание, что в первом способе после числа пробел.

Вернемся к исходному примеру. 17795081..toString(36) – это “alert”. Получается window["alert"](‘!’); или window.alert(‘!’);. Этот способ шифрования мне настолько понравился, что я написал небольшой скрипт, который ты можешь использовать, чтобы запутать свой код. Только напоминаю: скрипт понимает лишь следующие символы: [0-9a-z ], причем пробелы не шифрует.

<br />
<script type="text/javascript">
function elem(x){return typeof(x)=='string'?document.getElementById(x):x;}
function crypt(str){
	str = str.toLowerCase().replace(/[^0-9a-z ]/g, '');
	var estr = [];
	var t = str.split(' ');
	for(var i = 0, il = t.length; i < il; ++i){
		if(!t[i].length) continue;
		var temp = '';
		while(t[i].length > 8){
			temp += str2num(t[i].substr(0, 8)) + '.0.toString(36)+';
			t[i] = t[i].substr(8);
		}
		temp += str2num(t[i]) + '.0.toString(36)';
		estr[estr.length] = temp;
	}
	return estr.join('+" "+');
}
function str2num(str){
	if(!str.length) return 0;
	var n = 0;
	for(var j = str.length; j; --j){
		var q = str.charCodeAt(str.length-j);
		if(q < 58) q -= 48;
		else q -= 87;
		n += q * Math.pow(36, j-1);
	}
	return n;
}
</script></p>
<p><input type="text" id="text" size="50" /><input type="button" value="crypt" onClick="elem('res').value=crypt(elem('text').value);" /><br />
<textarea id="res" cols="60" rows="3"></textarea><br />


И на закуску музыка.

Аудиозапись: Adobe Flash Player (версия 9 или выше) требуется для воспроизведения этой аудиозаписи. Скачать последнюю версию здесь. К тому же, в Вашем браузере должен быть включен JavaScript.

  1. Комментов пока нет

  1. Трэкбэков пока нет.

T_T O_O =| =D =/ =) =( ;) :twisted: :idea: :cool: :blush: :?: :!:
*