【题目】
实现 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 base64
import codecs
import time
class 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)uit
plesae 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")