В случае с одноразовым блокнотом (OTP) простейшая схема шифрования с отрицанием может использовать использование Сообщение-приманка и Ключ-приманка которые создают Универсальный зашифрованный текст это будет то же самое Универсальный зашифрованный текст который будет XORed с Настоящее сообщение, что приводит к детерминированному Настоящий ключ (при условии, что длина реального сообщения не меньше длины ложного сообщения и результирующих ключей и зашифрованного текста, чтобы избежать необходимости заполнения).
- Недостатком будет обработка битов открытого текста как закрытого ключа, в смысле
генерация секретного ключа (Настоящий ключ), так как он полностью детерминистически выводится из
«обычный текст», именуемый здесь Настоящий
Сообщение.
Таким образом, безопасность реального ключа в битах будет зависеть от
случайность и длина (и любая получающаяся или наследуемая безопасность) реального сообщения
в битах (поэтому сообщение нужно рассматривать буквально и фигурально как закрытый ключ с точки зрения защиты всей системы, чтобы реальное сообщение было безопасным, поскольку оно не «защищается» закрытым ключом (скорее, закрытый ключ создается из сообщения). Ниже приведен пример:
pl = ключ-приманка
k1= ложное сообщение
c1 = универсальный зашифрованный текст
p2= реальный ключ
k2= реальное сообщение
p1âk1 =c1
c1âk2 = k1
*Сообщение-обманка (длина n) - ключ-обманка (длина n) = универсальный зашифрованный текст (длина n)
*Универсальный зашифрованный текст (длина n) Реальное сообщение (длина n) = Настоящий ключ (длина n)
Мнение: Такой метод шифрования для правдоподобного отрицания мог бы работать (совершенная секретность и квантовая безопасность), если бы само сообщение было достаточно случайным и при условии, что его длина в битах была бы невозможна для угадывания или столкновения с грубой силой (т. е. реальное сообщение могло бы быть частным сам ключ, сгенерированный CSPRNG) и длиной, например, 128 бит. В противном случае короткое или предсказуемое реальное сообщение приведет к созданию реального ключа, который не является безопасным.
Важные предположения безопасности: для достаточно защищенного реального сообщения (незашифрованного текста), такого как 256-битное целое число, сгенерированное CSPRNG, результирующий реальный ключ, который вычисляется после операции XOR против универсального зашифрованного текста, где квадратный корень [пространство сообщения * пространство ключа] = пространство зашифрованного текста (включая дубликаты составляет 2 ^ 512 из-за коммутативности XOR), из которого будет по крайней мере столько же раз (2 ^ 256) других сообщений и ключей, будет создавать один и тот же универсальный зашифрованный текст. Таким образом, невозможно узнать, какое сообщение или ключ является рассматриваемым, поскольку все они будут казаться действительными без предварительного знания реального ключа, если сообщение (рассматриваемое как генератор ключа) достаточно безопасно.Этот предел/диапазон определяется количеством различных уравнений исключающего ИЛИ, которые существуют (без перестановок) для любого произвольного диапазона действительных целых чисел (т.е. n=256) в следующей последовательности A028401.
Пример кода Python для вычисления отдельного XOR:
Initial_bits= int(input("введите количество битов"))
Initial_number_range= 2**Initial_bits
Unique_XOR_triples=((Initial_number_range+1)*(Initial_number_range+2))//6
Total_triplet_input_terms =((Initial_number_range//2)+1)*(Initial_number_range)+(Initial_number_range//2)+1
Repeat_Groups=(Total_triplet_input_terms)-((Initial_number_range**2)//2)-Initial_number_range
Checksum_repeat_group=(Initial_number_range//2)+1
print('1: Initial_bits, это будет показатель степени для числа 2, возведенного в эту степень:',Initial_bits)
print('2: Initial_number_range, два, увеличенные до количества начальных битов, равны этому:',Initial_number_range)
print('3: Unique_XOR_triples, три входных термина считаются за один:',Unique_XOR_triples)
print('4: Total_triplet_input_terms (т.е. XOR B = C будет тремя входными терминами):',Total_triplet_input_terms)
print('5: Repeat_Groups, каждое число в группе повторяется столько раз, а дополнительное число ноль столько раз:',Repeat_Groups)
Код Python с правдоподобной схемой шифрования с использованием небезопасных 56-битных строк в качестве примера:
P1 = 0B0110100001100101011011000110110001101111000000000000000000 #Plaintext1. 56-разрядное пример ASCII для «Hello» для «Hello».
р1 = бункер (р1)
k1= 0b10011001100110011001100110011001100110011001100110011000 #key1 DUMMY KEY 56-битный пример: 0b100110011001100110011001100110011001101001100011000
k1=бин(k1)
c1= int(p1,2)^int(k1,2) #ciphertext (вычисленный DETERMINISTIC 56-бит, полученный из фиктивного сообщения XOR с фиктивным ключом): "0b111100011111110011110101111101011111101101001100110011000"
с1 = бункер (с1)
p2= 0b01101100011001010110000101110110011010010110111001100111 #plaintext2 РЕАЛЬНОЕ СООБЩЕНИЕ 8-битный пример ASCII для «ухода»:
р2 = бункер (р2)
k2= int(c1,2)^int(p2,2) #key2 РЕАЛЬНЫЙ КЛЮЧ ((вычисляется ДЕТЕРМИНИСТИЧЕСКИЙ) 56-бит, полученный в результате операции XOR зашифрованного текста с реальным сообщением: 0b100111011001100110010100100000111001111111110111111111111
k2=бин(k2)
print('p1 фиктивное сообщение:',p1)
print('k1 DUMMY KEY is:',k1)
print('c1 UNIVERSAL CIPHERTEXT is:',c1)
print('p2 НАСТОЯЩЕЕ СООБЩЕНИЕ:',p2)
print('k2 REAL KEY is:',k2) ## этот "Ключ" является детерминированным, таким образом, настолько сильным, насколько случайным является сообщение
print('реальное сообщение p2: ', (p2),
'истинно', (int (p2,2)) == int (k2,2) ^ int (c1,2))
print('as c1',c1,'xor p2', p2, 'равно',bin(int(k2,2)), 'истинно')
print((int(k2,2)==(int(c1,2)^(int(p2,2)))))
print('and equals = ',bin(int(c1,2)^(int(p2,2))))