博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RC4加解密
阅读量:4095 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
程序员的职业规划
查看>>
c++ 实现python的split,strip函数
查看>>
c++使用Eigen库计算矩阵特征值
查看>>
VS调试时查看动态数组的全部元素
查看>>
ls -l 每一列的含义
查看>>
安装广告拦截插件abp
查看>>
python处理打卡数据的excel表格
查看>>
Linux虚拟机与本地机共享文件夹
查看>>
[JS] 格式化时间长度(formatDuration)
查看>>
[JS] 变量提升
查看>>
[JS] 检查一个对象是否可迭代
查看>>
Java访问类中的私有成员(private member)
查看>>
输出一个集合所有子集的元素和(Print sums of all subsets of a given set)
查看>>
Java中的迭代器(Iterators in Java)
查看>>
Ubuntu 16.04中安装Vim 8.0
查看>>
Java中的迭代器(Iterators in Java)
查看>>
动态规划之最长公共子序列(Longest Common Subsequence)
查看>>
动态规划之编辑距离(Edit Distance)
查看>>
迭代的快速排序(Iterative Quick Sort)
查看>>
快速排序最坏的情况啥时候出现?
查看>>