Rc4 расшифровывает ValueError: неизвестный код формата 'x' для объекта типа 'str' - PullRequest
0 голосов
/ 11 февраля 2020

Когда я добираюсь до следующей строки в моем коде, я получаю следующую ошибку:

inputString = "{:02x}".format(inputNumber)

ValueError: Неизвестный код формата 'x' для объекта типа 'str'

Как мне избежать этого?

# Global variables
state = [None] * 256
p = q = None

def setKey(key):
    ##RC4 Key Scheduling Algorithm
    global p, q, state
    state = [n for n in range(256)]
    p = q = j = 0
    for i in range(256):
        if len(key) > 0:
            j = (j + state[i] + key[i % len(key)]) % 256
        else:
            j = (j + state[i]) % 256
    state[i], state[j] = state[j], state[i]

def byteGenerator():
    ##RC4 Pseudo-Random Generation Algorithm
    global p, q, state
    p = (p + 1) % 256
    q = (q + state[p]) % 256
    state[p], state[q] = state[q], state[p]
    return state[(state[p] + state[q]) % 256]

def encrypt(key,inputString):
    ##Encrypt input string returning a byte list
    setKey(string_to_list(key))
    return [ord(p) ^ byteGenerator() for p in inputString]

def decrypt(inputByteList):
    ##Decrypt input byte list returning a string
    return "".join([chr(c ^ byteGenerator()) for c in inputByteList])



def intToList(inputNumber):
    ##Convert a number into a byte list
    inputString = "{:02x}".format(inputNumber)
    return [(inputString[i:i + 2], 16) for i in range(0,    len(inputString), 2)]

def string_to_list(inputString):
    ##Convert a string into a byte list
    return [ord(c) for c in inputString]


loop = 1
while loop == 1: #simple loop to always bring the user back to the menu

    print("RC4 Encryptor/Decryptor")
    print
    print("Please choose an option from the below menu")
    print
    print("1) Encrypt")
    print("2) Decrypt")
    print

    choice = input("Choose your option: ")
    choice = int(choice)

    if choice == 1:
        key = input("Enter Key: ")
        inputstring = input("enter plaintext: ")
        print(encrypt(key, inputstring))


    elif choice == 2:  
        key = input("Enter Key: ")
        ciphertext = input("enter plaintext: ")
        print(decrypt(intToList(ciphertext)))

    elif choice == 3:
    #returns the user to the previous menu by ending the loop and clearing the screen.
        loop = 0

    else:  
        print ("please enter a valid option") #if any NUMBER other than 1, 2 or 3 is entered.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Похоже, вы пытаетесь преобразовать строку в гекс. К сожалению, это не способ сделать это: "{:02x}".format для форматирования одного целого числа, поэтому он не работает для всей строки.

Python 3 включает метод bytes.hex(), который выполняет это преобразование для вас, но вам потребуется строка байтов, а не обычная строка. Вы можете использовать строковое кодирование для преобразования из str в байты.

Если вы хотите выполнить преобразование самостоятельно, вы можете вызвать "{:02x}".format для кодов символов каждого символа в вашей строке и объединить отдельные шестнадцатеричные значения вместе. Будьте осторожны с Юникодом в этом случае; вам может быть лучше работать с байтовой строкой.

0 голосов
/ 11 февраля 2020

Код строки формата x преобразует целое число в его шестнадцатеричное представление в виде строки. Например:

>>> "{:02x}".format(54563)
'd523'

Ошибка, которую вы получаете, возникает при передаче строки как inputNumber. Аргументы, передаваемые вашей функции intToList, должны быть целыми числами. Попробуйте использовать intToList(int(your_argument_here)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...