def e_SDES_CBC(plaintext, key): undefined = utilities.get_undefined(plaintext, utilities.get_B6Code()) text = utilities.remove_undefined(plaintext, utilities.get_B6Code()) size = int(int(get_SDES_value('block_size')) / 6) blocks = utilities.text_to_blocks(text, size) while len(blocks[-1]) != size: blocks[-1] += 'Q' IV = get_IV() ciphertext = '' for block in blocks: cipher_block = '' for b in block: cipher_block += encode_B6(b) cipher_block = utilities.xor(cipher_block, IV) for i in range(int(get_SDES_value('rounds'))): cipher_block = feistel(cipher_block, get_subKey(key, i + 1)) cipher_block = cipher_block[ int(len(cipher_block) / 2):] + cipher_block[:int(len(cipher_block) / 2)] b_blocks = utilities.text_to_blocks(cipher_block, 6) for b_b in b_blocks: ciphertext += decode_B6(b_b) IV = cipher_block ciphertext = utilities.insert_undefinedList(ciphertext, undefined) return ciphertext
def d_SDES_ECB(ciphertext, key): # your code here if not isinstance(ciphertext, str) or len(ciphertext) == 0: print('Error(d_SDES_ECB): Invalid input', end='') return '' if get_SDES_value('encoding_type') == '' or get_SDES_value( 'block_size') == '' or get_SDES_value('key_size') == '': print('Error(d_SDES_ECB): Invalid configuration', end='') return '' if len(key) == 0: if get_SDES_value('p') == '' or get_SDES_value( 'q') == '' or get_SDES_value('key_size') == '': print('Error(d_SDES_ECB): Invalid key', end='') return '' key = generate_key_SDES() if not utilities.is_binary(key): print('Error(d_SDES_ECB): Invalid key', end='') return '' if len(key) != int(get_SDES_value('key_size')): print('Error(d_SDES_ECB): Invalid key', end='') return '' undefined = utilities.get_undefined(ciphertext, utilities.get_B6Code()) text = utilities.remove_undefined(ciphertext, utilities.get_B6Code()) size = int(int(get_SDES_value('block_size')) / 6) blocks = utilities.text_to_blocks(text, size) plaintext = '' for block in blocks: plain_block = '' for b in block: plain_block += encode_B6(b) rounds = int(get_SDES_value('rounds')) for i in range(rounds): plain_block = feistel(plain_block, get_subKey(key, rounds - i)) plain_block = plain_block[int( len(plain_block) / 2):] + plain_block[:int(len(plain_block) / 2)] b_blocks = utilities.text_to_blocks(plain_block, 6) for b_b in b_blocks: plaintext += decode_B6(b_b) while plaintext[-1] == 'Q': plaintext = plaintext[:-1] plaintext = utilities.insert_undefinedList(plaintext, undefined) return plaintext
def e_SDES_ECB(plaintext, key): # your code here if not isinstance(plaintext, str) or len(plaintext) == 0: print('Error(e_SDES_ECB): Invalid input', end='') return '' if get_SDES_value('encoding_type') == '' or get_SDES_value( 'block_size') == '' or get_SDES_value('key_size') == '': print('Error(e_SDES_ECB): Invalid configuration', end='') return '' if len(key) == 0: if get_SDES_value('p') == '' or get_SDES_value( 'q') == '' or get_SDES_value('key_size') == '': print('Error(e_SDES_ECB): Invalid key', end='') return '' key = generate_key_SDES() if not utilities.is_binary(key): print('Error(e_SDES_ECB): Invalid key', end='') return '' if len(key) != int(get_SDES_value('key_size')): print('Error(e_SDES_ECB): Invalid key', end='') return '' undefined = utilities.get_undefined(plaintext, utilities.get_B6Code()) text = utilities.remove_undefined(plaintext, utilities.get_B6Code()) size = int(int(get_SDES_value('block_size')) / 6) blocks = utilities.text_to_blocks(text, size) while len(blocks[-1]) != size: blocks[-1] += 'Q' ciphertext = '' for block in blocks: cipher_block = '' for b in block: cipher_block += encode_B6(b) for i in range(int(get_SDES_value('rounds'))): cipher_block = feistel(cipher_block, get_subKey(key, i + 1)) cipher_block = cipher_block[ int(len(cipher_block) / 2):] + cipher_block[:int(len(cipher_block) / 2)] b_blocks = utilities.text_to_blocks(cipher_block, 6) for b_b in b_blocks: ciphertext += decode_B6(b_b) ciphertext = utilities.insert_undefinedList(ciphertext, undefined) return ciphertext
def decode_B6(b): b6 = utilities.get_B6Code() if not isinstance(b, str) or len(b)!=6: print('Error(decode_B6): Invalid input') return '' else: c = b6[utilities.bin_to_dec(b)] return c
def encode_B6(c): b6 = utilities.get_B6Code() if not isinstance(c, str) or len(c)!=1: print('Error(encode_B6): invalid input') return '' else: b = utilities.dec_to_bin(b6.index(c),6) return b
def decode(b,codeType): if not utilities.is_binary(b): print('Error(decode): invalid input',end ='') return '' if codeType == 'ASCII': c = chr(utilities.bin_to_dec(b)) elif codeType == 'B6': b6 = utilities.get_B6Code() c = b6[utilities.bin_to_dec(b)] else: print('Error(decode): Unsupported Coding Type',end ='') return '' return c
def decode_B6(b): # your code here if not utilities.is_binary(b): print('Error(decode_B6): invalid input', end='') return '' if len(b) != 6: print('Error(decode_B6): invalid input', end='') return '' b6_code = utilities.get_B6Code() c = b6_code[utilities.bin_to_dec(b)] return c
def d_SDES_OFB(ciphertext, key): undefined = utilities.get_undefined(ciphertext, utilities.get_B6Code()) text = utilities.remove_undefined(ciphertext, utilities.get_B6Code()) size = int(int(get_SDES_value('block_size')) / 6) blocks = utilities.text_to_blocks(text, size) IV = get_IV() plaintext = '' counter = 0 for block in blocks: temp = '' plain_block = IV rounds = int(get_SDES_value('rounds')) for i in range(rounds): plain_block = feistel(plain_block, get_subKey(key, i + 1)) plain_block = plain_block[int( len(plain_block) / 2):] + plain_block[:int(len(plain_block) / 2)] IV = plain_block for b in block: temp += encode_B6(b) if counter <= len(blocks) - 2: plain_block = utilities.xor(plain_block, temp) else: plain_block = utilities.xor(temp, plain_block[:len(temp)]) b_blocks = utilities.text_to_blocks(plain_block, 6) for b_b in b_blocks: plaintext += decode_B6(b_b) counter += 1 plaintext = utilities.insert_undefinedList(plaintext, undefined) return plaintext
def d_SDES_CBC(ciphertext, key): undefined = utilities.get_undefined(ciphertext, utilities.get_B6Code()) text = utilities.remove_undefined(ciphertext, utilities.get_B6Code()) size = int(int(get_SDES_value('block_size')) / 6) blocks = utilities.text_to_blocks(text, size) plaintext = '' IV = get_IV() temp = '' for block in blocks: plain_block = '' for b in block: plain_block += encode_B6(b) temp = plain_block rounds = int(get_SDES_value('rounds')) for i in range(rounds): plain_block = feistel(plain_block, get_subKey(key, rounds - i)) plain_block = plain_block[int( len(plain_block) / 2):] + plain_block[:int(len(plain_block) / 2)] plain_block = utilities.xor(IV, plain_block) b_blocks = utilities.text_to_blocks(plain_block, 6) for b_b in b_blocks: plaintext += decode_B6(b_b) IV = temp while plaintext[-1] == 'Q': plaintext = plaintext[:-1] plaintext = utilities.insert_undefinedList(plaintext, undefined) return plaintext
def encode_B6(c): # your code here if not isinstance(c, str): print('Error(encode_B6): invalid input', end='') return '' if len(c) != 1: print('Error(encode_B6): invalid input', end='') return '' b6_code = utilities.get_B6Code() if c not in b6_code: return '' i = b6_code.index(c) b = utilities.dec_to_bin(i, 6) return b
def d_SDES(ciphertext,key): plaintexttext = '' if isinstance(ciphertext, str) and ciphertext != '': conf = get_SDES_config() k = get_SDES_value('key_size') r = get_SDES_value('rounds') e = get_SDES_value('encoding_type') b = get_SDES_value('block_size') p = get_SDES_value('p') q = get_SDES_value('q') if k!= '' and r != '' and e != '' and b !='': if key == '' and p!= '' and q !='': key = generate_key_SDES() if key!='' and int(k) == len(key): k = int(k) r = int(r) b = int(b) b6_base = utilities.get_B6Code() sv_undef = utilities.get_undefined(ciphertext, b6_base) text = utilities.remove_undefined(ciphertext, b6_base) blk_text = [] while len(text)%2 != 0: text+='Q' for i in range(0,len(text),2): blk_text.append(text[i]+text[i+1]) round = 0 enc_text = [] for x in blk_text: enc_text.append(encode(x[0],e)+encode(x[1],e)) stream = '' for blocks in enc_text: for rounds in range(r): if rounds == 0: rnd_text = blocks ki = get_subKey(key,r-rounds) rnd_text = feistel(rnd_text, ki) if rounds == r-1: m = int(len(rnd_text)//2) Li = rnd_text[:m] Ri = rnd_text[m:] rnd_text = Ri+Li stream += rnd_text plaintext = '' for s in range(0, len(stream), b//2): plaintext+=decode(stream[s:s+b//2], e) plaintext = utilities.insert_undefinedList(plaintext, sv_undef) plaintext = plaintext.strip('Q') elif key!= '' and int(k) != len(key): print('Error(d_SDES): Invalid key') return '' elif key=='' and p == '' or q == '': print('Error(d_SDES): Invalid key') return '' else: print("Error(d_SDES): Invalid configuration") return '' else: print("Error(d_SDES): Invalid input") return '' return plaintext