Форум программистов, компьютерный форум, киберфорум
Криптография
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152

Взломать детский шифр

17.12.2018, 17:21. Показов 5884. Ответов 58

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, товарищи программеры. Перед тем, как приступить непосредственно к делу, мне хотелось бы поведать небольшую предысторию. Учусь в общеобразовательной школе в 11-м классе (физмат). Со мной есть еще несколько типов, с которыми мы по фанчику постепенно учим криптографию и называем друг друга нумерологами Мы решили составить свой шифр (на программной основе), который имел бы достаточную стойкость (на уровне 11 класса). (ДЛЯ ЕДКИХ - Я ПРЕКРАСНО ПОНИМАЮ, ЧТО НЕ НАДО ПРИДУМЫВАТЬ НИЧЕГО ИЗ ОБЛАСТИ КРИПТОГРАФИИ, ПОКА У ТЕБЯ НЕТ ХОТЯ БЫ ДОКТОРСКОЙ СТЕПЕНИ ПО МАТЕМАТИКЕ) Но суть в том, чтобы придумать самим, а не использовать уже готовые решения (что-то вроде развития мозгов). Это задание решили отдать мне, т.к. я представляю, как работает сеть Фейстеля. Что касается ключа, было решено, что он должен обладать небольшой длиной, но все же достаточной для того, чтобы малолетки его не перебрали. В качестве идеального варианта взяли 64 бита. Дальше я уже додумывал сам. Это должна быть функция, желательно вызываемая из dll-библиотеки. Шифровать она должна линейный массив байтов, т.к. любой тип данных можно представить массивом байтов. Выдавать для удобства тоже желательно массив байтов. Ключ, как ни странно тоже проще задавать массивом байтов. И для приличия ввел нечто напоминающее iv - массив байтов , равный размеру блока, который тупо ксорится с первым блоком, публикуется открыто и не дает возможности понять, что одним и тем же ключом 2 раза шифровался один и тот же открытый текст. Длина блока 8 байт (как у ключа), шифр целиком представляет собой сеть Фейстеля "в лоб", и с этими мыслями приступил к кодингу (на паскале). Получил следующий код:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
{PascalABC.NET}
library lib9;
interface
  function CryptographySC9(data, key, iv:array of byte; mode:boolean):array of byte;
implementation
function OpenText1to2(x:array of byte):array [,] of byte;
begin
  var a:integer := x.Length;
  var b:array [,] of byte := new byte [8, ((a div 8) + 1)];
  var c:integer := 0;
  try
    for var i:integer := 0 to (a div 8) do
      for var ci:integer := 0 to 7 do
      begin
        b[ci, i] := x[c];
        c := (c + 1);
      end;
  except on System.IndexOutOfRangeException do
    begin
    end;
  end;
  b[7, (a div 8)] := (8 - (a mod 8));
  Result := b;
end;
 
function OpenText2to1(x:array [,] of byte):array of byte;
begin
  var a:integer := x[7, (x.GetLength(1) - 1)];
  var b:array of byte := new byte [x.Length - a];
  a := 0;
  try
    for var i:integer := 0 to (x.GetLength(1) - 1) do
      for var ci:integer := 0 to 7 do
      begin
        b[a] := x[ci, i];
        a := (a + 1);
      end;
  except on System.IndexOutOfRangeException do
    begin
    end;
  end;
  Result := b;
end;
 
function Transform2to1(x:array [,] of byte):array of byte;
begin
  var a:array of byte := new byte [x.Length];
  var b:integer := 0;
  for var i:integer := 0 to (x.GetLength(1) - 1) do
    for var ci:integer := 0 to 7 do
    begin
      a[b] := x[ci, i];
      b := (b + 1);
    end;
  Result := a;
end;
 
function Transform1to2(x:array of byte):array [,] of byte;
begin
  var a:integer := (x.Length div 8);
  var b:array [,] of byte := new byte [8, a];
  var c:integer := 0;
  for var i:integer := 0 to (a - 1) do
    for var ci:integer := 0 to 7 do
    begin
      b[ci, i] := x[c];
      c := (c + 1);
    end;
  Result := b;
end;
 
procedure IVT(var x:array [,] of byte; iv:array of byte);
begin
  for var i:integer := 0 to 7 do x[i, 0] := (x[i, 0] xor iv[i]);
end;
 
function BigIntToByteArr(x:System.Numerics.BigInteger):array of byte;
begin
  var a:array of byte := x.ToByteArray();
  var b:array of byte := new byte [4];
  for var i:integer := 0 to 3 do b[i] := 0;
  try
    for var i:integer := 0 to 3 do b[i] := a[i];
  except on System.IndexOutOfRangeException do
    begin
    end;
  end;
  Result := b;
end;
 
function BigIntToUint32(x:System.Numerics.BigInteger):longword;
begin
  Result := System.BitConverter.ToUInt32(BigIntToByteArr(x), 0);
end;
 
function ToByteArr(x:longword):array of byte;
begin
  var a:System.Numerics.BigInteger := x;
  Result := BigIntToByteArr(a);
end;
 
function FFN1(x, y:longword):longword;
begin
  var a:System.Numerics.BigInteger := (x + 2 * y + 79813);
  Result := BigIntToUint32((a * a * a + a + 21379) mod 168248124743);
end;
 
function FFN2(x, y:longword):longword;
begin
  var a:System.Numerics.BigInteger := (x + 3 * y + 4159);
  Result := BigIntToUint32((a * a * a * a * a + a * a + 161233) mod 2939384514263);
end;
 
procedure FeistelNetwork(var x:array [,] of byte; RKey:array of longword; index:integer; first:boolean);
begin
  var a, b, g:longword;
  var s:array of byte := new byte [8];
  for var i:integer := 0 to 7 do s[i] := x[i, index];
  a := System.BitConverter.ToUInt32(s, 0);
  b := System.BitConverter.ToUInt32(s, 4);
  for var i:integer := 0 to 7 do
  begin
    if first then g := FFN1(a, RKey[i])
       else g := FFN2(a, RKey[i]);
    b := (g xor b);
    if (i <> 7) then Swap(a, b);
  end;
  var w:array of byte := ToByteArr(a);
  for var i:integer := 0 to 3 do x[i, index] := w[i];
  w := ToByteArr(b);
  for var i:integer := 4 to 7 do x[i, index] := w[i - 4];
end;
 
function FLW(x, y:longword):longword;
begin
  var a, b:System.Numerics.BigInteger;
  a := x;
  b := y;
  Result := BigIntToUint32(((a + 723319) * (b + 56311477) + 5119) mod 527845764689);
end;
 
function FLW2(x, y:longword):longword;
begin
  var a, b:System.Numerics.BigInteger;
  a := x;
  b := y;
  Result := BigIntToUint32(((a + 97522913) * (b + 26635429) + 426073) mod 3894575586631);
end;
 
function RoundKey(var key:array of byte; y:array of byte; usingReverse, first:boolean):array of longword;
begin
  var a:array of longword := new longword [2];
  for var i:integer := 0 to 7 do key[i] := (key[i] xor y[i]);
  a[0] := System.BitConverter.ToUInt32(key, 0);
  a[1] := System.BitConverter.ToUInt32(key, 4);
  var b:array of longword := new longword [8];
  for var i:integer := 0 to 3 do
    for var ci:integer := 0 to 1 do b[i * 2 + ci] := a[ci];
    
  for var i:integer := 0 to 7 do
    for var ci:integer := 0 to 7 do
      if first then b[ci] := FLW(b[ci], b[i])
          else b[ci] := FLW2(b[ci], b[i]);
  if usingReverse then System.Array.Reverse(b);
  Result := b;
end;
 
procedure BlockTransform(var x:array [,] of byte; var a, s:array of byte; mode1, mode2:boolean; i:integer);
begin
  var b:array of longword := RoundKey(a, s, (not mode1), mode2);
  for var ci:integer := 0 to 7 do s[ci] := x[ci, i];
  FeistelNetwork(x, b, i, mode2);
  for var ci:integer := 0 to 7 do s[ci] := (s[ci] xor x[ci, i]);
end;
 
procedure TransformCryptography(var x:array [,] of byte; Key:array of byte; mode, first:boolean);
begin
  var a, s:array of byte;
  a := new byte [8]; s := new byte [8];
  for var i:integer := 0 to 7 do
  begin
    a[i] := Key[i];
    s[i] := 0;
  end;
  if first then for var i:integer := 0 to (x.GetLength(1) - 1) do
      BlockTransform(x, a, s, mode, true, i)
    else for var i:integer := (x.GetLength(1) - 1) downto 0 do
      BlockTransform(x, a, s, mode, false, i);
end;
 
function CryptographySC9(data, key, iv:array of byte; mode:boolean):array of byte;
begin
  var b:array of byte;
  if mode then
   begin
     var a:array [,] of byte := OpenText1to2(data);
     IVT(a, iv);
     TransformCryptography(a, key, true, true);
     TransformCryptography(a, key, true, false);
     b := Transform2to1(a);
   end
  else
   begin
     var a:array [,] of byte := Transform1to2(data);
     TransformCryptography(a, key, false, false);
     TransformCryptography(a, key, false, true);
     IVT(a, iv);
     b := OpenText2to1(a);
   end;
   Result := b;
end;
 
end.
Обладает следующими характеристиками:
- скорость на моем пентиуме порядка 18 Кб/с в обе стороны, что позволяет шифровать текст адекватного размера, но и фотку сожрать тоже может, однако придется подождать
- время обработки данных как функция от длины массива возрастает +- линейно, как и должно быть

Для самой непосредственной реализации шифрования начеркал такой код (особо не заморачивался):

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{$reference lib9.dll}
 
begin
  var a:string := '';
  Write('file > ');
  Readln(a);
  var b:array of byte := System.IO.File.ReadAllBytes(a);
  Writeln('iv:');
  var c:array of byte := new byte [8];
  for var i:integer := 0 to 7 do
  begin
    Write(i.ToString() + ' > ');
    c[i] := 0;
    Readln(c[i]);
  end;
  Writeln();
  var d:array of byte := new byte [8];
  Writeln('key:');
  for var i:integer := 0 to 7 do
  begin
    Write(i.ToString() + ' > ');
    d[i] := 0;
    Readln(d[i]);
  end;
  var g:boolean := false;
  Write('mode > ');
  Readln(g);
  a := '';
  Write('save result > ');
  Readln(a);
  System.IO.File.WriteAllBytes(a, lib9.lib9.CryptographySC9(b, d, c, g));
end.
Моих знаний не хватит ни на один нормальный вид криптоанализа, поэтому смог выполнить лишь ряд элементарных проверок, называемых "тест нулей" - массив, состоящий из одних нулей зашифровал одними нулями, и у полученного шифротекста имелись следующие свойства:

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

Этот шифр приняли. Исходник служит одновременно релизом и описанием. Если релиз написан нерационально, прошу не пинать, т.к. писал с нуля и не исключаю, что что-то сделал криво (багов там вроде нет). Пока никто из наших его не взломал. Лично я тоже не представляю, как это можно сделать на практике, и пишу это все для того, чтобы узнать, что по этому поводу скажут прошаренные бородатые дядьки-программеры. Для того, чтобы не вызывать каких-то абстрактных рассуждений, предлагаю дешифровать конкретный файл (зашифрованная фотография .jpg - файл binarnik.bin - прикрепляю в архиве вместе со всеми исходниками). Если кому-то надо, там и SHA256 для расшифрованного файла. iv тоже прилагается. И на всякий случай, фотки в интернете нету - она отснята моим фотоаппаратом и после дешифровки, разумеется, становится общественным достоянием.

На адекватные вопросы обязательно отвечу. Всем заранее спасибо.
Вложения
Тип файла: zip numerologiya.zip (1.44 Мб, 5 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2018, 17:21
Ответы с готовыми решениями:

Получится взломать такой шифр?
Всем добрый день. Для личный целей выставляю в открытый доступ из интернета базу данных с личными данными. Не банковские операции, но...

Взломать шифр двойной перестановки
Здравствуйте. Есть криптограмма, которую необходимо взломать: ИДДИР ПООДИ ЛИАЕР ВЛПЗК ВЖЬНО МБЦЕЛ ТХМАР АЫСРЫ В результате...

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

58
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
21.12.2018, 18:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от On18 Посмотреть сообщение
Это глупость.
А по-моему совсем наоборот. Я уже писал:
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Не знаю, как вы, но лично я считаю, что алгоритм взломан, когда есть тип, который говорит:
"Шифр - дерьмо! Вот есть шифротекст. Мы делает это, потом это, потом это, затем часок-другой помучаем процессор Core i7 вычислениями.... и вуаля! У нас открытый текст."
А когда исходят речи в духе:
"Шифр - дерьмо! Я разработал гениальный метод взлома, который позволяет получить открытый текст, перебрав не 2^256 , а всего лишь 2^255 вариантов..... "
на взлом это не очень тянет.
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
21.12.2018, 18:55
Еще раз - почитайте основы.

Ваш этот алгоритм не стойкий по всем признакам.

Расшифровывать 1 файл никому это не нужно, потому что
1. в файле картинка, сжатая архиватором.
2. для 8-16 хз сколько там у вас раундов - 1 Мб текста - этого мало.
3. нужен подбор пар ОТ-ШТ

и конечно, адекватный алгоритм который можно нормально(!) реализовать без умножения целых числе порядка 10^60 на другом язые программирования.

И главное - заинтересованной.

Вам нечем заняться?
Вот тема - общественно полезная:
Шифр телеграмм 1918, Екатеринбург
Вот этим стоит заниматься.

(если будете заниматься шифром 1918 - пишите в той теме)
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
22.12.2018, 17:00  [ТС]
Цитата Сообщение от On18 Посмотреть сообщение
Вам нечем заняться?
Вот тема - общественно полезная:
Шифр телеграмм 1918, Екатеринбург
Вот этим стоит заниматься.
(если будете заниматься шифром 1918 - пишите в той теме)
Может и действительно что-нибудь попробую на досуге.

Добавлено через 5 минут
Цитата Сообщение от On18 Посмотреть сообщение
в файле картинка, сжатая архиватором.
Разве где-то упоминалось про то, что она сжата архиватором? Разве что разрешение картинки перед шифрованием в PaintNET уменьшил чтоб весила не так много (фотоаппарат 20 мегасенселей), но это из совсем иной области.

Добавлено через 3 минуты
Цитата Сообщение от On18 Посмотреть сообщение
на другом язые программирования.
Я понимаю, что C++ круче, но чем вам не нравится PascalABC.NET ? Вполне нормальный язык.

Добавлено через 2 часа 10 минут

ИТАК, ГОСПОДА, ВНИМАНИЕ, ВНИМАНИЕ!!!


Пришло время подводить итоги данной темы.
На форум был залит исходный код алгоритма шифрования на паскале. Также был прикреплен файл - зашифрованная фотография, которую нужно было дешифровать:

Цитата Сообщение от NSIFS211 Посмотреть сообщение
предлагаю дешифровать конкретный файл (зашифрованная фотография .jpg - файл binarnik.bin - прикрепляю в архиве вместе со всеми исходниками)
Как и ожидалось, криптоалгоритм сразу был подвергнут жесткой критике:

Цитата Сообщение от On18 Посмотреть сообщение
в предложенном алгоритме нету и зачатка полезных идей
Цитата Сообщение от On18 Посмотреть сообщение
шифр улучшению не подлежит в принципе.
Цитата Сообщение от Ethereal Посмотреть сообщение
Анекдот про неуловимого Джо слышал ? Так вот твой алгоритм не взломан ровно в той степени в какой Джо неуловим.
Цитата Сообщение от On18 Посмотреть сообщение
Этого уже достаточно что бы считать алгоритм никуда не годным.


Однако предоставленный файл так и не был дешифрован. Тогда были предприняты попытки еще раз донести суть задачи:

Цитата Сообщение от NSIFS211 Посмотреть сообщение
ПРОШУ ПЕРЕБРАТЬ БИНАРНИК ИЗ АРХИВА
Цитата Сообщение от NSIFS211 Посмотреть сообщение
дешифровать этот бинарник никто не собирается ?
Цитата Сообщение от NSIFS211 Посмотреть сообщение
И хотя не могу поверить, что вы не поняли, что мне нужно, все равно пишу еще раз:
ДЛЯ ТЕХ, КТО В ТАНКЕ:
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Что еще нужно?
ДЕШИФРОВАТЬ БИНАРНИК ИЗ АРХИВА!!!!!!
В прочем, суть задачи донести удалось. Ответы на предложение о дешифровке были следующими.
Ethereal ответил кратко и ясно:

Цитата Сообщение от Ethereal Посмотреть сообщение
никто ничего делать не будет.
On18 был вряд ли менее лаконичен:

Цитата Сообщение от On18 Посмотреть сообщение
Это глупость.
Цитата Сообщение от On18 Посмотреть сообщение
никому это не нужно

Итак, фотография из архива так и не дешифрована. Понятно, что если за шифр возьмутся спецы КГБ/ФСБ/МВД/ГРУ/ЦРУ/АНБ/ТЕПЛОСЕТЬ/КУ-КЛУКС-КЛАН/ШТАЗИ/ГОРЛИФТ/МИ-6/ВОДОКАНАЛ/СС/ЖЭК то шифр вскроют весьма и весьма быстро. Честно говоря, я считал, что этот алгоритм окажется гораздо слабее и какому-то деду с этого форума не составит труда найти в нем фатальную уязвимость, приводящую к его полному краху, а затем без труда дешифровать предоставленный электронный файл. Но раз так... Ключ от шифра выкладывать не стоит бумажку с ним надо будет сжечь/растворить в кислоте Пусть эта фотография не будет дешифрована. Для малолеток этот шифр невскрываем в течение долгих лет, а если кто-то сильно захочет - дешифрует. Обязательно дешифрует. Когда придет время...
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
22.12.2018, 19:32
Цитата Сообщение от NSIFS211 Посмотреть сообщение
и какому-то деду с этого форума не составит труда
Только дитя, что сидит на шее родителей, может позволить себе роскошь выкидывать время сутками на никому не нужную херню. Деды позволить себе такое не могут, им надо семью кормить. И только полный бездельник может думать, что существует что-то, что "не составляет труда".
1
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
22.12.2018, 19:39
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Разве где-то упоминалось про то, что она сжата архиватором? Разве что разрешение картинки перед шифрованием в PaintNET уменьшил чтоб весила не так много (фотоаппарат 20 мегасенселей), но это из совсем иной области.
Цитата Сообщение от NSIFS211 Посмотреть сообщение
предлагаю дешифровать конкретный файл (зашифрованная фотография .jpg
Почитайте что такое
https://ru.wikipedia.org/wiki/JPEG
Алгоримт использует сжатие данных, по сути то же что используют архиваторы.

Цитата Сообщение от NSIFS211 Посмотреть сообщение
Я понимаю, что C++ круче, но чем вам не нравится PascalABC.NET ? Вполне нормальный язык.
Более менее адекватный шифр не использует умножений чисел с 60 разрядами, чтоб потом пролучить из них 10 разрядов.
Это по меньшей мене глупо, неудобно и медленно.
Что б проанализировать алгоритм придется подключать библиотеки работы с такими числами, "гонять" процессор с кучей не нужных вычислений.

Смысл?




Допустим что ключ и текст состоит только из чисел от 0 до 9999. Тоесть возьмем только 4 знака.

Допустим расширенный ключ это случайные числа 1461, 1551, 2788, 1856, 5654, 9848, 5679, 1632.

Теперь допустим что основная функция для сети Фейстеля :
Pascal
1
2
3
4
5
function FFN1(x, y:longword):longword;
var a:longword;
begin
  Result := (x * 977  + y + 1411) mod 9973;
end;
Для первого раунда
Pascal
1
2
3
  /// 1
  L1:=L;
  R1:=R xor FFN1(L1, 1461);
и т.д. 8 раундов.

Теперь допустим мы шифруем текст от 0000 0000 до 0099 0099 (правый и левый блок соответственно)

Всего будет 10000 вариантов.

И что мы получим:

Из 20 тыс блоков, практически 9 тыс повторений:
например

От №1 до

// №9346
Повтор LR №9640 9869 = 1072 1072
96 38 = 1072 15737
98 67 = 6555 1072

// №9347
Повтор RR №9672 9707 = 8193 8193
96 70 = 3529 8193
97 5 = 4837 8193

// №9348
Повтор RR №9726 9839 = 15140 15140
97 24 = 9040 15140
98 37 = 3521 15140

// №9349
Повтор LL №9847 9856 = 10312 10312
98 45 = 10312 2960
98 54 = 10312 5072

// №9350
Повтор LR №9911 9948 = 2247 2247
99 9 = 2247 15821
99 46 = 6696 2247

// №9351
Повтор LR №9950 9953 = 7026 7026
99 48 = 7026 11242
99 51 = 6442 7026

Если нечем заняться, и есть под рукой вычислительные мощности - можете то же самое сделать для чисел от 000000 до 999999, думаю получите тот же результат.

Если не убедит и это, отключайте свою майнинг ферму, все равно курс биткоина ниже плинтуса, и прогоните числа от 0000000 до 9999999. И получите тот же результат.


А в целом, если интересуетесь числами, то действительно займитесь общественно полезным делом
Шифр телеграмм 1918, Екатеринбург
В 1918 году не было комп-ра, и там хоть есть шанс сделать что то полезное.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
23.12.2018, 16:33  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
только полный бездельник может думать, что существует что-то, что "не составляет труда".
Как насчет того, чтобы разложить на множители число 15 ?

Добавлено через 1 час 2 минуты
Цитата Сообщение от On18 Посмотреть сообщение
Более менее адекватный шифр не использует умножений чисел с 60 разрядами, чтоб потом пролучить из них 10 разрядов.
Это по меньшей мене глупо, неудобно и медленно.
Как есть

Цитата Сообщение от On18 Посмотреть сообщение
Из 20 тыс блоков, практически 9 тыс повторений
Понятное дело, можно x уменьшить на 1, а y увеличить на 977, и будет то же самое.
В принципе, от навязчивых повторений можно избавиться, если например слепить такое:
Pascal
1
2
3
4
5
6
7
8
9
10
function FFN1(x, y:longword):longword;
begin
  var a, b, c, d:System.Numerics.BigInteger;
  a := (x + 79813);
  b := ((a * a * a + a + 21379) mod 168248124743);
  c := (y + 4159);
  d := ((c * c * c * c * c + c * c + 161233) mod 2939384514263);
  
  Result := (BigIntToUint32(b) xor BigIntToUint32(d));
end;
Проверки с перебором ключа и текста, описанные вами ранее, эта функция проходит на ура - программа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function BigIntToByteArr(x:System.Numerics.BigInteger):array of byte;
begin
  var a:array of byte := x.ToByteArray();
  var b:array of byte := new byte [4];
  for var i:integer := 0 to 3 do b[i] := 0;
  try
    for var i:integer := 0 to 3 do b[i] := a[i];
  except on System.IndexOutOfRangeException do
    begin
    end;
  end;
  Result := b;
end;
 
function BigIntToUint32(x:System.Numerics.BigInteger):longword;
begin
  Result := System.BitConverter.ToUInt32(BigIntToByteArr(x), 0);
end;
 
function FFN1(x, y:longword):longword;
begin
  var a, b, c, d:System.Numerics.BigInteger;
  a := (x + 79813);
  b := ((a * a * a + a + 21379) mod 168248124743);
  c := (y + 4159);
  d := ((c * c * c * c * c + c * c + 161233) mod 2939384514263);
  
  Result := (BigIntToUint32(b) xor BigIntToUint32(d));
end;
 
begin
  var a:array of longword := new longword [10000];
  for var i:integer := 0 to 99 do
    for var ci:integer := 0 to 99 do
    a[i * 100 + ci] := FFN1(i, ci);
   
   var b:integer := 0;
   for var i:integer := 0 to 9999 do
     for var ci:integer := 0 to 9999 do
     begin
       if (i = ci) then continue;
       if (a[i] = a[ci]) then b := (b + 1);
     end;
     Writeln('повторений: ', b);
     Readln();
end.
в результате выполнения выдает 0 . Только мне кажется, это не панацея

Добавлено через 4 минуты
Цитата Сообщение от On18 Посмотреть сообщение
А в целом, если интересуетесь числами, то действительно займитесь общественно полезным делом
Шифр телеграмм 1918, Екатеринбург
В 1918 году не было комп-ра, и там хоть есть шанс сделать что то полезное.
Пожалуй, действительно стоит хотя бы попробовать. Хотя шансы на успех исчезающе малы...

Добавлено через 2 минуты
On18, кстати, какую литературу по криптографии советуете почитать? Для систематического изучения?
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
23.12.2018, 17:34
Цитата Сообщение от NSIFS211 Посмотреть сообщение
On18, кстати, какую литературу по криптографии советуете почитать? Для систематического изучения?
https://postnauka.ru/books/46046

Цитата Сообщение от NSIFS211 Посмотреть сообщение
В принципе, от навязчивых повторений можно избавиться, если например слепить такое:
function FFN1(x, y:longword):longword;
begin
* var a, b, c, d:System.Numerics.BigInteger;
* a := (x + 79813);
* b := ((a * a * a + a + 21379) mod 168248124743);
* c := (y + 4159);
* d := ((c * c * c * c * c + c * c + 161233) mod 2939384514263);
Result := (BigIntToUint32(b) xor BigIntToUint32(d));
end;
Проверки с перебором ключа и текста, описанные вами ранее, эта функция проходит на ура - программа
Ну опять же, взяли 2 ГПСЧ и ксорите их выход.
Генераторы не криптостойкие.


Опять возведение в 5 степень чисел с 12 знаками. Зачем? Получить число с 60 знаками? И потом отбросить 48?
Зачем?
Что бы отбить любое желание анализировать алгоритм?

Вот это 79813 в а*а*а превращается уже в 508417986020797.


Добавлено через 15 минут
Цитата Сообщение от On18 Посмотреть сообщение
Допустим что ключ и текст состоит только из чисел от 0 до 9999. Тоесть возьмем только 4 знака.
Допустим расширенный ключ это случайные числа 1461, 1551, 2788, 1856, 5654, 9848, 5679, 1632.
Теперь допустим что основная функция для сети Фейстеля :
подставил новую функцию

Pascal
1
2
3
4
  
  a := (x * 977 + 1411) mod 9973;
  b := (y * 973 + 1811) mod 9943;
  Result:= a xor b;
Все равно куча повторений:
// №9174
Повтор RR №9789 9797 = 541 541
97 87 = 15571 541
97 95 = 14114 541

// №9175
Повтор LR №9791 9845 = 1801 1801
97 89 = 1801 1020
98 43 = 8799 1801

// №9176
Повтор LL №9798 9898 = 1039 1039
97 96 = 1039 117
98 96 = 1039 12275

// №9177
Повтор LR №9891 9913 = 8252 8252
98 89 = 8252 9527
99 11 = 14234 8252

// №9178
Повтор LL №9897 9910 = 12120 12120
98 95 = 12120 15204
99 8 = 12120 9719

// №9179
Повтор RR №9903 9939 = 1334 1334
99 1 = 9965 1334
99 37 = 9993 1334

// №9180
Повтор LR №9917 9950 = 16191 16191
99 15 = 16191 8798
99 48 = 12513 16191

// №9181
Повтор RR №9977 9996 = 1024 1024
99 75 = 14408 1024
99 94 = 11764 1024
Не годится.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
23.12.2018, 20:59  [ТС]
Цитата Сообщение от On18 Посмотреть сообщение
https://postnauka.ru/books/46046
благодарю


Цитата Сообщение от On18 Посмотреть сообщение
Не годится.
Какая досада...

Цитата Сообщение от On18 Посмотреть сообщение
подставил новую функцию
PascalВыделить код
1
2
3
4
a := (x * 977 + 1411) mod 9973;
* b := (y * 973 + 1811) mod 9943;
* Result:= a xor b;

А разве это по своей сути эквивалентно? Ведь в коде
Цитата Сообщение от NSIFS211 Посмотреть сообщение
function FFN1(x, y:longword):longword;
begin
* var a, b, c, d:System.Numerics.BigInteger;
* a := (x + 79813);
* b := ((a * a * a + a + 21379) mod 168248124743);
* c := (y + 4159);
* d := ((c * c * c * c * c + c * c + 161233) mod 2939384514263);
Result := (BigIntToUint32(b) xor BigIntToUint32(d));
end;
функциональная зависимость от x и y будет по идее более сложной - ваш код
Цитата Сообщение от On18 Посмотреть сообщение
a := (x * 977 + 1411) mod 9973;
* b := (y * 973 + 1811) mod 9943;
* Result:= a xor b;
по сути линейный, а там все-таки степенная функция.
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
24.12.2018, 12:50
Цитата Сообщение от NSIFS211 Посмотреть сообщение
функциональная зависимость от x и y будет по идее более сложной
Ок, новая функция:
a := (x * x * x * x * x * 631 + x * x * x * x * 313 + x * x * x * x * 131 + x * x * x * 757 + x * 853 + 1483) mod 9973;
b := (y * y * y * y * y * 269 + y * y * y * y * 379 + y * y * y * y * 467 + y * y * y * 569 + y * 659 + 3559) mod 9967;
Result:= a xor b;
Ключи те же.

Результат
// №9499
Повтор LL №9685 9883 = 13384 13384
96 83 = 13384 1048
98 81 = 13384 6797

// №9500
Повтор LR №9699 9924 = 13845 13845
96 97 = 13845 10431
99 22 = 16148 13845

// №9501
Повтор LR №9708 9955 = 14325 14325
97 6 = 14325 276
99 53 = 12297 14325

// №9502
Повтор LR №9713 9839 = 107 107
97 11 = 107 7970
98 37 = 1174 107

// №9503
Повтор RR №9767 9899 = 4187 4187
97 65 = 5155 4187
98 97 = 16205 4187

// №9504
Повтор RR №9796 9810 = 12620 12620
97 94 = 4040 12620
98 8 = 7128 12620

// №9505
Повтор LL №9820 9919 = 4037 4037
98 18 = 4037 2452
99 17 = 4037 8266

// №9506
Повтор LR №9826 9887 = 10903 10903
98 24 = 10903 10227
98 85 = 5033 10903

// №9507
Повтор LL №9838 9947 = 10467 10467
98 36 = 10467 7795
99 45 = 10467 11344

// №9508
Повтор LR №9906 9988 = 14734 14734
99 4 = 14734 7286
99 86 = 11644 14734

// №9509
Повтор LR №9943 9974 = 573 573
99 41 = 573 3312
99 72 = 11064 573
Даже больше повторений из 20 тыс ~ 9500.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
24.12.2018, 13:44  [ТС]
Цитата Сообщение от On18 Посмотреть сообщение
Даже больше повторений из 20 тыс ~ 9500.


А можете показать пример нормальной функции ?
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
24.12.2018, 13:47
Цитата Сообщение от NSIFS211 Посмотреть сообщение
А можете показать пример нормальной функции ?
Конечно, например
https://ru.wikipedia.org/wiki/... uncFFF.PNG
https://ru.wikipedia.org/wiki/... nction.svg
https://ru.wikipedia.org/wiki/KASUMI

И т.д.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
24.12.2018, 14:16  [ТС]
Цитата Сообщение от On18 Посмотреть сообщение
Мощные дядьки это придумали...

Добавлено через 6 минут
Кстати:
Pascal
1
2
3
a := (x * x * x * x * x * 631 + x * x * x * x * 313 + x * x * x * x * 131 + x * x * x * 757 + x * 853 + 1483) mod 9973;
b := (y * y * y * y * y * 269 + y * y * y * y * 379 + y * y * y * y * 467 + y * y * y * 569 + y * 659 + 3559) mod 9967;
Result:= a xor b;
Простите, зачем
Pascal
1
x * x * x * x * 313 + x * x * x * x * 131
ведь это же
Pascal
1
x * x * x * x * (313 + 131)
с y то же самое
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
24.12.2018, 14:23
А, там должно быть было х5+х4+х3+х2+х+с.
x * x * x * x * x * 631 + x * x * x * x * 313 + x * x * x * 131 + x * x * 757 + x * 853 + 1483
Не важно, все равно не улучшает результат.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
24.12.2018, 14:31  [ТС]
Цитата Сообщение от On18 Посмотреть сообщение
Не важно, все равно не улучшает результат.
ну и хрен с ним.

Добавлено через 3 минуты
А можете прикинуть хотя бы примерно, насколько сложно обратить 1 блок в моем самом первом коде?
Можно будет утверждать
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Для малолеток этот шифр невскрываем в течение долгих лет
?
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,912
24.12.2018, 16:05
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Итак, фотография из архива так и не дешифрована.
Берём случайный набор байт. Шифруем шифром простой замены. Выкладываем на форум. Естественно, никто не может расшифровать. Заметьте, не "не хочет", а именно не может. Никто в мире не сможет расшифровать.
Вывод: шифр простой замены - это супер-пупер криптостойкий алгоритм шифрования.
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
24.12.2018, 16:09  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Берём случайный набор байт.
Там не случайный набор байт
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,912
24.12.2018, 16:11
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Там не случайный набор байт
Можете назвать существенные отличия?
0
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
24.12.2018, 16:23  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Можете назвать существенные отличия?
Если открыть jpg-шник в кодировке hexadecimal, то в начале целая куча байтов будет заполнена одними нулями.
0
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
24.12.2018, 16:39
Цитата Сообщение от NSIFS211 Посмотреть сообщение
А можете прикинуть хотя бы примерно, насколько сложно обратить 1 блок в моем самом первом коде?
Трудно сказать. Пожалуй около 10-100 тыс пар ОТ-ШТ.
Но, думаю, если покопаться, можно найти более быстрый способ. Но этим нужно заниматься, составлять уравнения, находить закономерности и т.д. Вопрос только зачем?

Используйте https://ru.wikipedia.org/wiki/RC4
предельно простой в реализации и понимании. Довольно современный алгоритм для защиты от школьников.
Есть его куча модификаций, делайте свою. Не вопрос.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,912
24.12.2018, 17:07
Цитата Сообщение от NSIFS211 Посмотреть сообщение
Если открыть jpg-шник в кодировке hexadecimal, то в начале целая куча байтов будет заполнена одними нулями.
В общем случае нет нулей в начале. Специально сейчас скачал первую фотографию, которую гугл выдал, и сохранил её в формате jpg.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2018, 17:07

Составить программу шифрования и расшифровки в Delphi по соответствующему заданию: шифр Атбаш + шифр Цезеря
Составить программу шифрования и расшифровки в Delphi по соответствующему заданию: шифр Атбаш + шифр Цезеря (одновременно использовать два...

Шифр Полибия. Программа выводит шифр в разной последовательности.
Реализую шифр полибия для русского алфавита. Возникла проблема при выводе шифра. Например при вводе исходного сообщения &quot;ВОВА&quot;...

Расшифровать числовой шифр (предположительно шифр простой замены)
Доброго времени суток! Не могу расшифровать такое вот послание: 3632623163626461393766653039373630393861303036663338353761626662 ...

Детский сад
Наши дети такие милые и хорошие! Но приходит время, и им нужно кроме питания и ухода давать какое-никакое но первоначальное дошкольное...

Детский вопрос:
Пожалуйста, подскажите как сделать следующее: Текущий курс доллара пользователь вбивает сразу после загрузки базы. Курс хранится в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru