Điểm:2

Làm rõ về chức năng iota của SHA-3

lá cờ cn

Tôi đang cố triển khai SHA-3 bằng cách sử dụng tài liệu này và có câu hỏi về bước iota.

Bước này bao gồm một XOR duy nhất giữa làn trung tâm (0, 0) của trạng thái (hình minh họa về trạng thái tr.8 nếu cần) và một hằng số vòng. Nói cách khác:

cho z trong [0, w[:
    để new_state(0, 0, z) = trạng thái(0, 0, z) ^ RC[z]

trong đó RC được xem như một chuỗi bit.

Hằng số vòng đầu tiên của vòng đầu tiên là 1, do đó chỉ một bit sẽ bị thay đổi. Như nó có thể được nhìn thấy trong này tài liệu cung cấp các vectơ kiểm tra, chúng tôi có trong vòng # 0:

Sau Chí
    00 00 00 00 00 00 00 00 ...
Sau Iota
    01 00 00 00 00 00 00 00 ... (sau đây bằng trên)

Tuy nhiên, có một điều tôi không hiểu: bit được thay đổi trong các vectơ thử nghiệm đó là bit thứ tám, nhưng hằng số vòng của chúng tôi là 1 được viết trên w-bit. Nếu $w=8$ (ngụ ý thông báo 200 bit), mọi thứ đều ổn, nhưng trong liên kết trước, chúng tôi có thông báo 1600 bit, do đó $w=64$. Làm cách nào XOR-ing 64-bit 0...01 này có thể thay đổi bit thứ tám của làn đường?

CHỈNH SỬA: Tôi sẽ thêm mã của mình bên dưới (nó vẫn đang hoạt động):

lớp Keccak(đối tượng):

    def __init__(bản thân):
        tự.l = 6
        self.w = pow(2, self.l)

        self.state = [[[0 cho x trong dải(5)] cho y trong dải(5)] cho z trong dải(self.w)]
        self.tmp_state = [[[0 cho x trong dải(5)] cho y trong dải(5)] cho z trong dải(self.w)]


    def init_state(bản thân, S):
        cho x trong phạm vi (5):
            cho y trong phạm vi (5):
                cho z trong phạm vi (self.w):
                    self.set_state(x, y, z, int(S[self.w*(5*y + x) + z], 2))

    def init_tmp_state(bản thân):
        cho x trong phạm vi (5):
            cho y trong phạm vi (5):
                cho z trong phạm vi (self.w):
                    self.set_tmp_state(x, y, z, 0)


    def index_processing(self, x, y, z):
        trả về (z % self.w, (y + 2) % 5, (x + 2) % 5)
        

    def get_state(self, x, y, z):
        x, y, z = self.index_processing(x, y, z)
        trả về self.state[x][y][z]

    def set_state(self, x, y, z, v):
        x, y, z = self.index_processing(x, y, z)
        self.state[x][y][z] = v


    def get_tmp_state(self, x, y, z):
        x, y, z = self.index_processing(x, y, z)
        trả về self.tmp_state[x][y][z]

    def set_tmp_state(self, x, y, z, v):
        x, y, z = self.index_processing(x, y, z)
        self.tmp_state[x][y][z] = v


    def state_to_string(bản thân):
        bit_string = []
        cho y trong phạm vi (5):
            cho x trong phạm vi (5):
                cho z trong phạm vi (self.w):
                    bit_string.append(str(self.get_state(x, y, z)))

        trả về ''.join(bit_string)


    def rc(tự, t):
        nếu t % 255 == 0:
            trả lại 1

        R = [1, 0, 0, 0, 0, 0, 0, 0]
        cho tôi trong phạm vi (1, (t % 255) + 1):
            R = [0] + R
            R[0] ^= R[8]
            R[4] ^= R[8]
            R[5] ^= R[8]
            R[6] ^= R[8]
            R = R[:8]

        trả lại R[0]


    def iota(bản thân, tôi):
        RC = [0 cho j trong phạm vi (self.w)]
        cho j trong phạm vi (self.l + 1):
            RC[pow(2, j) - 1] = self.rc(j + 7*i)

        cho z trong phạm vi (self.w):
            self.set_state(0, 0, z, self.get_state(0, 0, z) ^ RC[z])




chắc chắn test_iota():
    initial_state = "0000000000000000D2D2D2D2D2D2D2D20000000000000000E8E8E8E8E8E8E8E83A3A3A3A3A3A3A3A535353535353535300000000000000001D1D1D1D1D1D1D1D4E4E4E4E4E4E4E4E00000000000000004141414141414141E8E8E8E8E8E8E8E80000000000000000414141414141414126262626262626261D1D1D1D1D1D1D1D0000000000000000474747474747474718181818181818184747474747474747E8E8E8E8E8E8E8E835353535353535350000000000000000AFAFAFAFAFAFAFAF1212121212121212"
    initial_state = bin(int(initial_state, 16))[2:].zfill(1600)

    keccak = keccak()
    keccak.init_state(initial_state)
    keccak.iota(0)
    kết quả = keccak.state_to_string()

    correct_result = "0100000000000000D2D2D2D2D2D2D2D20000000000000000E8E8E8E8E8E8E8E83A3A3A3A3A3A3A3A535353535353535300000000000000001D1D1D1D1D1D1D1D4E4E4E4E4E4E4E4E00000000000000004141414141414141E8E8E8E8E8E8E8E80000000000000000414141414141414126262626262626261D1D1D1D1D1D1D1D0000000000000000474747474747474718181818181818184747474747474747E8E8E8E8E8E8E8E835353535353535350000000000000000AFAFAFAFAFAFAFAF1212121212121212"
    true_result = bin(int(true_result, 16))[2:].zfill(1600)

    print("\tIota:\t" + str(kết quả == đúng_kết quả))
    
    in(kết quả[0:64] + '\n\n' +true_result[0:64])

Bản in thử nghiệm:

    Iota: Sai
100000000000000000000000000000000000000000000000000000000000000000

00000001000000000000000000000000000000000000000000000000000000000
kelalaka avatar
lá cờ in
Hình 2, vị trí của các chỉ mục không chuẩn. [0,0,1] là tâm của lát cắt phía trước. Vì vậy, khi in này sẽ được in.
Katoptriss avatar
lá cờ cn
Tôi cũng nghĩ rằng mình có thể đã nhầm lẫn việc lập chỉ mục, nhưng tôi đã kiểm tra các hàm string_to_state và state_to_string của mình bằng cách sử dụng các phần 3.1.2 và 3.1.3 và chúng có vẻ đúng. Nhưng tôi cũng không nghĩ rằng vấn đề có thể đến từ bất cứ nơi nào khác ngoài đó. Tôi sẽ chỉnh sửa để thêm mã của mình. Ngoài ra, trong phần 3.1.3, chuỗi bit kết quả từ trạng thái được tạo đầu tiên bằng cách nối trạng thái (0, 0, 0) thành trạng thái (0, 0, 63) : điều này không có nghĩa là bit đã thay đổi và sau đó được in là cái thứ tám, ở trạng thái (0, 0, 7)?
Katoptriss avatar
lá cờ cn
Một ý nghĩ chợt đến với tôi: có lẽ đây chỉ là một vấn đề ngớ ngẩn về tuổi thọ? Nhưng các hàm pi và khi tôi đã viết đều vượt qua các bài kiểm tra của chúng và cho kết quả như mong đợi, vì vậy tôi không biết về việc thay đổi độ bền. Tôi sẽ thử chỉ trong trường hợp.
Katoptriss avatar
lá cờ cn
Chà, có vẻ như câu trả lời là nó không phải là endianness per se, mà là "bitwise endianness" trong đó các bit phải được thực hiện theo thứ tự ngược lại. Kỳ dị. Nhưng tôi nên đọc tiêu chuẩn cẩn thận hơn.
kelalaka avatar
lá cờ in
Người ta nên đọc toàn bộ tài liệu trước khi bắt đầu.
kelalaka avatar
lá cờ in
Bạn có thể trả lời câu hỏi của bạn, đó là ok!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.