跳转至

Simon and Speck Block Ciphers

這是一組姐妹輕量級加密。

Simon Block Cipher

基本介紹

Simon 塊加密算法由 NSA 2013 年 6 月公佈,主要在硬件實現上進行了優化。

Simon Block Cipher 是平衡的 Feistel cipher 加密,一共有兩塊,若每塊加密的大小爲 n bits,那麼明文的大小就是 2n bits。此外,一般來說,該加密中所使用的密鑰長度是塊長度的整數倍,比如 2n,4n等。常見的 Simon 加密算法有

一般來說,Simon 算法稱之爲 Simon 2n/nm,n 爲塊大小,m 是塊大小與密鑰之間的倍數。比如說 Simon 48/96 就是指明文是 48 比特,密鑰是 96 比特的加密算法。

此外,對於 Simon 塊加密算法來說,每輪的加密過程一樣,如下

當然,對於每一輪以及不同的 m 來說,密鑰也會有所不同

其中, z_j 是由 Linear Feedback Shift Register (LFSR) 生成的,雖然對於不同的 z_j 的邏輯不同,但是初始向量是固定的。

Constant
z_{0}=11111010001001010110000111001101111101000100101011000011100110
z_{1}=10001110111110010011000010110101000111011111001001100001011010
z_{2}=10101111011100000011010010011000101000010001111110010110110011
z_{3}=11011011101011000110010111100000010010001010011100110100001111
z_{4}=11010001111001101011011000100000010111000011001010010011101111

2017 SECCON Simon and Speck Block Ciphers

題目描述如下

Simon and Speck Block Ciphers

https://eprint.iacr.org/2013/404.pdf Simon_96_64, ECB, key="SECCON{xxxx}", plain=0x6d564d37426e6e71, cipher=0xbb5d12ba422834b5

從名字中可以看出密鑰是 96 比特(12 byte),明文是 64 比特(8字節),而密鑰已經給出了 8 個字節,只剩下四個字節未知。那我們可以使用暴力破解的方法。這裏從 https://github.com/bozhu/NSA-ciphers/blob/master/simon.py 獲取了一份 simon 加密算法。

具體如下

from pwn import *
from simon import SIMON

plain = 0x6d564d37426e6e71
cipher = 0xbb5d12ba422834b5


def compare(key):
    key = "SECCON{" + key + "}"
    key = key.encode('hex')
    key = int(key, 16)
    my_simon = SIMON(64, 96, key)
    test = my_simon.encrypt(plain)
    if test == cipher:
        return True
    else:
        return False


def solve():
    visible = string.uppercase + string.lowercase + string.digits + string.punctuation + " "
    key = pwnlib.util.iters.mbruteforce(compare, visible, 4, method="fixed")
    print key


if __name__ == "__main__":
    solve()

結果如下

  2017_seccon_simon_and_speck_block_ciphers git:(master) python exp.py
[+] MBruteforcing: Found key: "6Pz0"

參考文獻