专栏首页大猪的笔记python3 实现rc4 加密

python3 实现rc4 加密

实现rc4库

非常简洁,看代码吧

import base64
import hashlib
import os
from io import BytesIO


class RC4(object):
    def __init__(self, key=None):
        self.key = hashlib.md5(key.encode("utf-8")).hexdigest()

    def encode(self, in_stream, out_stream):
        sbox = self.sbox()
        while 1:
            chunk = in_stream.read(8)

            if not chunk:
                break

            out_chuck = bytearray()
            for bt in chunk:
                out_chuck.append(bt ^ next(sbox))
            out_stream.write(bytes(out_chuck))

    def sbox(self):
        keylength = len(self.key)

        s = list(range(256))  # init S box

        j = 0
        for i in range(255):
            j = (j + s[i] + ord(self.key[i % keylength])) % 256
            s[i], s[j] = s[j], s[i]

        i = 0
        j = 0
        while 1:
            i = (i + 1) % 256
            j = (j + s[i]) % 256
            s[i], s[j] = s[j], s[i]
            yield s[(s[i] + s[j]) % 256]


def encrypt(in_stream: BytesIO, out_stream: BytesIO, pwd: str):
    rc4_cryptor = RC4(pwd)
    rc4_cryptor.encode(in_stream, out_stream)


def encrypt_str(data: str, pwd: str):
    in_stream = BytesIO()
    out_stream = BytesIO()

    data_bytes = data.encode("utf-8")

    # 引入随机IV打乱原文
    iv = os.urandom(1)[0]
    tp_v = iv

    data_xor_iv = bytearray()
    for bt in data_bytes:
        data_xor_iv.append(bt ^ tp_v)
        tp_v = bt ^ tp_v

    in_stream.write(data_xor_iv)
    in_stream.seek(0)

    encrypt(in_stream, out_stream, pwd)

    enc_bytes = bytes([iv]) + out_stream.getvalue()
    b64_str = base64.urlsafe_b64encode(enc_bytes)
    return b64_str.decode("utf-8")


def decrypt_str(data: str, pwd: str):
    data_bytes = base64.urlsafe_b64decode(data)
    in_stream = BytesIO()
    out_stream = BytesIO()

    iv = data_bytes[:1][0]

    in_stream.write(data_bytes[1:])
    in_stream.seek(0)

    encrypt(in_stream, out_stream, pwd)
    dec_bytes = out_stream.getvalue()

    data_xor_iv = bytearray()
    for bt in dec_bytes:
        data_xor_iv.append(bt ^ iv)
        iv = bt

    return data_xor_iv.decode('utf-8')


if __name__ == "__main__":
    test_byte_data = "hello world 世界你好"
    ret = encrypt_str(test_byte_data, 'yzh')
    print(ret)

    ret = decrypt_str(ret, 'yzh')
    print(ret)
    assert test_byte_data == ret

    ret = encrypt_str("1#1500000000", 'yzh')
    print(ret, len(ret))

    ret = encrypt_str("111111#1500000000", 'yzh')
    print(ret, len(ret))

    ret = encrypt_str("99999999#1500000000", 'yzh')
    print(ret, len(ret))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python笔记:字符串

    编码解码非常的复杂,unicode才能encode,其它的编码可以decode成unicode。 所以在python中,推荐使用unicode(python3...

    超级大猪
  • python笔记:生成器表达式,简单查找

    超级大猪
  • 同步工具

    常常修改网站,写了个服务器与本机之间的同步工具。把本机修改了的文件同步到服务器去。其实就像自动化脚本。

    超级大猪
  • 前端基础-什么是正则表达式

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来对字符串的进行匹配。

    cwl_java
  • 大厂面试与工作中常见的正则表达式题目

    1.采用字面量的写法新建的正则表达式对象在代码编译时就会生成,是平常开发中常用的方式;

    前端迷
  • 正则表达式

    小胖
  • Flask 结合 Highcharts 实现动态渲染图表

    最近动态图表可以说火爆全网,我们当然可以通过很多第三方工具来实现该功能,既方便又美观。可是作为折腾不止的我们来说,有没有办法自己手动实现一个简易版的呢,答案当然...

    周萝卜
  • 史上被复制最多的StackOverflow Java代码段中包含一个Bug

    一直以来,被复制使用最多的StackOverflow Java代码段中暗藏一个bug。该代码的作者,Palantir的Java开发人员Andreas Lundb...

    FB客服
  • JavaScript基本类型与引用类型(二)

    前文已经对基本类型和引用类型作了简单的介绍,本文将进一步介绍基本类型和引用类型。 基本包装类型   为了方便操作基本类型的值,JavaScript提供了特殊的引...

    水击三千
  • 手搓一个分布式大气监测系统(一)系统功能与架构概述

    “绿水青山,就是金山银山”,随着我国加强立法,大力投入环境治理,大家已经明显感觉到身边的大气环境在不断改善,那么除了国家气象局的城市级监测数据外,我们身边的微环...

    高树磊

扫码关注云+社区

领取腾讯云代金券