ФОН КОДА: Ниже приведен код, над которым я работаю.Целью этого кода является использование начального числа для генерации длинного псевдослучайного ключа.Работа над использованием этого ключа для шифрования происходит позже.На данный момент, если используется один символ, он будет выплевывать строку из 23 символов, уникальную для этого символа.Надежда состоит в том, чтобы расширить размер ключа до пригодного для использования размера, чтобы создать псевдо-OTP.Он также настроен на обработку всех вводимых символов ASCII.
Способ, которым это достигается, заключается в использовании модифицированного шифра Vigenere, в котором SEED является первым ключом, а следующий ключ использует себя для генерации следующего ключа., и так далее и тому подобное.Пока этот ключ имеет тот же размер или больше сообщения, он фактически является OTP.Следует отметить, что, как я выяснил в ранних экспериментах с этой концепцией, [message letter] = / = [key letter] или он заблокирует этот символ, и в конечном итоге шифр шифрует только эту букву, делая невозможным дешифрование.Или, по крайней мере, так произошло, когда я сделал это вручную, используя стандартную таблицу Vigenere.
ВОПРОС: Я попробовал два метода увеличения размера семени от одного символа, чтобы посмотреть, смогу ли ягенерировать более длинные ключи.Метод 2 использует 2 переменные для ключей и выдает только букву из BKEY за весь цикл.Метод 3 предназначен для использования массивов любого размера, которые он может.Однако ключ, который выдает, уходит только на длину массива перед повторением.
Если кто-то может взять за руку или даже просто предложить несколько предложений, я был бы благодарен.
MINLIMIT = 32
MAXLIMIT = 126
SPAN = 94
#This converts the letter to an integer between 1 and 94.
def GETKEY(KEYLET):
KEY = KEYLET - 31
return KEY
#This checks to see if the encrypted character is with the bounds of the
#available characters and corrects them if they aren't.
def CHECK(CIPHER):
if (CIPHER > MAXLIMIT):
CIPHER -= SPAN
elif (CIPHER < MINLIMIT):
CIPHER += SPAN
return CIPHER
#This combines the message character with the key character, sends the
#result to be checked, before sending it to be printed.
def ENCRYPT(LETTER,KEYLET):
KEY = GETKEY(KEYLET)
if (KEY != 1):
ENCODE = LETTER + KEY
else:
ENCODE = LETTER - 3
CIPHER = CHECK(ENCODE)
return CIPHER
#Creates a key from a single seed. Length is set by Main. SEED is
#controlled here as KEY.
def TESTSINGLE(COUNT):
KEY = ord('a')
while (COUNT != 0):
KEY = ENCRYPT(KEY,KEY)
print(chr(KEY),end = '')
COUNT = COUNT -1
#Tries to create a key from two different seeds (AKEY and BKEY) by
#alternating them between even and odd iterations. Non-functional.
def TESTMULTIPLE(COUNT):
AKEY = ord('a')
BKEY = ord('b')
while (COUNT != 0):
if (COUNT%2 == 1):
CKEY = ENCRYPT(AKEY,AKEY)
print(CKEY)
else:
CKEY = ENCRYPT(BKEY,BKEY)
print(CKEY)
print(chr(BKEY),end = '')
COUNT = COUNT - 1
#Uses an array as seed to generate key. The array is LONGKEY, and size can
#be changed simply by adding/removing elements. The code will cope with
#any changes.
def TESTARRAY(COUNT):
LONGKEY = ['a','c']
LENGTH = len(LONGKEY)
CKEY = 0
while (COUNT != 0):
POINT = COUNT%LENGTH
CKEY = ord(LONGKEY[POINT])
CKEY = ENCRYPT(CKEY,CKEY)
print(chr(CKEY),end = '')
COUNT = COUNT - 1
#COUNT changes the length of the key to be generated. SELECT changes which
#method to be used. Currently, the values must be adjusted in the code,
#but it is trivial to set up a user prompt.
def MAIN():
COUNT = 24
SELECT = 2
if(SELECT == 1):
TESTSINGLE(COUNT)
elif(SELECT == 2):
TESTMULTIPLE(COUNT)
elif(SELECT == 3):
TESTARRAY(COUNT)
print('')
MAIN()