【题目】

实现 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")
        
        
        




Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐