def encrypt(outfile, blocks, n): e_hex_str = "" for b in blocks: e_num = pow(int(b), e, n) e_numbv = BitVector(intVal=e_num, size=256) e_hex_str = e_hex_str + e_numbv.get_hex_string_from_bitvector() return e_hex_str
def RSA_decrypt(self): f = open("decrypt_hex.txt", 'a') FILEOUT = open(sys.argv[3], 'a') bv = BitVector(filename=sys.argv[2]) while bv.more_to_read: bit_block = bv.read_bits_from_file(256) decrypted = self.CRT(int(bit_block)) decrypted_unpadded = BitVector(intVal=decrypted, size=256)[128:] decrypted_unpadded.write_to_file(FILEOUT) f.write(decrypted_unpadded.get_hex_string_from_bitvector()) FILEOUT.close() return
def encrypt(outfile, blocks, p, q, n, d, pbv, qbv, nbv, dbv): e_hex_str = "" for b in blocks: e_num = pow(int(b), e, n) e_numbv = BitVector(intVal = e_num, size = 256) e_hex_str = e_hex_str + e_numbv.get_hex_string_from_bitvector() writeToFile(outfile, e_hex_str) with open('keys','wb') as fp: cPickle.dump(pbv,fp) cPickle.dump(qbv,fp) cPickle.dump(nbv,fp) cPickle.dump(dbv,fp)
def writeFile(data_block, filename, type, mode): ## Open the output file out = open(filename, 'wa') ## Depending if we're encrypting or decrypting for the size of byte to write ## 256 - Encrypt, 128 - Decrypt for data in data_block: if type: bv = BitVector(intVal=data, size=256) else: bv = BitVector(intVal=data, size=128) if mode: out.write(bv.get_text_from_bitvector()) else: out.write(bv.get_hex_string_from_bitvector())
def RSA_encrypt(self): f = open("encrypt_hex.txt", 'a') FILEOUT = open(sys.argv[3], 'a') self.fix_file(sys.argv[2]) bv = BitVector(filename=sys.argv[2]) while bv.more_to_read: bit_block = bv.read_bits_from_file(128) bit_block.pad_from_right(128 - len(bit_block)) bit_block.pad_from_left(128) encrypted_int = pow(int(bit_block), self.e, self.n) encrypted = BitVector(intVal=encrypted_int, size=256) encrypted.write_to_file(FILEOUT) f.write(encrypted.get_hex_string_from_bitvector()) FILEOUT.close() return
def encrypt(self): hex_files = ['hex1.txt', 'hex2.txt', 'hex3.txt'] enc_files = ['enc1.txt', 'enc2.txt', 'enc3.txt'] for i in range(3): f = open(hex_files[i], 'a') FILEOUT = open(enc_files[i], 'a') self.fix_file(sys.argv[1]) bv = BitVector(filename=sys.argv[1]) while bv.more_to_read: bit_block = bv.read_bits_from_file(128) bit_block.pad_from_right(128 - len(bit_block)) bit_block.pad_from_left(128) encrypted_int = pow(int(bit_block), self.e, self.key_info[i][2]) encrypted = BitVector(intVal=encrypted_int, size=256) encrypted.write_to_file(FILEOUT) f.write(encrypted.get_hex_string_from_bitvector()) FILEOUT.close() return
def getDecryptionSubBox(): dbox = [[0 for i in range(16)] for j in range(16)] modulus = BitVector(bitstring='100011011') n = 8 d = BitVector(bitstring='00000101') for i in range(16): for j in range(16): i_s = bin(i)[2:].zfill(4) j_s = bin(j)[2:].zfill(4) bv = BitVector(bitstring=i_s + j_s) dboxt = bv.deep_copy() for k in range(8): bv[k] = dboxt[(k - 2) % 8] ^ dboxt[(k - 5) % 8] ^ dboxt[ (k - 7) % 8] ^ d[k] if bv.get_hex_string_from_bitvector() != '00': dbox[i][j] = bv.gf_MI(modulus, n) else: dbox[i][j] = BitVector(bitstring='00000000') dbox[i][j] = dbox[i][j].get_hex_string_from_bitvector() return dbox
def crack(self): f = open("cracked_hex.txt", 'a') FILEOUT = open(sys.argv[2], 'a') N = int(self.key_info1[2]) * int(self.key_info2[2]) * int( self.key_info3[2]) enc_files = ['enc1.txt', 'enc2.txt', 'enc3.txt'] bv = BitVector(filename=enc_files[0]) bv2 = BitVector(filename=enc_files[1]) bv3 = BitVector(filename=enc_files[2]) while bv.more_to_read: bit_block = bv.read_bits_from_file(256) bit_block2 = bv2.read_bits_from_file(256) bit_block3 = bv3.read_bits_from_file(256) decrypted = self.CRT(int(bit_block), int(bit_block2), int(bit_block3), N) # VERY UNRELIABLE --> Doesn't always terminate and not always accurate and very slow(May need to do a few runs) decrypted2 = solve_pRoot(3, decrypted) decrypted_unpadded = BitVector(intVal=decrypted2, size=256)[128:] decrypted_unpadded.write_to_file(FILEOUT) f.write(decrypted_unpadded.get_hex_string_from_bitvector()) FILEOUT.close() return