吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 154|回复: 9
上一主题 下一主题
收起左侧

[学习记录] 使用python及参考部分资料实现的rc4加密算法,如有错误欢迎指正。

[复制链接]
跳转到指定楼层
楼主
BlackPig1234 发表于 2026-3-17 19:09 回帖奖励
# 1.初始化S表
s = list(range(256))

# 2.用种子密钥来填充k表
k = []
# 输入种子密钥,填充K表
seed = input("请输入连续数字的种子密钥:")
key_seed = [int(c) for c in seed]
length_ks = len(key_seed)

if length_ks >= 255:
    for i in range(0, 256):
        k.append(key_seed[i])
else:
    for i in range(0, 256):
        # 如果长度大于255
        if i < length_ks:
            k.append(key_seed[i])
        else:
            # 如果种子长度小于255,需要循环进行填充
            k.append(key_seed[i % length_ks])

# 用K表对S表进行置换
j = 0
for i in range(0, 256):
    j = (j + s[i] + k[i]) % 256
    # 交换S表中两个位置的变量
    s[i], s[j] = s[j], s[i]

# 密钥形成了,下一步形成流密钥
def ral_key(length):
    """
    用来形成最后真正的流密钥
    :param length: 需要加密的明文长度
    :return: rk[]需要异或的真正的流密码
    """
    global s  # 使用全局的S盒
    rk = []  # 记录真正的流密钥
    i = j = 0
    # 将s盒进行复制,防止操作修改全局S盒,因为python是引用传递
    s_copy = s.copy()
    for r in range(0, length):
        i = (i + 1) % 256
        j = (j + s_copy[i]) % 256
        # 交换i与j之间的s表值
        s_copy[i], s_copy[j] = s_copy[j], s_copy[i]
        t = (s_copy[i] + s_copy[j]) % 256
        rk.append(s_copy[t])
    return rk

def RC4(text):
    """
    加密函数,使用密钥流对明文进行异或
    :param text: 加密的明文字符串
    :return: 密文
    """
    # 明文转字节列表
    text_bytes = [ord(c) for c in text]

    # 生成等长流密钥
    rk = ral_key(len(text_bytes))

    # 异或加密
    mi_text = []
    for i in range(len(text_bytes)):
        mi_text.append(text_bytes[i] ^ rk[i])  # 修正:异或操作,用append

    return mi_text

def De_RC4(mi_text):
    """
    解密函数
    :param rk: 加密的流密钥
    :param mi_text: 密文
    :return: 明文
    """
    # 生成相同流密钥(需要相同的初始S盒,所以real_key会复制S盒)
    rk = ral_key(len(mi_text))

    # 异或解密(与加密相同操作)
    ming_text = []
    for i in range(len(mi_text)):
        ming_text.append(mi_text[i] ^ rk[i])

    # 字节转字符串
    return ''.join(chr(b) for b in ming_text)

if __name__ == "__main__":
    print("\n" + "="* 50)

    # 输入明文
    plaintext = input("请输入要加密的明文:")

    # 加密
    cipher = RC4(plaintext)
    print(f"\n加密完成!")
    print(f"密文长度:{len(cipher)} 字节")
    print(f"密文(hex):", ''.join(f'{b:02x}' for b in cipher))
    print(f"密文(数字):{cipher}")

    # 加密
    print("\n" + "-"*50)
    decryted = De_RC4(cipher)
    print(f"解密完成!")
    print(f"解密结果:{decryted}")

    # 验证
    if decryted == plaintext:
        print("\n√ 验证成功:解密结果与原文一致!")
    else:
        print("\n× 验证失败!")

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Snxiolng + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
Hernnin 发表于 2026-3-17 21:14
不错,学到了
3#
Candy123Y 发表于 2026-3-17 21:30
4#
longoom313 发表于 2026-3-17 21:46
5#
zljxaoshuai 发表于 2026-3-17 21:48
非常完没解决
6#
lnzdl 发表于 2026-3-17 21:52
学习了,python
7#
Kcode 发表于 2026-3-17 22:08
学到了,python
8#
timberlander 发表于 2026-3-17 22:36
前几天逆向使用C语言写了个。学习下python
9#
inKant 发表于 2026-3-17 23:17
有意思。一起学习吧。
10#
WQ52pojie 发表于 2026-3-17 23:45
很详细的学习过程,感谢大佬分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-3-18 01:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表