def decrypt_ECB_mode(self, message, padding): array = Translater.from_string_to_intarray(message) decrypt_array = [] for t in range(0, len(array), 8): decrypt_array += self.run(array[0 + t:8 + t], True) decrypt_array = Translater.from_bytarray_to_intarray(decrypt_array) if padding: decrypt_array = Padding.undo_padding(decrypt_array, self.type_padding) return Translater.from_intarray_to_string(decrypt_array)
def decrypt_CFB_mode(self, message, padding, IV): array = Translater.from_string_to_intarray(message) Y_prev = IV decrypt_array = [] for t in range(0, len(array), 8): Y = array[0 + t:8 + t] decrypt_array += Translater.xor_intarray_64(Y, self.run(Y_prev)) Y_prev = Y if padding: decrypt_array = Padding.undo_padding(decrypt_array, self.type_padding) return Translater.from_intarray_to_string(decrypt_array)
def encrypt_ECB_mode(self, message): array = Padding.do_padding(Translater.from_string_to_intarray(message), self.type_padding) paddingBoolean = array[1] array = array[0] encrypt_array = [] print array for t in range(0, len(array), 8): encrypt_array += self.run(array[0 + t:8 + t], False) return ciphertext(Translater.from_intarray_to_string(encrypt_array), paddingBoolean)
def decrypt_CTR_mode(self, message, padding, IV): array = Translater.from_string_to_intarray(message) decrypt_array = [] S = self.run(IV) for t in range(0, len(array), 8): S = Translater.sum_intarray_64(S, 1) decrypt_array += Translater.xor_intarray_64( array[0 + t:8 + t], self.run(S)) if padding: decrypt_array = Padding.undo_padding(decrypt_array, self.type_padding) return Translater.from_intarray_to_string(decrypt_array)
def encrypt_CBC_mode(self, message): Y = IV = self.generate_IV() array = Padding.do_padding(Translater.from_string_to_intarray(message), self.type_padding) paddingBoolean = array[1] encrypt_array = [] array = array[0] for t in range(0, len(array), 8): Y = self.run(Translater.xor_intarray_64(array[0 + t:8 + t], Y)) encrypt_array += Y return ciphertext(Translater.from_intarray_to_string(encrypt_array), paddingBoolean, Translater.from_intarray_to_string(IV))
def f3(self, D, roundn): I = Translater.rotate_shift_left( Translater.mode_32(self.keyM[roundn] - D), Translater.get_last_bites(self.keyR[roundn], 5)) return Translater.mode_32(( (S1[Translater.get_byte(I, 0x0)] + S2[Translater.get_byte(I, 0x1)]) ^ S3[Translater.get_byte(I, 0x2)]) - S4[Translater.get_byte(I, 0x3)])
def ecncrypt_CTR_mode(self, message): IV = self.generate_IV() array = Padding.do_padding(Translater.from_string_to_intarray(message), self.type_padding) paddingBoolean = array[1] encrypt_array = [] array = array[0] S = self.run(IV) for t in range(0, len(array), 8): S = Translater.sum_intarray_64(S, 1) encrypt_array += Translater.xor_intarray_64( array[0 + t:8 + t], self.run(S)) return ciphertext(Translater.from_intarray_to_string(encrypt_array), paddingBoolean, Translater.from_intarray_to_string(IV))
def decrypt(self, message, padding, IV=None): if self.type_mode == 1: return self.decrypt_ECB_mode(message, padding) IV = Translater.from_string_to_intarray(IV) if self.type_mode == 2: return self.decrypt_CFB_mode(message, padding, IV) if self.type_mode == 3: return self.decrypt_CBC_mode(message, padding, IV) return self.decrypt_CTR_mode(message, padding, IV)
def run(self, message, reverse=False): """Function which encrypt or decrypt message(it depends on the value of var reverse(Boolean)), using Feistel's net.""" L = message[:4] L = (L[0] << 24) + (L[1] << 16) + (L[2] << 8) + L[3] R = message[4:] R = (R[0] << 24) + (R[1] << 16) + (R[2] << 8) + R[3] L_next = R_next = 0 for i in range(0, 16): L_next = R if reverse: R_next = L ^ self.non_identical_rounds(R, 15 - i) else: R_next = L ^ self.non_identical_rounds(R, i) L = L_next R = R_next return Translater.from_bytarray_to_intarray([R, L])