Как исправить ошибку TypeError: требуется объект, подобный байтам, а не ‘str’?

#python #python-3.x

#питон #python-3.x #python

Вопрос:

 #-*- coding: utf-8 -*-
import sha3
import pyopencl as cl
import Keccak
import time
#Initialize OpenCL
platforms = cl.get_platforms()
devices = platforms[0].get_devices()
context = cl.Context(devices[:2])
queue = cl.CommandQueue(context, context.devices[0],
                        properties=cl.command_queue_properties.PROFILING_ENABLE)
program = cl.Program(context, open('sha3.cl').read()).build(options='')

#Parameters for SHA 512
r = 576
c = 1024
n = 512

inputlist = []
inputlist.append("a" * 1000)


start = time.time()
result = sha3.Keccak(inputlist, n, r,c, program, context, queue)
print  ("Hashing Result is")
print (result)
print ("Time taken is: "   str(time.time() - start))
  

Это ошибка, которую выдает скрипт, когда я пытаюсь его запустить.

 Traceback (most recent call last):
  File "J:/PuzzleUtils/AllInOneWithPermutation/eeeee.py", line 24, in <module>
    result = sha3.Keccak(inputlist, n, r,c, program, context, queue)
  File "J:/PuzzleUtils/AllInOneWithPermutationsha3.py", line 195, in Keccak
    gpu_string = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=host_string)
TypeError: a bytes-like object is required, not 'str'
  

неважно, что я делаю. Я не могу найти, что выдает эту ошибку, когда я пытаюсь добавить encode(), в списке give нет атрибута ‘encode’

Я пытаюсь переработать этот скрипт реализации opencl keccakhttps://github.com/kevinkeyjkw/sha3_hash_parallel чтобы заставить его работать на python 3.8

 from __future__ import division
import sys
import pyopencl as cl
import numpy as np
import pylab
import pdb
import time

def pad10star1(M, n):
    """Pad M with the pad10*1 padding rule to reach a length multiple of r bits
    M: message pair (length in bits, string of hex characters ('9AFC...')
    n: length in bits (must be a multiple of 8)
    Example: pad10star1([60, 'BA594E0FB9EBBD30'],8) returns 'BA594E0FB9EBBD93'
    """

    [my_string_length, my_string]=M

    # Check the parameter n
    if n%8!=0:
        raise KeccakError.KeccakError("n must be a multiple of 8")

    # Check the length of the provided string
    if len(my_string)%2!=0:
        #Pad with one '0' to reach correct length (don't know test
        #vectors coding)
        my_string=my_string '0'
    if my_string_length>(len(my_string)//2*8):
        raise KeccakError.KeccakError("the string is too short to contain the number of bits announced")

    nr_bytes_filled=my_string_length//8
    nbr_bits_filled=my_string_length%8
    l = my_string_length % n
    if ((n-8) <= l <= (n-2)):
        if (nbr_bits_filled == 0):
            my_byte = 0
        else:
            my_byte=int(my_string[nr_bytes_filled*2:nr_bytes_filled*2 2],16)
        my_byte=(my_byte>>(8-nbr_bits_filled))
        my_byte=my_byte 2**(nbr_bits_filled) 2**7
        my_byte="X" % my_byte
        my_string=my_string[0:nr_bytes_filled*2] my_byte
    else:
        if (nbr_bits_filled == 0):
            my_byte = 0
        else:
            my_byte=int(my_string[nr_bytes_filled*2:nr_bytes_filled*2 2],16)
        my_byte=(my_byte>>(8-nbr_bits_filled))
        my_byte=my_byte 2**(nbr_bits_filled)
        my_byte="X" % my_byte
        my_string=my_string[0:nr_bytes_filled*2] my_byte
        while((8*len(my_string)//2)%n < (n-8)):
            my_string=my_string '00'
        my_string = my_string '80'

    return my_string

def KeccakF(to_hash, iterations, curr_iter, program, context, queue):



    WORDLENGTH = 64
    inputnum = int(to_hash.shape[0]/5)
    #Set up Round constants
    RC=[0x0000000000000001,
        0x0000000000008082,
        0x800000000000808A,
        0x8000000080008000,
        0x000000000000808B,
        0x0000000080000001,
        0x8000000080008081,
        0x8000000000008009,
        0x000000000000008A,
        0x0000000000000088,
        0x0000000080008009,
        0x000000008000000A,
        0x000000008000808B,
        0x800000000000008B,
        0x8000000000008089,
        0x8000000000008003,
        0x8000000000008002,
        0x8000000000000080,
        0x000000000000800A,
        0x800000008000000A,
        0x8000000080008081,
        0x8000000000008080,
        0x0000000080000001,
        0x8000000080008008]

    round_constants = np.array([np.uint64(x) for x in RC])
    round_constants_gpu = cl.Buffer(context, cl.mem_flags.READ_ONLY, 8 * len(round_constants))   #Why * 8???
    cl.enqueue_copy(queue, round_constants_gpu, round_constants, is_blocking=False)

    #Set up rotation offsets
    rotation_offsets = np.array([0, 36, 3, 41, 18, 
                                1 ,44 ,10 ,45 ,2,   
                                62, 6 ,43 ,15 ,61,  
                                28, 55, 25, 21, 56, 
                                27, 20, 39, 8 ,14])

    rotation_offsets = np.array([np.uint64(x) for x in rotation_offsets])
    rotation_gpu_buffer = cl.Buffer(context, cl.mem_flags.READ_ONLY, 8 * len(rotation_offsets))
    cl.enqueue_copy(queue, rotation_gpu_buffer, rotation_offsets, is_blocking=False)




    stuff_to_hash = cl.Buffer(context, cl.mem_flags.READ_ONLY, to_hash.size * 8)
    cl.enqueue_copy(queue, stuff_to_hash, to_hash, is_blocking=False)#is_block=True means wait for completion

    #Buffer for GPU to write final hash
    gpu_final_hash = cl.Buffer(context, cl.mem_flags.READ_WRITE, to_hash.size * 8)
    
    #control the number of iterations of each hash in Keccak
    gpu_iterations = cl.Buffer(context, cl.mem_flags.READ_ONLY, len(iterations)*8)
    cl.enqueue_copy(queue, gpu_iterations, np.array(iterations), is_blocking=False)#is_block=True means wait for completion

    gpu_curr_iter = cl.Buffer(context, cl.mem_flags.READ_ONLY, 8)
    cl.enqueue_copy(queue, gpu_curr_iter, np.array(curr_iter), is_blocking=False)#is_block=True means wait for completion


    #Create 5x5 workgroup, local buffer
    local_size, global_size = (5, 5) , (5,5*inputnum)
    local_buf_w,local_buf_h = np.uint64(5),np.uint64(5)
    A = cl.LocalMemory(8*25)
    B = cl.LocalMemory(8*25)
    C = cl.LocalMemory(8*25)
    D = cl.LocalMemory(8*25)

    #Hash input
    final_hash = np.zeros((5*inputnum,5))
    final_hash = np.array([np.uint64(x) for x in final_hash])    
    hash_event = program.sha_3_hash(queue, global_size, local_size,
                              stuff_to_hash, gpu_final_hash,rotation_gpu_buffer,round_constants_gpu, gpu_iterations, gpu_curr_iter,
                              B,A, C, D, local_buf_w,local_buf_h)

    
    
    cl.enqueue_copy(queue, final_hash, gpu_final_hash, is_blocking=True)

    return final_hash


def Keccak(inputlist, n,r,c, program, context, queue):



    inputnum = len(inputlist)
    input_str = inputlist[0]

    #P is a storage for the padded inputs
    P = []

    #Z is a storage for the output hashes
    Z = []

    iterations = []

    #start = time.time()
    ### Padding Phase
    for i in range(inputnum):
        tmpstr = pad10star1([len(inputlist[i])*4, inputlist[i]],r) 
        P.append(tmpstr)
        Z.append("")
        iterations.append((len(tmpstr)*8//2)//r)

    #print ("Time to run padding: "   str(time.time() - start))

    # Initialisation of state
    S = np.zeros((5*inputnum,5))


    #Testing
    S = np.array([np.uint64(x) for x in S])

    #Initialize workgroup sizes for the gpu
    local_size, global_size = (5, 5) , (5,5*inputnum)

    for i in range(max(iterations)): 

        host_string = ""
        Pi = np.zeros((5*inputnum,5))
        Pi = np.array([np.uint64(x) for x in Pi])

        for j in range(inputnum):

            if (iterations[j] > i):
                #Absorbing Phase
                host_string = host_string   str(P[j][i*(2*r//8):(i 1)*(2*r//8)] '00'*(c//8))
            else:
                #Dummy variables. Won't be used.
                host_string = host_string   "0"*400

        gpu_string = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=host_string)
        gpu_table = cl.Buffer(context, cl.mem_flags.READ_WRITE, 25*8 * inputnum)
        part_of_string = cl.LocalMemory(1*16)
        program.convert_str_to_table(queue,global_size,local_size, gpu_string, gpu_table, part_of_string, np.uint64(5),np.uint64(5),np.uint64(64))
        cl.enqueue_copy(queue, Pi, gpu_table, is_blocking=True)




        for x in range(5*inputnum):
            for y in range(5):
                #print 'type S:',type(S[x][y]),'type P:',type(Pi[x][y])

                if (iterations[int(x/5)] > i):
                    S[x][y] = S[x][y]^Pi[x][y]



        S = np.array([np.uint64(x) for x in S])
        #start = time.time()
        S = KeccakF(S, iterations, i,  program, context, queue)
        #print ("Time to run KeccakF: "   str(time.time() - start))
        #print (S)

    #Squeezing phase

    outputstring = np.chararray(400 * inputnum)
    gpu_table = cl.Buffer(context, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=S)
    gpu_string = cl.Buffer(context, cl.mem_flags.READ_WRITE, 144*8 * inputnum)
    program.convert_table_to_str(queue,global_size,local_size,gpu_table, gpu_string,np.uint64(5),np.uint64(5),np.uint64(64))
    cl.enqueue_copy(queue, outputstring, gpu_string, is_blocking=True)

    string = ''.join(outputstring)

    for x in range(inputnum):
        Z[x] = Z[x]   string[400 * x: 400 * x   r*2//8]


    for x in range(inputnum):
        Z[x] = Z[x][0:2*n//8]

    #output the pre-set number of bits
    return Z

if __name__ == '__main__':


    # List our platforms
    platforms = cl.get_platforms()

    # Create a context with all the devices
    devices = platforms[0].get_devices()
    context = cl.Context(devices[:2])
    #print ('This context is associated with ', len(context.devices), 'devices')

    # Create a queue for transferring data and launching computations.
    # Turn on profiling to allow us to check event times.
    queue = cl.CommandQueue(context, context.devices[0],
                            properties=cl.command_queue_properties.PROFILING_ENABLE)
    #print ('The queue is using the device:', queue.device.name)

    
    program = cl.Program(context, open('sha3.cl').read()).build(options='')


    #PARAMETERS for SHA 512
    r = 576
    c = 1024
    n = 512

    inputlist = []
    inputlist.append("")
    inputlist.append("abcd")
    inputlist.append("abcd")
    inputlist.append("abcd")
    inputlist.append("a" * 1000)

    start = time.time()
    result = Keccak(inputlist, n, r,c, program, context, queue)
    print  ("Hashing Result is")
    print (result)
    print ("Time taken is: "   str(time.time() - start))
  

это функции из sha3

Комментарии:

1. Байтовые строки и обычные строки могут быть действительно запутанными. Если Keccak ожидает, что inputlist будет списком байтовых строк, простым решением будет изменить вашу команду добавления на inputlist.append(b"a" * 1000) . Буква b перед строкой делает ее байтовой строкой.

2. Ошибка типа: не удается объединить str в байты sha3.py «, строка 52, в pad10star1 my_string=my_string[0: nr_bytes_filled*2] ошибка типа my_byte: не удается объединить str в байты я не могу понять, что вызывает эту ошибку и какой тип данных он хочет:/ i .encode() .encode(‘utf-8) .encode (ascii) выдает ошибки об отсутствии атрибута.

Ответ №1:

Попробуйте это.

Список входных данных должен быть преобразован в bytearray.

результат = sha3.Keccak(bytearray(inputlist), n, r, c, программа, контекст, очередь)

Комментарии:

1. , строка 22, в <module> результат = sha3.Keccak(bytearray(inputlist), n, r, c, program, context, queue) TypeError: объект ‘str’ не может быть интерпретирован как целое число

2. пожалуйста, проверьте, какой тип других параметров принимается функцией sha3.Keccak.

3. я был дерзок, но не понял, когда ошибка:( , может быть, я не вижу чего-то очень простого.