nssctf部分题解+xtea加密算法初步分析

文章讲述了在HGAME2023和HNCTF2022的网络安全挑战中,遇到的基于XTEA加密算法的谜题。作者详细解析了XTEA算法的工作原理,包括分组加密、轮数、加密和解密流程,并展示了如何通过Tea和XTEA加密算法进行解密以获取flag。
摘要由CSDN通过智能技术生成

1 [HGAME 2023 week2]before_main

首先我们通过以下形式进行下载并打开

找到以下界面

因为我们看到进行比较的字符串是一串乱码,因此我们可以判断进行了一定的加密算法(比如说base64加密tea加密算法等等等等)

因为我们找到如下的函数界面

我们就能看到这个进行加密的表格(经过魔改的表格)

我们将其放置到赛博厨子上进行解密

结果如下:

得到flag:hgame{s0meth1ng_run_befOre_m@in}

按照要求更改形式即可

2 [HNCTF 2022 WEEK2]TTTTTTTTTea

打开看见如下形式的代码块

让我们逐行代码进行分析

我们通过查找可以知道这个算法是XTEA加密算法

首先我们来回顾以下tea加密算法的概念:

  • 分组加密:TEA是一种64位分组加密算法,这意味着每次加密处理的数据块大小为64位。
  • 密钥长度:TEA使用128位的密钥。这意味着该算法需要一个128位的密钥来进行加密和解密操作。
  • 轮数:TEA采用Feistel结构,每次加密操作使用64轮。

加密和解密流程

  1. 分组:将明文分成64位的分组。
  2. 轮迭代:对每个分组进行64轮加密。每轮都涉及到关键的数学操作,如加法、异或和移位。
  3. 密钥使用:在每轮加密过程中,128位的密钥被分成4个32位的部分,每个部分用于不同的轮迭代。
  4. # TEA加密算法
    def tea_encrypt(v, k):
        y, z = v[0], v[1]
        sum = 0
        delta = 0x9E3779B9  # TEA的delta值
        for _ in range(32):  # 64轮
            sum += delta
            y += ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1])
            z += ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3])
        return [y, z]
    
    # TEA解密算法
    def tea_decrypt(v, k):
        y, z = v[0], v[1]
        sum = 0xC6EF3720  # TEA的初始sum值
        delta = 0x9E3779B9
        for _ in range(32):
            z -= ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3])
            y -= ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1])
            sum -= delta
        return [y, z]
    

//补充:

XTEA(eXtended Tiny Encryption Algorithm)是一种对称加密算法,通常用于轻量级的加密需求,比如物联网设备或嵌入式系统中。它采用32位的块大小和128位的密钥长度。这里是一个简单的 XTEA 加密算法的示例实现:

#include <stdint.h>

#define DELTA 0x9e3779b9
#define NUM_ROUNDS 32

void xtea_encrypt(uint32_t v[2], uint32_t const key[4]) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
    uint32_t delta = DELTA;

    for (i = 0; i < NUM_ROUNDS; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }

    v[0] = v0;
    v[1] = v1;
}

void xtea_decrypt(uint32_t v[2], uint32_t const key[4]) {
    uint32_t v0 = v[0], v1 = v[1], sum = DELTA * NUM_ROUNDS, i;
    uint32_t delta = DELTA;

    for (i = 0; i < NUM_ROUNDS; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }

    v[0] = v0;
    v[1] = v1;
}

参考文献:

XTEA加密算法实现过程-CSDN博客

这一个算法是在tea算法的基础上进行了升级的版本

我们也就能通过比较得到XTEA的加解密算法:

# XTEA加密算法
def xtea_encrypt(v, k):
    delta = 0x9E3779B9
    sum = 0
    rounds = 64
    y, z = v[0], v[1]
    for _ in range(rounds):
        y += (((z << 4) ^ (z >> 5)) + z) ^ (sum + k[sum & 3])
        sum += delta
        z += (((y << 4) ^ (y >> 5)) + y) ^ (sum + k[(sum >> 11) & 3])
    return [y, z]

# XTEA解密算法
def xtea_decrypt(v, k):
    delta = 0x9E3779B9
    sum = delta * 64
    rounds = 64
    y, z = v[0], v[1]
    for _ in range(rounds):
        z -= (((y << 4) ^ (y >> 5)) + y) ^ (sum + k[(sum >> 11) & 3])
        sum -= delta
        y -= (((z << 4) ^ (z >> 5)) + z) ^ (sum + k[sum & 3])
    return [y, z]
  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值