swpuctf_2021简简单单的解密

swpuctf_2021简简单单的解密(re4加密)

(1)前言

不会全栈的ctfer,不是一名合格的ctfer。

(2)题目

附件内容:

import base64,urllib.parse
key = "HereIsFlagggg"
flag = "xxxxxxxxxxxxxxxxxxx"

s_box = list(range(256))
j = 0
for i in range(256):
    j = (j + s_box[i] + ord(key[i % len(key)])) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
res = []
i = j = 0
for s in flag:
    i = (i + 1) % 256
    j = (j + s_box[i]) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
    t = (s_box[i] + s_box[j]) % 256
    k = s_box[t]
    res.append(chr(ord(s) ^ k))
cipher = "".join(res)
crypt = (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
enc = str(base64.b64decode(crypt),'utf-8')
enc = urllib.parse.quote(enc)
print(enc)
# enc = %C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA

这里运用的是re4加密,re4加密一般可以分成三部:

a.初始化S和T

s_box = list(range(256))
j = 0
for i in range(256):
    j = (j + s_box[i] + ord(key[i % len(key)])) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]

b.初始排列S

res = []
i = j = 0
for s in flag:
    i = (i + 1) % 256
    j = (j + s_box[i]) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]

c.生成密钥流

    t = (s_box[i] + s_box[j]) % 256
    k = s_box[t]
    res.append(chr(ord(s) ^ k))

图片.png

不过这种加密方式是同过明文与生成的密钥流进行异或而得到密文,因此我们就可以通过让密文与密钥流再次异或得到明文(异或两次得到的还是原来的数)。

不过这题生成密文后先base64加密后在解密有点看不懂,接着在用urllib.parse.quote()函数对密文进行url编码,因此我们只需要先对密文进行url解码,在与密钥流异或一次就行了。

(3)脚本

import base64,urllib.parse
key = "HereIsFlagggg"
flag = ''
enc = "%C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA"
enc = urllib.parse.unquote(enc)
s_box = list(range(256))
j = 0
for i in range(256):
    j = (j + s_box[i] + ord(key[i % len(key)])) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
res = []
i = j = 0
for s in range(len(enc)):
    i = (i + 1) % 256
    j = (j + s_box[i]) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
    t = (s_box[i] + s_box[j]) % 256
    k = s_box[t]
    for ff in range(32,128):
        if(chr(ff ^ k) == enc[s]):
            print(chr(ff),end='')
# NSSCTF{REAL_EZ_RC4}

(4)补充

RC4的定义:   

在密码学中,RC4(来自Rivest Cipher4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,从明文输入流逐位或逐字节产生密文。

流密码类似于”一次一密”,不同的是”一次一密”使用的是真正的随机数流,而流密码使用的是伪随机数流。

流密码结构:

图片.png

设计流密码的主要因素:

1、加密序列的周期要长,若出现重复的周期过短,容易被破解.

2、密钥流应该尽可能地接近真正随机数流的特征.

3、密钥长度要长,以避免琼穷举攻击.

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信