Stream-Cipher
特雷維範例
我從 Christof Paar 和 Jan Pelzl 的《理解密碼學》一書中開始學習密碼學。這是我已經解決的問題,但我想確保它是正確的。
假設 IV(初始化向量)和 Trivium 的密鑰每個都由 80 個全零位組成。在 Trivium 的預熱階段計算前 70 位 s1.…,s70。請注意,這些只是不用於加密的內部位,因為預熱階段持續 1152 個時鐘週期。
這是我在 Python 中的程式碼:
reg_A = [''] * 93 reg_B = [''] * 84 reg_C = [''] * 111 for i in [93, 84, 111]: for j in range(i): if i == 93: reg_A[j] = 0 elif i == 84: reg_B[j] = 0 elif i == 111: reg_C[j] = 0 reg_C[108] = reg_C[109] = reg_C[110] = 1 for i in range(80): # initializing key reg_A[i] = 0 reg_B[i] = 0 stream = [] for i in range(70): # first calculate output bits of every register Cz = reg_C[110] ^ reg_C[65] ^ (reg_C[108] & reg_C[109]) Ax = reg_A[92] ^ reg_A[65] ^ (reg_A[90] & reg_A[91]) By = reg_B[83] ^ reg_B[68] ^ (reg_B[81] & reg_B[82]) # then calculate first bit of every register a1 = Cz ^ reg_A[68] b1 = Ax ^ reg_B[77] c1 = By ^ reg_C[86] for x in range(92, 0, -1): # go to 1, because we already have first bit calculated reg_A[x] = reg_A[x-1] reg_A[0] = a1 for x in range(83, 0, -1): reg_B[x] = reg_B[x-1] reg_B[0] = b1 for x in range(110, 0, -1): reg_C[x] = reg_C[x-1] reg_C[0] = c1 stream.append(Ax ^ By ^ Cz) print reg_A, "FINAL" print reg_B print reg_C print stream, "FINAL STREAM AFTER 70 CLOCKS"
由於我沒有解決方案,我不知道如何檢查我是否做對了。這就是我在這裡尋求幫助的原因。
我發現了一種有趣的討論方法。我開發了自己的 Trivium 版本,並嘗試解決 Nicolas 描述的練習,該練習說:
練習 2.12 - 理解密碼學
假設 Trivium 的 IV 和密鑰分別由 80 個全零位組成。計算前 70 位 s1, 。. . , s70 在 Trivium 的熱身階段。請注意,這些只是不用於加密的內部位,因為預熱階段持續 1152 個時鐘週期
練習提到熱身階段。如果您閱讀算法的規範,它會在 2.1(密鑰流生成)和 2.2(密鑰和 IV 設置)之間存在細微差別。在前者中,輸出是在每個寄存器的 2 位之間的 3 次 XOR 運算之後立即計算的(正如 Henno 所解釋的)。但是在後者中,所有的操作都是合併的。
總之,我做了以下事情:
- 我修改了程式碼以在 2.2 或預熱階段列印前 70 位,因此,我獲得了以下密鑰流
0110000000000000000000000000000000000000000000000000000000000000000110
- 我使用 2.1 部分或密鑰流生成階段生成了 70 位,結果是下面的密鑰流
1110000000000000000000000000000000000000000000000000000000000000000110
如您所見,(1)等於 Nikola 輸出,(2)等於 Henno 輸出。這是一個棘手的練習。不幸的是,沒有提供答案。