初学RE day06(解 简简单单的解密)

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

可以发现这是RC4加密,而且并没有用basse64加密,为什莫呢,只需要我们学习RC4;

我只能在这里简单聊一下,

首先标准的RC4加密有这几个部分组成

  1. 加密

  2. 获取输入数据

    • 明文消息 (get_message())

    • 加密密钥 (get_key())

  3. 初始化S盒box = init_box(key)- 使用密钥初始化RC4的S盒
    通俗讲就是将key与box混合起来初始化

  4. 执行加密ex_encrypt(message, box, mode)- 调用RC4加密函数
    将明文与box混合起来,加密

  5. 输出结果

    • 原始密文(可能包含不可见字符)

    • 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

此题可解

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值