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))
Example #5
0
 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}')