这个是python文件我们用pycharm打开

可以发现这是RC4加密,而且并没有用basse64加密,为什莫呢,只需要我们学习RC4;
我只能在这里简单聊一下,
首先标准的RC4加密有这几个部分组成
-
加密
-
获取输入数据:
-
明文消息 (
get_message()) -
加密密钥 (
get_key())
-
-
初始化S盒:
box = init_box(key)- 使用密钥初始化RC4的S盒
通俗讲就是将key与box混合起来初始化
-
执行加密:
ex_encrypt(message, box, mode)- 调用RC4加密函数
将明文与box混合起来,加密 -

-
输出结果:

-
原始密文(可能包含不可见字符)
-
Base64编码后的密文(可打印字符串)
-
进行了URL加密
-

-
并且他与异或有个相同的特点是对称加密,所以在进行一次就可以获得明文,具体的特点我方在下方
1.RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。
2.算法简单,运行速度快,而且密钥长度是可变的
3.同时它也属于对称加密算法中的流密码加密算法,流密码不对明文数据进行分组,而是用密钥生成与明文一样长短的密码流对明文进行加密。密钥长度可变,面向字节操作。是以一个足够大的表s为基础,对表进行非线性变换,产生密钥流。
4. # -*- coding: utf-8 -*-
import base64
def get_message():
print("输入你的信息: ")
s=input()
return s
def get_key():
print("输入你的密钥: ")
key=input()
if key=='':
key="不要输入空的 key 值"
return key
def init_box(key):
"""
S盒
"""
s_box=list(range(256)) #我这里没管秘钥小于256的情况,小于256应该不断重复填充即可,这里完成了 C 实现中的 for(i=0;i<256;i++) prc4->s_box[i] = i;
j=0
for i in range(256):
j=(j+s_box[i] + ord(key[i % len(key)])) % 256 #这里把 C 实现中的 prc4->t_box[i] = key[i % keylen];和j=(j+prc4->s_box[i]+prc4->t_box[i])%256;合并在了一起。
s_box[i],s_box[j] = s_box[j],s_box[i]
#print(type(s_box)) #可以输出 s_box 来看是否随机混乱的
return s_box
def ex_encrypt(plain,box,mode):
"""
利用PRGA生成秘钥流并与密文字节异或,加解密同一个算法
"""
if mode == '2':
while True:
c_mode=input("输入你的解密模式:base64 or ordinary\n")
if c_mode == 'base64':
plain=base64.b64decode(plain)
plain=bytes.decode(plain) #因为返回的是解码过的 bytes,所以需要再用 decode 解码成字符串。
break
elif c_mode == 'ordinary':
break
else:
print("输入不合法,请重新输入")
continue
res=[]
i=j=0
for s in plain: #与 C 实现无太大差异
i=(i+1)%256
j=(j+box[i])%256
box[i],box[j]=box[j],box[i]
t=(box[i]+box[j]) % 256
k=box[t]
res.append(chr(ord(s)^k))
cipher="".join(res)
#print(cipher)
#根据选择进行输出,至于是明文还是密文得看用户决定
if mode == '1':
# 化成可视字符需要编码
print("加密后的输出(没经过任何编码)")
print(cipher)
# base64的目的也是为了变成可见字符
print("base64后的编码")
print(str(base64.b64encode(cipher.encode('utf-8')),'utf-8'))
if mode == '2':
print("解密后的密文")
print(cipher)
def get_mode():
print("请选择加密或者解密")
print("1.Encrypt")
print("2.Decrypt")
mode = input()
if mode == '1': #加密解密虽同源,但是由于不能直接用 =='1' or '2',所以还是得分开写
message = get_message()
key = get_key()
box = init_box(key)
ex_encrypt(message,box,mode)
elif mode == '2': #由于异或运算的对合性,RC4加密解密使用同一套算法。
message = get_message()
key = get_key()
box = init_box(key)
ex_encrypt(message,box,mode)
else:
print("输入有误! ")
if __name__ == '__main__':
while True:
get_mode()#这里参考了Jsy050906大佬的pyhon代码
由此简单得分析完成了
开始写python脚本
思路如下
1.将URL解码(用unquote)
2. 将enc再次进行RC4;
3.获得flag.

最底下的是flag

此题可解
&spm=1001.2101.3001.5002&articleId=155137770&d=1&t=3&u=2ed933814d2e4b4d9a26bcdd597ca943)
241

被折叠的 条评论
为什么被折叠?



