def test_CTR_plus_CBC(self): msg = "Hello, world!" key1 = crypto.rand_bytes(32) key2 = crypto.rand_bytes(32) magma = crypto.Magma(key1) # with standard SBOX grass = crypto.Grasshopper(key2) # create encryption modes ctr = crypto.CTR(grass) cbc = crypto.CBC(magma) # standard padding type 2 # IV's for encryption modes iv1 = crypto.rand_bytes(ctr.blen // 2) iv2 = crypto.rand_bytes(cbc.blen) # set new IV's instead of zeros ctr.set_iv(iv1) cbc.set_iv(iv2) encoded = msg.encode() # NB : ctxt1 is of length 13 bytes # padding for CBC is needed # it is done internally (pad2) ctxt1 = ctr.encrypt(encoded) ctxt2 = cbc.encrypt(ctxt1) # here we decrypt and unpad internally new_ctxt1 = cbc.decrypt(ctxt2) new_txt = ctr.decrypt(new_ctxt1) self.assertEqual(new_txt.decode(), msg)
def test_grasshopper(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") ctxt = crypto.hexdec("7f679d90bebc24305a468d42b9d4edcd") cipher = crypto.Grasshopper(key) ctxt2 = cipher.encrypt(txt) txt2 = cipher.decrypt(ctxt2) self.assertEqual(ctxt, ctxt2) self.assertEqual(txt, txt2)
def encrypt(self, key, iv=None): if iv is None: iv = rand_bytes(16) data = self.encode() cipher = crypto.Grasshopper(key) cbc = crypto.CBC(cipher) cbc.set_iv(iv) reply = cbc.encrypt(data) reply = iv + reply return reply
def test_CTR(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") txt += crypto.hexdec("00112233445566778899aabbcceeff0a") txt += crypto.hexdec("112233445566778899aabbcceeff0a00") txt += crypto.hexdec("2233445566778899aabbcceeff0a0011") cip = crypto.Grasshopper(key) IV = crypto.hexdec('1234567890abcef0') mode = crypto.CTR(cip) mode.set_iv(IV) ctxt = mode.encrypt(txt) res = crypto.hexdec('f195d8bec10ed1dbd57b5fa240bda1b8') res += crypto.hexdec('85eee733f6a13e5df33ce4b33c45dee4') res += crypto.hexdec('a5eae88be6356ed3d5e877f13564a3a5') res += crypto.hexdec('cb91fab1f20cbab6d1c6d15820bdba73') self.assertEqual(ctxt, res)
def test_ECB(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") txt += crypto.hexdec("00112233445566778899aabbcceeff0a") txt += crypto.hexdec("112233445566778899aabbcceeff0a00") txt += crypto.hexdec("2233445566778899aabbcceeff0a0011") cip = crypto.Grasshopper(key) mode = crypto.ECB(cip, pad = lambda x : crypto.pad1(x, cip.blen), unpad = lambda x : crypto.pad1(x, cip.blen)) ctxt = mode.encrypt(txt) res = crypto.hexdec("7f679d90bebc24305a468d42b9d4edcd") res += crypto.hexdec("b429912c6e0032f9285452d76718d08b") res += crypto.hexdec("f0ca33549d247ceef3f5a5313bd4b157") res += crypto.hexdec("d0b09ccde830b9eb3a02c4c5aa8ada98") self.assertEqual(ctxt, res)
def test_OFB(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") txt += crypto.hexdec("00112233445566778899aabbcceeff0a") txt += crypto.hexdec("112233445566778899aabbcceeff0a00") txt += crypto.hexdec("2233445566778899aabbcceeff0a0011") cip = crypto.Grasshopper(key) IV = crypto.hexdec('1234567890abcef0a1b2c3d4e5f00112') IV += crypto.hexdec('23344556677889901213141516171819') mode = crypto.OFB(cip) mode.set_iv(IV) ctxt = mode.encrypt(txt) res = crypto.hexdec('81800a59b1842b24ff1f795e897abd95') res += crypto.hexdec('ed5b47a7048cfab48fb521369d9326bf') res += crypto.hexdec('66a257ac3ca0b8b1c80fe7fc10288a13') res += crypto.hexdec('203ebbc066138660a0292243f6903150') self.assertEqual(ctxt, res)
def test_CFB(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") txt += crypto.hexdec("00112233445566778899aabbcceeff0a") txt += crypto.hexdec("112233445566778899aabbcceeff0a00") txt += crypto.hexdec("2233445566778899aabbcceeff0a0011") cip = crypto.Grasshopper(key) IV = crypto.hexdec('1234567890abcef0a1b2c3d4e5f00112') IV += crypto.hexdec('23344556677889901213141516171819') mode = crypto.CFB(cip, pad = lambda x : crypto.pad1(x, cip.blen), unpad = lambda x : crypto.pad1(x, cip.blen)) mode.set_iv(IV) ctxt = mode.encrypt(txt) res = crypto.hexdec('81800a59b1842b24ff1f795e897abd95') res += crypto.hexdec('ed5b47a7048cfab48fb521369d9326bf') res += crypto.hexdec('79f2a8eb5cc68d38842d264e97a238b5') res += crypto.hexdec('4ffebecd4e922de6c75bd9dd44fbf4d1') self.assertEqual(ctxt, res)
def test_CBC(self): key = crypto.hexdec("8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef") txt = crypto.hexdec("1122334455667700ffeeddccbbaa9988") txt += crypto.hexdec("00112233445566778899aabbcceeff0a") txt += crypto.hexdec("112233445566778899aabbcceeff0a00") txt += crypto.hexdec("2233445566778899aabbcceeff0a0011") cip = crypto.Grasshopper(key) IV = crypto.hexdec('1234567890abcef0a1b2c3d4e5f00112') IV += crypto.hexdec('23344556677889901213141516171819') mode = crypto.CBC(cip, pad = lambda x : crypto.pad1(x, cip.blen), unpad = lambda x : crypto.pad1(x, cip.blen)) mode.set_iv(IV) ctxt = mode.encrypt(txt) res = crypto.hexdec('689972d4a085fa4d90e52e3d6d7dcc27') res += crypto.hexdec('2826e661b478eca6af1e8e448d5ea5ac') res += crypto.hexdec('fe7babf1e91999e85640e8b0f49d90d0') res += crypto.hexdec('167688065a895c631a2d9a1560b63970') self.assertEqual(ctxt, res)