Ejemplo n.º 1
0
 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
Ejemplo n.º 3
0
 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
Ejemplo n.º 5
0
 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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
 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
Ejemplo n.º 15
0
 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
Ejemplo n.º 16
0
 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
Ejemplo n.º 23
0
    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
Ejemplo n.º 24
0
    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
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
    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
Ejemplo n.º 28
0
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)
Ejemplo n.º 30
0
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
Ejemplo n.º 31
0
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
Ejemplo n.º 32
0
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)
Ejemplo n.º 33
0
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)
Ejemplo n.º 34
0
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)
Ejemplo n.º 35
0
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"))