本文共 2717 字,大约阅读时间需要 9 分钟。
【题目】
实现 RC4 算法,具体要求: A. 实现 RC4 算法的加密过程,由用户输入密钥,可以对任意输入的不小于 1M 的文本文件内容进行加密;B. 根据用户输入的加密密钥,对不小于 1M 的文本文件的密文进行解密。
【实现代码】
#!/usr/bin/env python# -*- coding: utf-8 -*-"""Created on Tue Jan 2 19:41:12 2018@author: HP"""import base64import codecsimport timeclass RC4(object): def __init__(self, key = None): if not key: self.key = 'default_key' self.key = key self._init_slist() #初始化s列表 单下划线开头表示权限为protected def _init_slist(self): #初始化s列表 self.slist = [i for i in range(256)] #初始化t列表 length = len(self.key) t = [ord(self.key[i%length]) for i in range(256)] #用t产生s的初始置换 j = 0 for i in range(256): j = (j + self.slist[i] + t[i])%256 self.slist[i], self.slist[j] = self.slist[j], self.slist[i] #加解密 def do_crypt(self, string): i = 0 j = 0 result = [] for s in string: i = (i +1)%256 j = (j + self.slist[j])%256 self.slist[i], self.slist[j] = self.slist[j], self.slist[i] t = (self.slist[i] + self.slist[j])%256 result.append(chr(ord(s)^self.slist[t])) return ''.join(result) #读取文本字符串def getPlainText(route): with codecs.open(route,'r') as f: plainText=f.read() return plainText if __name__=='__main__': prompt = """(e)ncrypt(d)ecrypt(q)uitplesae enter your choice:""" while True: choice = input(prompt) if choice == 'q': break elif choice == 'e': print("***************开始加密******************") fname = input("enter file name: ") key = input("enter the key: ") start = time.time() plaintext = getPlainText(fname) rc4 = RC4(key) ciphertext = rc4.do_crypt(plaintext) ciphertext = base64.b64encode(ciphertext.encode(encoding='utf-8')).decode() f = open(fname, 'w') f.write(ciphertext) f.close() end = time.time() print("加密时长 %.2f s" %(end-start)) elif choice == 'd': print("****************开始解密***************") fname = input("enter file name: ") key = input("enter the key: ") start = time.time() base64_str = getPlainText(fname) ciphertext = base64.b64decode(base64_str.encode(encoding="utf-8")).decode() rc4 = RC4(key) plaintext = rc4.do_crypt(ciphertext) f = open(fname, 'w') f.write(plaintext) f.close() end = time.time() print("解密时长 %.2f s" %(end-start)) else: print("valid input, please try again")
转载地址:http://shaii.baihongyu.com/