Stream-Cipher

特雷維範例

  • November 14, 2015

我從 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 所解釋的)。但是在後者中,所有的操作都是合併的。

總之,我做了以下事情:

  1. 我修改了程式碼以在 2.2 或預熱階段列印前 70 位,因此,我獲得了以下密鑰流
0110000000000000000000000000000000000000000000000000000000000000000110
  1. 我使用 2.1 部分或密鑰流生成階段生成了 70 位,結果是下面的密鑰流

1110000000000000000000000000000000000000000000000000000000000000000110

如您所見,(1)等於 Nikola 輸出,(2)等於 Henno 輸出。這是一個棘手的練習。不幸的是,沒有提供答案。

引用自:https://crypto.stackexchange.com/questions/22800