'SIMECK Encryption in python

I want to input the plaintext with string but i have problem in the source code in python3.

This my code:

#!/usr/bin/env python

NUM_ROUNDS = {
# (block_size, key_size): num_rounds
(32, 64): 32,
(48, 96): 36,
(64, 128): 44,
}


def get_sequence(num_rounds):
if num_rounds < 40:
    states = [1] * 5
else:
    states = [1] * 6

for i in range(num_rounds - 5):
    if num_rounds < 40:
        feedback = states[i + 2] ^ states[i]
    else:
        feedback = states[i + 1] ^ states[i]
    states.append(feedback)

return tuple(states)


class Simeck:
def __init__(self, block_size, key_size, master_key):
    assert (block_size, key_size) in NUM_ROUNDS
    assert 0 <= master_key < (1 << key_size)
    self._block_size = block_size
    self._key_size = key_size
    self._word_size = int(block_size / 2)
    self._num_rounds = NUM_ROUNDS[(block_size, key_size)]
    self._sequence = get_sequence(self._num_rounds)
    self._modulus = 1 << self._word_size
    self.change_key(master_key)

def _LROT(self, x, r):
    assert 0 <= x < self._modulus
    res = (x << r) % self._modulus
    res |= x >> (self._word_size - r)
    return res

def _round(self, round_key, left, right,decrypt):
    assert 0 <= round_key < self._modulus
    assert 0 <= left < self._modulus
    assert 0 <= right < self._modulus
    if decrypt:
        temp =right
        right = left ^ (right & self._LROT(right,5)) ^ self._LROT(right, 1) ^ round_key
        left=temp
    else:
        temp = left
        left = right ^ (left & self._LROT(left, 5)) \
        ^ self._LROT(left, 1) ^ round_key
        right = temp
    # print hex(round_key), hex(left), hex(right)
    return left, right

  def change_key(self, master_key):
    assert 0 <= master_key < (1 << self._key_size)
    states = []
    for i in range(int(self._key_size / self._word_size)):
        states.append(master_key % self._modulus)
        master_key >>= self._word_size

    constant = self._modulus - 4
    round_keys = []
    for i in range(self._num_rounds):
        round_keys.append(states[0])
        left, right = states[1], states[0]
        left, right = self._round(constant ^ self._sequence[i],
                                  left, right,False)
        states.append(left)
        states.pop(0)
        states[0] = right

    self.__round_keys = tuple(round_keys)

  def encrypt(self, plaintext):
    assert 0 <= plaintext < (1 << self._block_size)
    left = plaintext >> self._word_size
    right = plaintext % self._modulus

    for idx in range(self._num_rounds):
        left, right = self._round(self.__round_keys[idx],
                                  left, right, False)

    ciphertext = (left << self._word_size) | right
    return ciphertext

   def decrypt(self, ciphertext):
    assert 0 <= ciphertext < (1 << self._block_size)
    left = ciphertext >> self._word_size
    right = ciphertext % self._modulus

    for idx in range(self._num_rounds - 1, -1, -1):
        left, right = self._round(self.__round_keys[idx], left, right, True)

    plaintext = (left << self._word_size) | right
    return plaintext

def print_test_vector_en(block_size, key_size, key, plain, cipher):
print ('Simeck  : ', block_size, key_size)
print ('key     : ', hex(key)[2:].rstrip('L').zfill(int(key_size / 4)))
print ('plaintext   :', hex(plain)[2:].rstrip('L').zfill(int(block_size / 4)))
print ('ciphertext  : ', hex(cipher)[2:].rstrip('L').zfill(int(block_size / 4)))

def print_test_vector_de(block_size, key_size, key, plain, cipher):
print ('Simeck  : ', block_size, key_size)
print ('key     : ', hex(key)[2:].rstrip('L').zfill(int(key_size / 4)))
print ('ciphertext  :', hex(plain)[2:].rstrip('L').zfill(int(block_size / 4)))
print ('plaintext   : ', hex(cipher)[2:].rstrip('L').zfill(int(block_size / 4)))

def main():
plaintext32_en = '0xtest1234' 
key64 = 0x1918111009080100
simeck32 = Simeck(32, 64, key64)
ciphertext32_en = simeck32.encrypt(plaintext32_en)
ciphertext32_de = (ciphertext32_en)
plaintext32_de = simeck32.decrypt(ciphertext32_de)

print('========Encryption=======')
print_test_vector_en(32, 64, key64, plaintext32_en, ciphertext32_en )

print('========Decryption=======')
print_test_vector_de(32, 64, key64, ciphertext32_de, plaintext32_de)
print
print("\n")

# plaintext48_en = 0x72696320646e
# key96 = 0x1a19181211100a0908020100
# simeck48 = Simeck(48, 96, key96)
# ciphertext48_en = simeck48.encrypt(plaintext48_en)
# ciphertext48_de = (ciphertext48_en)
# plaintext48_de = simeck48.decrypt(ciphertext48_de)

# print('========Encryption=======')
# print_test_vector_en(48, 96, key96, plaintext48_en, ciphertext48_en)
# print('========Decryption=======')
# print_test_vector_de(48, 96, key96, ciphertext48_de, plaintext48_de)
# print
# print("\n")

# plaintext64_en = 0x656b696c20646e75
# key128 = 0x1b1a1918131211100b0a090803020100
# simeck64 = Simeck(64, 128, key128)
# ciphertext64_en = simeck64.encrypt(plaintext64_en)  
# ciphertext64_de = (ciphertext64_en)
# plaintext64_de = simeck64.decrypt(ciphertext64_de)

# print('========Encryption=======')
# print_test_vector_en(64, 128, key128, plaintext64_en, ciphertext64_en)
# print('========Decryption=======')
# print_test_vector_de(64, 128, key128, ciphertext64_de, plaintext64_de)


if __name__ == '__main__':
main()

This my error:

File "simeck_modif_huruf.py", line 163, in main()

File "simeck_modif_huruf.py", line 123, in main ciphertext32_en = simeck32.encrypt(plaintext32_en)

File "simeck_modif_huruf.py", line 83, in encrypt assert 0 <= plaintext < (1 << self._block_size) AssertionError



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source