def test_simon128_256(self): block_size = 128 key_size = 256 for x in range(self.test_cnt): key = randint(0, (2**key_size) - 1) plaintxt = randint(0, (2**block_size) - 1) c = SimonCipher(key, key_size, block_size, 'ECB') assert c.decrypt(c.encrypt(plaintxt)) == plaintxt, 'Test %r Failed with Random Key %r and Random Plaintext %r' % (x, hex(key), hex(plaintxt))
def test_simon128_256(self): key = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100 plaintxt = 0x74206e69206d6f6f6d69732061207369 ciphertxt = 0x8d2b5579afc8a3a03bf72a87efe7b868 block_size = 128 key_size = 256 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon96_144(self): key = 0x1514131211100d0c0b0a0908050403020100 plaintxt = 0x74616874207473756420666f ciphertxt = 0xecad1c6c451e3f59c5db1ae9 block_size = 96 key_size = 144 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon64_96(self): key = 0x131211100b0a090803020100 plaintxt = 0x6f7220676e696c63 ciphertxt = 0x5ca2e27f111a8fc8 block_size = 64 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon96_96(self): key = 0x0d0c0b0a0908050403020100 plaintxt = 0x2072616c6c69702065687420 ciphertxt = 0x602807a462b469063d8ff082 block_size = 96 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon64_128(self): key = 0x1b1a1918131211100b0a090803020100 plaintxt = 0x656b696c20646e75 ciphertxt = 0x44c8fc20b9dfa07a block_size = 64 key_size = 128 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon64_96(self): key = 0x131211100b0a090803020100 plaintxt = 0x6f7220676e696c63 ciphertxt = 0x5ca2e27f111a8fc8 block_size = 64 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon64_128(self): key = 0x1b1a1918131211100b0a090803020100 plaintxt = 0x656b696c20646e75 ciphertxt = 0x44c8fc20b9dfa07a block_size = 64 key_size = 128 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon48_72(self): key = 0x1211100a0908020100 plaintxt = 0x6120676e696c ciphertxt = 0xdae5ac292cac block_size = 48 key_size = 72 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon48_96(self): key = 0x1a19181211100a0908020100 plaintxt = 0x72696320646e ciphertxt = 0x6e06a5acf156 block_size = 48 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon32_64(self): key = 0x1918111009080100 plaintxt = 0x65656877 ciphertxt = 0xc69be9bb block_size = 32 key_size = 64 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon128_192(self): key = 0x17161514131211100f0e0d0c0b0a09080706050403020100 plaintxt = 0x206572656874206e6568772065626972 ciphertxt = 0xc4ac61effcdc0d4f6c9c8d6e2597b85b block_size = 128 key_size = 192 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_ofb_mode_chain(self): plaintxts = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ciphertexts = [c.encrypt(x) for x in plaintxts] c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) decryptexts = [c.decrypt(x) for x in ciphertexts] assert plaintxts == decryptexts
def test_simon128_128(self): key = 0x0f0e0d0c0b0a09080706050403020100 plaintxt = 0x63736564207372656c6c657661727420 ciphertxt = 0x49681b1e1e54fe3f65aa832af84e0bbc block_size = 128 key_size = 128 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon128_192(self): key = 0x17161514131211100f0e0d0c0b0a09080706050403020100 plaintxt = 0x206572656874206e6568772065626972 ciphertxt = 0xc4ac61effcdc0d4f6c9c8d6e2597b85b block_size = 128 key_size = 192 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon128_256(self): key = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100 plaintxt = 0x74206e69206d6f6f6d69732061207369 ciphertxt = 0x8d2b5579afc8a3a03bf72a87efe7b868 block_size = 128 key_size = 256 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon48_72(self): key = 0x1211100a0908020100 plaintxt = 0x6120676e696c ciphertxt = 0xdae5ac292cac block_size = 48 key_size = 72 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon48_96(self): key = 0x1a19181211100a0908020100 plaintxt = 0x72696320646e ciphertxt = 0x6e06a5acf156 block_size = 48 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon96_96(self): key = 0x0d0c0b0a0908050403020100 plaintxt = 0x2072616c6c69702065687420 ciphertxt = 0x602807a462b469063d8ff082 block_size = 96 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon32_64(self): key = 0x1918111009080100 plaintxt = 0x65656877 ciphertxt = 0xc69be9bb block_size = 32 key_size = 64 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon128_128(self): key = 0x0f0e0d0c0b0a09080706050403020100 plaintxt = 0x63736564207372656c6c657661727420 ciphertxt = 0x49681b1e1e54fe3f65aa832af84e0bbc block_size = 128 key_size = 128 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_simon96_144(self): key = 0x1514131211100d0c0b0a0908050403020100 plaintxt = 0x74616874207473756420666f ciphertxt = 0xecad1c6c451e3f59c5db1ae9 block_size = 96 key_size = 144 c = SimonCipher(key, key_size, block_size, 'ECB') assert c.encrypt(plaintxt) == ciphertxt assert c.decrypt(ciphertxt) == plaintxt
def test_ofb_mode_chain(self): plaintxts = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ciphertexts = [c.encrypt(x) for x in plaintxts] c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) decryptexts = [c.decrypt(x) for x in ciphertexts] assert plaintxts == decryptexts
def test_ctr_mode_single_cycle(self): self.counter = 0x01 c = SimonCipher(self.key, self.key_size, self.block_size, 'CTR', init=self.iv, counter=self.counter) ctr_out = c.encrypt(self.plaintxt) self.counter = 0x01 c = SimonCipher(self.key, self.key_size, self.block_size, 'CTR', init=self.iv, counter=self.counter) output_plaintext = c.decrypt(ctr_out) assert output_plaintext == self.plaintxt
def test_ofb_mode_equivalent(self): c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ofb_encrypt = c.encrypt(self.plaintxt) c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ofb_decrypt = c.decrypt(ofb_encrypt) c = SimonCipher(self.key, self.key_size, self.block_size, 'ECB') ecb_out = c.encrypt(self.iv) ofb_equivalent_encrypt = ecb_out ^ self.plaintxt ofb_equivalent_decrypt = ecb_out ^ ofb_equivalent_encrypt assert ofb_encrypt == ofb_equivalent_encrypt assert ofb_decrypt == ofb_equivalent_decrypt
def test_ctr_mode_single_cycle(self): self.counter = 0x01 c = SimonCipher(self.key, self.key_size, self.block_size, 'CTR', init=self.iv, counter=self.counter) ctr_out = c.encrypt(self.plaintxt) self.counter = 0x01 c = SimonCipher(self.key, self.key_size, self.block_size, 'CTR', init=self.iv, counter=self.counter) output_plaintext = c.decrypt(ctr_out) assert output_plaintext == self.plaintxt
def test_ofb_mode_equivalent(self): c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ofb_encrypt = c.encrypt(self.plaintxt) c = SimonCipher(self.key, self.key_size, self.block_size, 'OFB', init=self.iv) ofb_decrypt = c.decrypt(ofb_encrypt) c = SimonCipher(self.key, self.key_size, self.block_size, 'ECB') ecb_out = c.encrypt(self.iv) ofb_equivalent_encrypt = ecb_out ^ self.plaintxt ofb_equivalent_decrypt = ecb_out ^ ofb_equivalent_encrypt assert ofb_encrypt == ofb_equivalent_encrypt assert ofb_decrypt == ofb_equivalent_decrypt
def test_speck64_96(keyi): key = binascii.hexlify(keyi) print key key = int("0x" + key, 16) plaintxt = 0x6d564d37426e6e71 ciphertxt = 0xbb5d12ba422834b5 block_size = 64 key_size = 96 c = SimonCipher(key, key_size, block_size, 'ECB') print hex(c.encrypt(plaintxt)) if c.encrypt(plaintxt) == ciphertxt: print keyi if c.decrypt(ciphertxt) == plaintxt: print keyi
def test_cbc_mode_single(self): c = SimonCipher(self.key, self.key_size, self.block_size, 'CBC', init=self.iv) cbc_out = c.encrypt(self.plaintxt) c = SimonCipher(self.key, self.key_size, self.block_size, 'ECB') cbc_equivalent = c.encrypt(self.iv ^ self.plaintxt) assert cbc_out == cbc_equivalent c = SimonCipher(self.key, self.key_size, self.block_size, 'CBC', init=self.iv) cbc_out = c.decrypt(cbc_out) c = SimonCipher(self.key, self.key_size, self.block_size, 'ECB') cbc_equivalent = c.decrypt(cbc_equivalent) ^ self.iv assert hex(cbc_out) == hex(cbc_equivalent) == hex(self.plaintxt)
class Simon: def __init__(self, key_size, blocklength): if key_size != 96: raise InvalidKeyLength("Keylength of Simon must be 96 bits!") if blocklength % 64 != 0: raise InvalidCipherBlockLength("Blocklength of Simon should be multiplier of 64") self._key = None self._key_size = key_size self._blocklength = blocklength def set_key(self, key): hex_key = bits_to_hex(key) self._key = SimonCipher(hex_key, key_size=96, block_size=64) def encrypt(self, message): split_message = [message[x:x+64] for x in range(0, len(message), 64)] encrypted_message = [] for single_message in split_message: hex_message = bits_to_hex(single_message) encrypted_hex = self._key.encrypt(hex_message) encrypted_message = encrypted_message + hex_to_bits(encrypted_hex, 64) return encrypted_message def decrypt(self, message): split_message = [message[x:x + 64] for x in range(0, len(message), 64)] decrypted_message = [] for single_message in split_message: hex_message = bits_to_hex(single_message) decrypted_hex = self._key.decrypt(hex_message) decrypted_message = decrypted_message + hex_to_bits(decrypted_hex, 64) return decrypted_message
def argon2_test(): start = time.time() ph = PasswordHasher() hash = ph.hash(password) hashed = hashlib.sha256(hash).digest() end = time.time() print "argon2 : ",(end-start) start = time.time() obj =AES.new(hashed,AES.MODE_CBC, 'This is an IV456') ciphertext = obj.encrypt("The answer is no") end = time.time() print "AES Encrypt: ",(end-start)*1000 start = time.time() obj =AES.new(hashed,AES.MODE_CBC, 'This is an IV456') plaintext = obj.decrypt(ciphertext) end = time.time() print "AES Decrypt: ",(end-start)*1000 my_plaintext = 0xCCCCAAAA55553333 start = time.time() big_cipher = SimonCipher(0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF0000, key_size=256, block_size=128) simon = big_cipher.encrypt(my_plaintext) end = time.time() print "Simon Encrypt: ",(end-start)*1000 start = time.time() big_cipher1 = SpeckCipher(0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF0000, key_size=256, block_size=128) speck = big_cipher1.encrypt(my_plaintext) end = time.time() print "Speck Encrypt: ",(end-start)*1000 start = time.time() big_cipher = SimonCipher(0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF0000, key_size=256, block_size=128) plain = big_cipher.decrypt(simon) end = time.time() print plain print "Simon Decrypt: ",(end-start)*1000 start = time.time() big_cipher1 = SpeckCipher(0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF0000, key_size=256, block_size=128) plain = big_cipher1.decrypt(speck) end = time.time() print plain print "Speck Decrypt: ",(end-start)*1000
block_size = 64 key_size = 96 S = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgihjklmnopqrstuvwxyz0123456789_' for a in S[-5:]: for b in S: print(a + b + "..") for c in S: for d in S: key = s2n('SECCON{%s}' % str(a + b + c + d)) if a + b + c + d == 'FLAG': print(key) cryp = SimonCipher(key, key_size, block_size, 'ECB') if plaintxt == cryp.decrypt(ciphertxt): print("?????") print(a + b + c + d) exit(1) key == "SECCON{6Pz0}" # flag = 'FLAG' # key = s2n('SECCON{%s}' % flag) # print(key) # cryp = SimonCipher(key, key_size, block_size, 'ECB') # cipher = cryp.encrypt(plaintxt) # plaintxt = cryp.decrypt(ciphertxt) # print(cipher) # print(plaintxt)
def main(): random.seed(1) a = p521.create_private() b = p521.create_private() A = p521.create_public(a) B = p521.create_public(b) print('a =', hex(a)) print('b =', hex(b)) print('A = (' + hex(A[0]) + ', ' + hex(A[1]) + ')') print('B = (' + hex(B[0]) + ', ' + hex(B[1]) + ')') a_prime = p521.create_private() b_prime = p521.create_private() A_prime = p521.create_public(a_prime) B_prime = p521.create_public(b_prime) print('a\' =', hex(a)) print('b\' =', hex(b)) print('A\' = (' + hex(A_prime[0]) + ', ' + hex(A_prime[1]) + ')') print('B\' = (' + hex(B_prime[0]) + ', ' + hex(B_prime[1]) + ')') y_sign = p521.determine_sign(A_prime[1]) A_prime_c = p521.point_compression(hex(A_prime[0]), y_sign) # "Bond. James Bond." message = '426f6e642e204a616d657320426f6e642e' A_p_m = A_prime_c + message str_sha3_hash = hashlib.new('sha3_512', A_p_m.encode()).hexdigest() sha3_hash = int(str_sha3_hash, 16) x = p521.create_ephemeral() print('ephemeral x =', x) (r, s) = p521.sign(sha3_hash, x, a) str_r = hex(r)[2:].zfill(132) str_s = hex(s)[2:].zfill(132) text = str_r + str_s + A_p_m k = p521.point_mul(B[0], B[1], x) print('Alice computes secret key k =', hex(k[0])) y_sign = p521.determine_sign(k[1]) k_x = p521.point_compression(hex(k[0]), y_sign) my_simon = SimonCipher(k[0], key_size=256, block_size=128) plaintext = simon_prep(text) X = p521.base_point_mul(x) y_sign = p521.determine_sign(X[1]) X_x = p521.point_compression(hex(X[0]), y_sign) print('before ecnryption X_x =', X_x) print('before encryption r = ' + str_r) print('before encryption s = ' + str_s) print('before encryption A\' = ' + A_prime_c) print('before encryption message = ' + message) ciphertext = [] for t in plaintext: ciphertext.append(my_simon.encrypt(int(t, 16))) ciphertext.insert(0, X_x) text = '' for i in range(1, len(ciphertext)): text = text + hex(ciphertext[i])[2:] print('after ecnryption X_x =', X_x) print('after encryption (r, s, A\', message) = ' + text) recovered_X = p521.point_decompression(ciphertext[0]) recovered_k = p521.point_mul(recovered_X[0], recovered_X[1], b) print('Bob computes secret key k =', hex(recovered_k[0])) print('It is ' + str(k[0] == recovered_k[0]) + ' that Alice and Bob compute the same scret key') ciphertext = ciphertext[1:] my_simon = SimonCipher(recovered_k[0], key_size=256, block_size=128) recovered_text = [] for t in ciphertext: recovered_text.append(hex(my_simon.decrypt(t))[2:]) (recovered_r, recovered_s, recovered_A_prime, recovered_message) = recover(recovered_text, r) (signature_verified, key_used) = p521.verify(recovered_r, recovered_s, A, recovered_A_prime, sha3_hash) if (signature_verified): print('signature verified with key ' + key_used) print('after decryption X_x =', X_x) print('after decryption =', hex(recovered_r)) print('after decryption s =', hex(recovered_s)) print('after decryption A\' = (' + hex(recovered_A_prime[0]) + ', ' + hex(recovered_A_prime[1]) + ')') if (A_prime[0] == recovered_A_prime[0] and A_prime[1] == recovered_A_prime[1]): print('test case for compressing and decompressing A\' works') print('efter decryption message = ' + message)
from simon import SimonCipher #my_simon = SimonCipher(0xABBAABBAABBAABBAABBAABBAABBAABBA) tiny_cipher = SimonCipher(0x123456789ABCDEF0, key_size=72, block_size=48) my_plaintext = bytes([0x11, 0x22, 0x33]) simon_ciphertext = tiny_cipher.encrypt(my_plaintext) print(simon_ciphertext) simon_plaintext = tiny_cipher.decrypt(simon_ciphertext) print(simon_plaintext) a = simon_plaintext.decode("hex") print(a)
import random import binascii from simon import SimonCipher key_plain = os.environ['flag'].encode("utf-8") key_encoded = int.from_bytes(key_plain, "big") my_simon = SimonCipher(key_encoded) my_plaintext = ''.join( random.SystemRandom().choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range((8))).encode("utf-8") my_plaintext_encoded = int.from_bytes(my_plaintext, "big") simon_ciphertext = my_simon.encrypt(my_plaintext_encoded) simon_plaintext = my_simon.decrypt(simon_ciphertext) print(key_plain) print(my_plaintext_encoded) print(simon_plaintext) print(my_plaintext) print(simon_plaintext.to_bytes(8, "big").decode("utf-8")) with open("/usr/src/app/data/plain", "wb") as fd: fd.write(my_plaintext) with open("/usr/src/app/data/cipher", "wb") as fd: fd.write(simon_ciphertext.to_bytes(16, "big"))