1

Тема: Шифр PJWJ

Вітаю всіх дописувачів форуму.

Літа минають, уже не молодий, та хочу щось залишити після себе для людей та своєї країни.
А тому вирішив опублікувати свою розробку. Довго думав чи це варто, чи це потрібно буде.
Та якщо так думати – то й нашу науку рухати вперед буде нікому.
На патент не претендую, мені це непотрібно. Можете використовувати, як бажаєте.
А можливо надихне на думки і хтось продовжить її.

Розробка - це шифр для шифрування повідомлень. Його придумав на початку 00-х років,
для шифрування тексту і обміну між двома адресатами – до прикладу: посольствами, військовими групами і таке інше.

Шифр PJWJ.

Шифрування:

На вході текст з малих літер українського алфавіту та розділові знаки ( 46 різних знаків)
46 букв – це алфавіт 33 літери (а,б,в,г,…, ю, я), та розділові і допоміжні знаки (« », «.»,…, «?»).

p1, p2, p3, …, pi, …, pn.

Де n – кількість букв та розділових знаків у тексті. Тобто «довжина» тексту.
(Максимальна довжина блоку відкритого тексту 65536 байт)

P-операція.

На вході

p1, p2, p3, …, pi, …, pn.

Р-оперція - це омофонічний шифр підстановки. На вході алфавіт 46 букв,
на виході алфавіт 256 символів ( 8 біт на символ). Ключем - є таблиця підстановки.
Декілька різних знаків можуть шифрувати 1 літеру. Знаки беруться випадковим чином із групи для літери.
Кількість знаків для літери залежить
від її частоти у текстах. (це сталі значення, по середньому значенню. Наприклад,
для літери «а» - 8 різних знаків, для літери «б» - 2 знаки, і т.д.)

На виході

y1, y2, y3, …, yi, …, yn.

256 символів – це 8 бітне кодування( 00000000, 00000001, …, 11111111).
Дана операція робить повторюваність знаків більше рівномірним.
Потім

x1 = y1, …, xn = yn.

J-операція 1.

На вході

x1, x2, x3, …, xi, …, xn.

Перестановка знаків.
За допомогою формули

Nj = f(xi+1, xi+2, xi+3, xi+4, …, xi+8).

Де f – одностороння функція яка повертає номер Nj від 0 до 2^16 (65 536).
Ключем параметри функції.
На вході f – 8*8=64 біт, на виході 2*8=16 біт.
Переставляємо символи на позиції ni та nj місцями.
Повторюємо для всіх i від 1 до n-8.

На виході

y1, y2, y3, …, yi, …, yn.

Дана операція виконує перестановку знаків.

W-операції 1-16.

На вході

x1, x2, x3, …, xi, …, xn.

Розділяємо кожен символ на два по 4 біти:

x11, x12, x21, x22, x31, x32, …, xi1, xi2, …, xn1, xn2.

Записуємо спочатку парні, потім непарні символи:

x11, x21, x31, …, xi1, …, xn1,    x12, x22, x32, …, xi2, …, xn2.

Проста підстановка за допомогою 16 таблиць 16х16 знаків 2х4 біт = 256 байт.
Ключем є 16 таблиць підстановки для кожного раунду.
Для кожного раунду своя таблиця.
З допомогою S-box шифруємо по 2 символи, отримуємо

y11, y12, y21, y22, y31, y32, …, yi1, yi2, …, yn1, yn2.

Записуємо yi1, yi2 на вхід. Тобто xi1 = yi1, xi2 = yi2 і т.д.
Повторюємо 16 раз.

На виході

y1, y2, y3, …, yi, …, yn.

Дана операція забезпечує вплив одного знаку на всі інші знаки.
Максимальна довжина блоку 65 536 байт.

J-операція 2.

Повторюємо J-операцію.

XOR-операція.

На вході

x1, x2, x3, …, xi, …, xn.

Виконуємо XOR з знаками таблиці 256 різних випадкових символів.
Ключем є таблиця з 256 випадкових знаків.

yi = xi xor s[ i mod 256 ].

Повторюємо до n.

На виході

y1, y2, y3, …, yi, …, yn.

Результат

y1, y2, y3, …, yi, …, yn.

Необхідна для приховування знаків J-операції.

Розшифрування:

Виконуємо операції в оберненому порядку
Спочатку XOR,
далі J-операція 2,
W- операція 1-16,
J-операція 1,
P-операція.


Основа цього шифру W-операція.
Для прикладу візьмемо текст
« т е к с т »
Кодуємо його по 2 символи ( 1т = (1/2т) + (1/2т) т.д.):

« [(1/2т) (1/2т)] [(1/2е) (1/2е)] [(1/2к) (1/2к)] [(1/2с) (1/2с)] [(1/2т) (1/2т)] »

Записуємо спочатку парні, потім непарні символи:

« [(1/2т) (1/2е)] [(1/2к) (1/2с)] [(1/2т) (1/2т)] [(1/2е) (1/2к)] [(1/2с) (1/2т)] »

Далі, роста підстановка за допомогою 16 таблиць 16х16 знаків 2х4 біт = 256 байт:

 « [(1/4т 1/4е) (1/4т 1/4е)] [(1/4к  1/4с) (1/4к 1/4с)] [(1/4т 1/4т) (1/4т 1/4т)] [(1/4е 1/4к) (1/4е 1/4к)] [(1/4с 1/4т) (1/4с 1/4т)] »

Записуємо спочатку парні, потім непарні символи:

« [(1/4т 1/4е) (1/4к  1/4с)] [(1/4т 1/4т) (1/4е 1/4к)] [(1/4с 1/4т) (1/4т 1/4е)] [(1/4к 1/4с) (1/4т 1/4т)] [(1/4е 1/4к) (1/4с 1/4т)] »

Далі, роста підстановка за допомогою 16 таблиць 16х16 знаків 2х4 біт = 256 байт:

« [(1/8т 1/8е 1/8к  1/8с) (1/8т 1/8е 1/8к  1/8с)] [(1/8т 1/8т 1/8е 1/8к) (1/8т 1/8т 1/8е 1/8к)] [(1/8с 1/8т 1/8т 1/8е) (1/8с 1/8т 1/8т 1/8е)] [(1/8к 1/8с 1/8т 1/8т) (1/8к 1/8с 1/8т 1/8т)] [(1/8е 1/8к 1/8с 1/8т) (1/8е 1/8к 1/8с 1/8т)] »
« [(1/8текс) (1/8текс)] [(1/8ттек) (1/8ттек)] [(1/8стте) (1/8стте)] [(1/8кстт) (1/8кстт)] [(1/8екст) (1/8екст)] »

Записуємо спочатку парні, потім непарні символи:

« [(1/8текс) (1/8ттек)] [(1/8стте) (1/8кстт)] [(1/8екст) (1/8текс)] [(1/8ттек) (1/8стте)] [(1/8кстт) (1/8екст)] »

Далі, проста підстановка за допомогою 16 таблиць 16х16 знаків 2х4 біт = 256 байт:

« [(1/16текс 1/16ттек) (1/16текс 1/16ттек)] [(1/16стте 1/16кстт) (1/16стте 1/16кстт)] [(1/16екст 1/16текс) (1/16екст 1/16текс)] [(1/16ттек 1/16стте) (1/16ттек 1/16стте)] [(1/16кстт 1/16екст) (1/16кстт 1/16екст)] »
« [(1/16тексттек) (1/16тексттек)] [(1/16сттекстт) (1/16сттекстт)] [(1/16ексттекс) (1/16ексттекс)] [(1/16ттекстте) (1/16ттекстте)] [(1/16ксттекст) (1/16ксттекст)] »

Таким чином, кожен знак шифр тексту не означає окрему літеру відкритого тексту,
а означає 1/4 частину всього тексту.
Отже,

« [1т] [1е] [1к] [1с] [1т] » = 
« [(1/8тексттек)] [(1/8сттекстт)] [(1/8ексттекс)] [(1/8ттекстте)] [(1/8ксттекст)] » =
« [(1/4текст)] [(1/4текст)] [(1/4текст)] [(1/4текст)] [(1/4текст)] »

Найменша зміна вхідного початкового тексту приведе до повної зміни шифрованого тексту.

Подякували: Chemist-i1

2

Re: Шифр PJWJ

Ключем - є таблиця підстановки.

Чи можна тут детальніше?

Я очікував, що спершу генерується пара публічний/приватний ключ, яким шифрується текст плюс таблиця підстановки...

Подякували: DavComm1

3

Re: Шифр PJWJ

1. Ця схема для симетричного шифрування - тобто все одно знадобиться надійний канал для ключів.
2. Ключ великий і складний, містить таблицю підстановки, функцію f для J-операції(?), S-блоки з W-операції, XOR-стрічка.
Причому на функцію f та S-box (та й на стрічку) накладаються досить суворі обмеження - яким чином вони можуть бути ключами за таких обмежень? Як з довільної комбінації бітів отримати валідний ключ?
3. Можете детальніше розповісти, як саме виконується обернена J-операція? Можете показати на 16 байтах і нескладній функції, наприклад, 2-байтовому побітовому XOR? Ось я накидав приблизний код:

 def j_operation(x):
    y = x[:]
    for i in range(len(x)-8):
        # обчислюємо nj
        value = 0
        for j in range(i,i+8,2):
            value ^= 256*x[i]+x[i+1]
        # тут я взагалі не зрозумів - отримуємо число до 65536, але обмінюємося всередині невеликої стрічки. 
        # Я беру за модулем довжини - але, можливо, треба ігнорувати обмін за межами?
        nj = value%len(x)
        y[i], y[nj] = y[nj], y[i]
    return y

Я отримав, наприклад, [4, 0, 16, 1, 15, 2, 14, 3, 13, 12, 5, 11, 6, 10, 7, 9, 8] - як мені тепер з цього масиву отримати початковий?

Подякували: DavComm1

4

Re: Шифр PJWJ

frz
Можливо потрібно додати розширення ключа. Якщо хтось може придумати.

koala

1. Так, для наприклад посольства це не проблема.

2. Таблиці складаються випадковим чином та зберігаються у захищеному місці.
Можливо потрібно придумати алгоритм розширення ключа - коли з паролю будуть формуватися таблиці, а потім шифрування.
Коли придумував цей шифр, мав на увазі обмін повідомленнями між 2 захищеними територіями.

3. Так, нижче описав.


J-операція 1.

Шифрування:

Якщо блок менше 2^16 то Nj mod n.
Припустимо n=12.
Nj = f(xi+1, xi+2). (з 2-х символів - тільки для цього прикладу)
Шифрування:
0)    Початок

x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12.

1)    Nj = f(x2, x3) mod 12 = припустимо 10.
Переставляємо x1 та x10:

x10, {x2, x3}, x4, x5, x6, x7, x8, x9, x1, x11, x12.

2)    Nj = f(x3, x4) mod 12 = припустимо 7.
Переставляємо x2 та x7:

x10, x7, {x3, x4}, x5, x6, x2, x8, x9, x1, x11, x12.

3)    Nj = f(x4, x5) mod 12 = припустимо 9.
Переставляємо x3 та x9:

x10, x7, x9, {x4, x5}, x6, x2, x8, x3, x1, x11, x12.

4)    Nj = f(x5, x6) mod 12 = припустимо 2.
Переставляємо x4 та x7(на позиції 2):

x10, x4, x9, x7, {x5, x6}, x2, x8, x3, x1, x11, x12.

5)    Nj = f(x6, x2) mod 12 = припустимо 12.
Переставляємо x5 та x12:

x10, x4, x9, x7, x12, {x6, x2}, x8, x3, x1, x11, x5.

6)    Nj = f(x2, x8) mod 12 = припустимо 8.
Переставляємо x6 та x3
(на позиції 8+1, так як позиція 8 використана для функції f(x2, x8)):

x10, x4, x9, x7, x12, x3, {x2, x8}, x6, x1, x11, x5.

7)    Nj = f(x8, x6) mod 12 = припустимо 5.
Переставляємо x2 та x12:

x10, x4, x9, x7, x2, x3, x12, {x8, x6}, x1, x11, x5.

8 )    Nj = f(x10, x1) mod 12 = припустимо 8.
Переставляємо x8 та x8 (тобто перестановки немає):

x10, x4, x9, x7, x2, x3, x12, x8, {x6, x1}, x11, x5.

9)    Nj = f(x1, x11) mod 12 = припустимо 6.
Переставляємо x6 та x3:

x10, x4, x9, x7, x2, x6, x12, x8, x3, {x1, x11}, x5.

10)    Nj = f(x11, x5) mod 12 = припустимо 4.
Переставляємо x1 та x7:

x10, x4, x9, x1, x2, x6, x12, x8, x3, x7, {x11, x5}.

11)    Результат:

x10, x4, x9, x1, x2, x6, x12, x8, x3, x7, x11, x5.

Було

x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12.

Стало

x10, x4, x9, x1, x2, x6, x12, x8, x3, x7, x11, x5.

J-операція 2.

Розшифрування:

У оберненому порядку.

0)    Початок

x10, x4, x9, x1, x2, x6, x12, x8, x3, x7, x11, x5. 

1)    Nj = f(x11, x5) mod 12 = припустимо 4
Переставляємо x7 та x1:

x10, x4, x9, x7, x2, x6, x12, x8, x3, x1, {x11, x5}. 

2)    Nj = f(x1, x11) mod 12 = припустимо 6
Переставляємо x3 та x6:

x10, x4, x9, x7, x2, x3, x12, x8, x6, {x1, x11}, x5. 

3)    Nj = f(x6, x1) mod 12 = припустимо 8
Переставляємо x8 та x8(тобто перестановки немає):

x10, x4, x9, x7, x2, x3, x12, x8, {x6, x1}, x11, x5. 

4)    Nj = f(x8, x6) mod 12 = припустимо 5
Переставляємо x12 та x2:

x10, x4, x9, x7, x12, x3, x2, {x8, x6}, x1, x11, x5. 

5)    Nj = f(x2, x8) mod 12 = припустимо 8
Переставляємо x3 та x6
(на позиції 8+1, так як позиція 8 використана для функції f(x2, x8)):

x10, x4, x9, x7, x12, x6, {x2, x8}, x3, x1, x11, x5. 

6)    Nj = f(x6, x2) mod 12 = припустимо 12
Переставляємо x12 та x5:

x10, x4, x9, x7, x5, {x6, x2}, x8, x3, x1, x11, x12. 

7)    Nj = f(x5, x6) mod 12 = припустимо 2
Переставляємо x7 та x4:

x10, x7, x9, x4, {x5, x6}, x2, x8, x3, x1, x11, x12. 

8 )    Nj = f(x4, x5) mod 12 = припустимо 9
Переставляємо x9 та x3:

x10, x7, x3, {x4, x5}, x6, x2, x8, x9, x1, x11, x12. 

9)    Nj = f(x3, x4) mod 12 = припустимо 7
Переставляємо x7 та x2:

x10, x2, {x3, x4}, x5, x6, x7, x8, x9, x1, x11, x12. 

10)    Nj = f(x2, x3) mod 12 = припустимо 10
Переставляємо x10 та x1:

x1, {x2, x3}, x4, x5, x6, x7, x8, x9, x10, x11, x12.

11)    Результат:

x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12.

Було

x10, x4, x9, x1, x2, x6, x12, x8, x3, x7, x11, x5.

Стало

x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12.

5

Re: Шифр PJWJ

Функція f із J-операції є частиною стандарту чи частиною ключа?

Подякували: DavComm1

6

Re: Шифр PJWJ

koala написав:

Функція f із J-операції є частиною стандарту чи частиною ключа?

Частина стандарту.
Одностороння функція, на виході - псевдовипадкові числа.
(Тобто розшифровувати не потрібно, на вході 8 8-бітних числа, на виході одне 16-бітне число.)
Наприклад, як MD5 тощо.
Можете використати будь-яку функцію, яка підійде до характеристики.

Параметри функції - частина ключа - наприклад, константи.

Суть шифру більше у W-операціях, а J-операції - це керована перестановка для додаткового захисту W.

P-операція робить рівномірнию послідовність.
J - переставляє знаки.
W-операції призводять до з'єднання всього тексту.