[plaidctf] Crypto 100




def encrypt(m, N):
    L = numbits(m)
    random.seed()
    r = random.randint(2, N-1)
    x = pow(r, 2, N)
    y = x
    l = 0
    for k in range(0, L):
        l = l << 1
        l |= y & 1
        y = pow(y, 2, N)
    return (m ^ l, y, L)

以上的扣這個是問題的主要部份. 問題的根本建構在 Finite Field上, 隨機挑選一個數字之後, 接續的做次方運算得到下一個數字. 根據要加密文件的 bit 數量, 得到一連串的數字(Sn), 並且只取每個數字的最後一個 bit 來跟本文做 xor 運算而得到密文. 最後會給我們{密文,最後加密數字,本文長度}

舉一個簡單的例子:
  • 給一個 GF(11)的 Finite Field (也就是{0,1,2,3,4,5,6,7,8,9,10})
  • 開始的隨機數字為3.
  • 本文的binary為11010