![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
XOR алгоритм
Denis_ © (2007-09-16 15:56:00)Несколько раз встречал здесь вопрос о таком методе шифрования, и стало интересно , как его реализовать.Как?
Denis_ (2007-09-22 13:56:00) [1]
> Где-то у меня в свалке валяется pas-модуль, написанный ещё
> лет 20 назад
Я ещё тогда не родился даже.
Anatoly Podgoretsky (2007-09-22 11:58:00) [2]> Германн (22.09.2007 00:32:23) [83]
Наверно про стеганографию говоришь?
Если да, то это не шифровка.
Германн (2007-09-22 00:32:00) [3]
> Я сделал это!!!
Где-то у меня в свалке валяется pas-модуль, написанный ещё лет 20 назад. Предназначался для шифровки любого текстового документа так, что бы никто его не понял, но и никто бы не заподозрил, что это шифровка :-)
P.S. Написан был не мной.
palva (2007-09-21 22:37:00) [4]> Если кто расшифрует, звоните, или в аську стучите.
Неужели с расшифровкой вам тоже надо помогать?
Сергей М. (2007-09-21 22:24:00) [5]
> Если кто расшифрует, звоните, или в аську стучите.
Ты просто не представляешь, какую луну ты ты открыл и сколько поздравлений с восхищениями по поводу этого гениалього открытия ты получишь в ближайшее время.
Я даже боюсь предположить, что вся Вселенная ломанулась расшифровывать твой велосипед и звонить тебе, не говоря уже о стучать на тебя твоей "асе")
Denis_ (2007-09-21 17:54:00) [6]Я сделал это!!! правда позавчера ещё, но учёба, учёба...Вот зашифровал свои данные. Если кто расшифрует, звоните, или в аську стучите.
mzaJtCiX21OQx0a6mXSIpIeR1YmBuj4E20JDF+KX1XaEn2i33XC8xAgDJesJiiCD2W7k1CKKmAIkgiN-rzejrDJLmCtT-i0D2e7DW8oIYUpEh4MAYPxToTN+rzXWbe60ZvU0li2QLGqA7mWGo+p6q1FLrz-4oTBXszyjrz0D2l4BFi386DFGtCt9qVp3tHB9rzy
всё в одну строку.Без пробелов.Все буквы - латинские. :D
Cпасибо Anatoly Podgoretsky, Инс, Zeqfreed, {RASkov}. Очень помогли.
Zeqfreed (2007-09-18 20:56:00) [7]> Anatoly Podgoretsky © (18.09.07 20:44) [78]
Ну я-то понимаю что будет результатом, спасибо :)
Anatoly Podgoretsky (2007-09-18 20:44:00) [8]> Zeqfreed (18.09.2007 20:38:16) [76]
Я показал не только более оптимальный вариант, такой цели особо не было, а использование логических операторов AND и OR - результатом будет или $30 или $31 - коды символов '0' и '1'
Anatoly Podgoretsky (2007-09-18 20:42:00) [9]> Zeqfreed (18.09.2007 20:31:13) [73]
Для получения Base64 лучше воспользоваться готовыми функциями из ICS или INDY
Zeqfreed (2007-09-18 20:38:00) [10]> Denis_ © (18.09.07 20:25) [71]
Мой код демонстрирует лишь сам принцип. Как уже поправил Анатолий, есть более оптимальный вариант. А для Base64-кодирования получать строку из всех битов нет необходимости.
Zeqfreed (2007-09-18 20:36:00) [11]> Anatoly Podgoretsky © (18.09.07 20:14) [69]
Если задача получить строковое представление данных, то это, несомненно, самый оптимальный вариант :)
Anatoly Podgoretsky (2007-09-18 20:33:00) [12]> Denis_ (18.09.2007 20:17:10) [70]
Как же не написано, для установки в позицию бита 2 (счет с нуля) делаем 1 shl 2
Результат проверь на бумажке, тогда будет понятно как это работает. Но вроде бы это в статье графически проилюстрировано, но лучше самому убедиться, просто полезнее прочувствовать это когда выполняешь на бумажке, тогда это останется в голове навечно.
Zeqfreed (2007-09-18 20:31:00) [13]> : как лучше подставлять символы под 6 бит?
Лучше обратиться к RFC ( http://tools.ietf.org/html/rfc3548#section-3) и воспользоваться готовыми таблицами.
Алгоритм улучшить (по скоростным и морально-этическим соображениям) можно отказавшись от использования строковых буферов для обработки потока информации.
Anatoly Podgoretsky (2007-09-18 20:30:00) [14]> Denis_ (18.09.2007 20:17:10) [70]
Вместо кучи команд по преобразованию бита - одна единственная. Результат записывать в Result
Denis_ (2007-09-18 20:25:00) [15]
> Zeqfreed © (18.09.07 19:54) [67]
Кстати , что-то подобное Вашему коду я и имел в виду под
> 1) получить все биты ,записать их в строку '11000010010001.
> ....'
:)))
Denis_ (2007-09-18 20:17:00) [16]
> N and 1 or $30
А это что сделает? Анатолий, я просто не понял в Ваше й статье момент один
Получение позиции бита или его значения
1 shl N
В данном примере единица сдвигается влево на нужное количество разрядов, и в результате получаем двоичное значение, равное 2^N, где в установлен один единственный бит, соответствующий разряду числа. Этот прием может использоваться с переменной для расчета позиции во время выполнения или во время компиляции, во втором случае код генерироваться не будет, а компилятор просто рассчитает значение и подставит его в программу, не генерируя дополнительного кода. Это удобно для указания номера бита, не представляя его в виде десятичной или шестнадцатеричной константы. Но чаще бывает удобнее использовать именованные константы, поскольку они более информативны, примеры этого будут приведены в конце статьи.
как получить значение не написано...:) А я так надеялся на это:). Разьясните,а?
Anatoly Podgoretsky (2007-09-18 20:14:00) [17]> Zeqfreed (18.09.2007 19:54:07) [67]
N and 1 or $30
Denis_ (2007-09-18 20:12:00) [18]
> Zeqfreed © (18.09.07 19:54) [67]
Спасибо!
Я уж почти разобрался. А ещё : как лучше подставлять символы под 6 бит?
например
000001 соответствует 'A' и т.п.?
И вообще, как сделать [66] по человечески?:).(т.е. как ещё улучшить мой алгоритм?)
Zeqfreed (2007-09-18 19:54:00) [19]> Denis_ © (18.09.07 19:28) [66]
> 1) получить все биты ,записать их в строку '11000010010001.
> ....'
Лучше так не делать, а делать сразу по-человечески. Для затравки дам такой код:
function getBits(n : Byte) : String;
begin
Result := '';
repeat
if (n and $80 = $80) then
Result := Result + '1'
else
Result := Result + '0';
n := n shl 1;
until (n = 0);
while (length(Result) < 8) do
Result := Result + '0';
end;
В строчкеif (n and $80 = $80) thenмы проверяем, установлен ли старший бит.
В строчкеn := n shl 1;сдвигаем все биты на позицию влево. Старший бит пропадает, а шестой становится на его место. Так можно получить значения всех битов по очереди.
Denis_ (2007-09-18 19:28:00) [20]
> Начал читать
И сразу появились вопросы:((( Например, как получить значение бита по номеру?
В разделе "Получение позиции бита или его значения" непонятно как-то написано, нечего конкретного. 1 shl N даёт 2^N , а что дальше делать?
Хочу сделать перевод в Base64 так
1) получить все биты ,записать их в строку '11000010010001.....'
2) из этой строки брать по 6 бит и ставить им в соответствие какой-либо печатный символ
3)вывести эту строку.
если есть замечания, прошу!