def _get_authors(self, authors_path, num_partitions, n_partition): self.authors = np.load(authors_path) printer.print_progress(f'Got {len(self.authors)} unique authors') self.authors = np.array_split(self.authors, num_partitions) printer.print_warning(f'Number of parititions: {len(self.authors)}') self.authors = self.authors[n_partition] printer.print_progress(f'Got {len(self.authors)} unique authors')
def init(self): """ 初始化proj,即新建目录,并在该目录下新建明文和密文目录 :return: None """ def init_action(): if os.path.isdir(self.proj_name): # 如果已经存在项目目录,就需要递归删除该目录 # os.removedirs(self.proj_name) shutil.rmtree(self.proj_name) os.mkdir(self.proj_name) os.mkdir(self.proj_dir_path + 'plain_text') os.mkdir(self.proj_dir_path + 'cipher_text') # 接下来,还要保存配置文件 with open(self.proj_dir_path + 'config', 'wb') as f: pickle.dump([self.k, self.l, self.s, self.file_cnt], f) if os.path.isdir(self.proj_name): printer.print_warning("发现已经存在同名目录,是否需要清除该目录下所有内容? (Y/N)") ok = input() if ok == 'Y' or ok == 'y': printer.print_info("正在清空并初始化中...") init_action() printer.print_success("清空完成!") else: printer.print_info("用户已拒绝操作,程序退出...") return else: printer.print_info("正在初始化项目中...") init_action() printer.print_success("初始化项目完成!")
def generate_keys(self): """ 生成密钥(k1,k2,k3,k4) :return: """ def generate_keys_action(): k1, k2, k3, k4 = self.gen() print('========THE KEY========') print('{}\n{}\n{}\n{}'.format(base64.b64encode(k1).decode(encoding='UTF-8'), base64.b64encode(k2).decode(encoding='UTF-8'), base64.b64encode(k3).decode(encoding='UTF-8'), base64.b64encode(k4).decode(encoding='UTF-8'))) print('========THE KEY========') # 保存密钥 self.save_keys() printer.print_success('密钥文件已保存至本地.') if 2 <= get_status_by_bits(self.status_bits) < 4 or get_status_by_bits(self.status_bits) == 7: # 前面的步骤没有完成时 printer.print_error('操作失败,理由: ') self.status() return if get_status_by_bits(self.status_bits) == 6 or get_status_by_bits(self.status_bits) == 1: # 如果之前已经有了密文集或者已经上传到了服务器 # 需要告知用户谨慎生成密钥文件 printer.print_warning('已发现使用旧密钥加密后的密文集和索引,重新生成密钥需要重新自行执行enc和upload方法进行同步更新.\n' '是否需要继续? (Y/N)') ok = input() if ok == 'Y' or ok == 'y': generate_keys_action() else: printer.print_info('程序没有进行任何操作,退出...') generate_keys_action()
def __init__(self, proj_name, k=0, l=0): self.proj_name = proj_name self.proj_dir_path = proj_name + '/' if os.path.isdir(self.proj_dir_path): # 如果项目已经存在,不需要指定k和l,直接读取参数文件 self.k, self.l = self.load_config()[:2] else: # 检查参数,进行必要的错误或警告报告 if k != 128 and k != 192 and k != 256: printer.print_error('The key length of AES must be 128, 192 or 256 bits.') sys.exit(1) if l % 8 != 0: printer.print_warning('The length of the parameter l is not an integer multiple of 8.') self.k = k self.k = byte_alignment(self.k) self.l = l # 在论文中,参数l需要指定 self.l = byte_alignment(self.l) self.s = scanner.get_s(self.proj_dir_path) # todo self.s = byte_alignment(self.s) # 状态信息变量 self.exists_plain_texts = False # 是否存在明文集 self.exists_cipher_texts = False # 是否存在密文集 self.exists_key_file = False # 是否存在密钥文件 self.exists_proj_dir = False # 是否存在项目文件夹 # 第一位 --> 是否存在项目文件夹 # 第二位 --> 是否存在密钥文件 # 第三位 --> 是否存在密文集 # 第四位 --> 是否存在明文集 self.status_bits = 0 self.set_status_bits() # 判断当前proj的状态 self.T = [None] * (2 ** self.l) self.k1, self.k2, self.k3, self.k4 = None, None, None, None self.load_keys() # self.D = None self.distinct_word_set = None self.D_ = None # EncK(D) step3. initialize a global counter ctr = 1 self.ctr = 1 self.A = [None] * (2 ** self.s) self.entry_size_of_A = -1 self.addrA = {} # 组织成dict结构,用于获取每个链表第一个节点对应于A的位置 self.k0_for_each_keyword = {} self.file_cnt = scanner.get_file_count(self.proj_dir_path) if self.file_cnt == 0: self.file_cnt_byte = 0 else: self.file_cnt_byte = int(math.ceil(math.log2(self.file_cnt) / 8))
def _get_num_of_lines(self): self.number_of_lines = int( subprocess.check_output(["wc", "-l", self.input_path ]).split()[0]) - 1 printer.print_warning(f'Number of lines: {self.number_of_lines}')