ciscn

embedded/2024/9/25 9:28:44/

ciscn Crypto部分复现

古典密码

先是埃特巴什密码(这个需要进行多次测试),然后base64,再栅栏即可
答案:flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}

_hash

题目:

python">#!/usr/bin/python2
# Python 2.7 (64-bit version)
# from secret import flag
import os, binascii, hashlib
key = os.urandom(7)
print(hash(key))
print(int(hashlib.sha384(binascii.hexlify(key)).hexdigest(), 16) ^ int(binascii.hexlify(flag), 16))
'''
7457312583301101235
13903983817893117249931704406959869971132956255130487015289848690577655239262013033618370827749581909492660806312017
'''

解题分析:

这个要查python2.7版本的hash函数实现源码(找不到啊/_ \),看了看wp

源码在这:py27哈希 ·PyPI的

分析一下实现原理

python">部分源码:if isinstance(value, tuple):return Hash.thash(value)if isinstance(value, float):return Hash.fhash(value)if isinstance(value, int):return hash(value)if isinstance(value, ("".__class__, u"".__class__, bytes)) or type(value).__name__ == "buffer":return Hash.shash(value) #要哈希的数是字符串则跳到shash函数
python"> def shash(value):length = len(value)if length == 0:return 0mask = 0xffffffffffffffffx = (Hash.ordinal(value[0]) << 7) & maskfor c in value:x = (1000003 * x) & mask ^ Hash.ordinal(c)x ^= length & mask# Convert to C long typex = ctypes.c_long(x).valueif x == -1:x = -2return x

所以hash函数实现的过程是:

python">def hash(s):mask = 0xffffffffffffffff#64位s = s.encode()x = s[0] << 7for char in s:x = (1000003 * x) & mask ^ charx ^= len(s) & maskreturn x

&mask即模2^64,用来限制位数大小的

那么hash过程写出来即:(key是7位的)
x 0 = s 0 ∗ 2 7 x_0=s_0 *2^7 x0=s027

x 1 = ( 1000003 ∗ x 0 ) m o d 2 64 ⊕ s 0 x_1=(1000003*x_0) \quad mod \quad 2^{64} \quad \oplus s_0 x1=(1000003x0)mod264s0

x 2 = ( 1000003 ∗ x 1 ) m o d 2 64 ⊕ s 1 x_2=(1000003*x_1) \quad mod \quad 2^{64} \quad \oplus s_1 x2=(1000003x1)mod264s1

x 3 = ( 1000003 ∗ x 2 ) m o d 2 64 ⊕ s 2 x_3=(1000003*x_2) \quad mod \quad 2^{64} \quad \oplus s_2 x3=(1000003x2)mod264s2

以此类推,最后得到:
x = x 7 ⊕ l e n g t h m o d 2 64 x=x_7 \oplus length \quad mod \quad 2^{64} x=x7lengthmod264
现在我们知道hash后的数值即x,需要推出x0,那么进行一个逆过程
x 7 = x ⊕ l e n g t h m o d 2 64 x_7=x \oplus length \quad mod \quad 2^{64} x7=xlengthmod264

x 6 = x 7 ⊕ s 2 ∗ 100000 3 − 1 m o d 2 64 x_6= x_7\oplus s_2*1000003^{-1} \quad mod \quad 2^{64} x6=x7s210000031mod264

依次类推,得到x:
x 0 = x 1 ⊕ s 0 ∗ 100000 3 − 1 m o d 2 64 x_0=x_1 \oplus s_0 *1000003^{-1} \quad mod \quad 2^{64} x0=x1s010000031mod264
但是我们只有key,s0-s7都是明文中的,所以这里有个中间相遇攻击

中间相遇攻击的思路在于,假设明文key是abcdefg

我们从前面加密4个字符,即加密到x4,并把他作为元组记录下来。

再把得到的密文从后面逆向,逆到x4,如果和前面的对应上了,即爆破出key

(不是很懂)

贴下别的师傅的脚本(还需要再看看,等我后面做个补充)

python">from itertools import product
from Crypto.Util.number import *
from tqdm import trangemask = 0xffffffffffffffff
inv = inverse(1000003,2**64)
x7 = 7457312583301101235
cipher = 13903983817893117249931704406959869971132956255130487015289848690577655239262013033618370827749581909492660806312017table = {}
for i in trange(256):# 这是第一个字符for tmp in product([i for i in range(256)],repeat=3):# 下面便是hash的实现,但是我们只乘上3个字符x = (i << 7) & mask                       x = (1000003 * x) & mask ^ ipre = list(tmp)for char in pre:x = (1000003 * x) & mask ^ chartable[x] = pre# 记录下来for tmp in product([i for i in range(256)],repeat=3):tail = list(tmp)x7 = (x7 ^ 7) & maskx6 = (x7 ^ tail[-1]) * inv & maskx5 = (x6 ^ tail[-2]) * inv & maskx4 = (x5 ^ tail[-3]) * inv & maskif x4 in table.keys():print(i,table[x4],tail)# 93 [140, 240, 63] [90, 8, 82]break

要跑2.5小时(震惊)

有了key,就直接异或回去即可

python">import hashlib
import binasciim = [93,140,240,63,90,8,82]
key = b""
for i in m:key += long_to_bytes(i)flag = long_to_bytes(int(hashlib.sha384(binascii.hexlify(key)).hexdigest(), 16) ^ cipher) 
print(flag)
# flag{bdb537aa-87ef-4e95-bea4-2f79259bdd07}

2024CISCN | DexterJie’Blog
后面的题我正在努力中


http://www.ppmy.cn/embedded/43331.html

相关文章

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

分治法(棋盘覆盖问题)

目录 前言 一、棋盘覆盖 二、图示解析 三、代码实现 四、具体分析 总结 前言 有一个 x &#xff08;k>0&#xff09;的棋盘&#xff0c;恰好有一个方格与其他方格不同&#xff0c;称之为特殊方格。现在要用L形骨牌覆盖除了特殊方格以外的其他全部方格&#xff0c;骨牌可以…

cgicc开发(文件上传)

//cgicc文件上传封装 void UploadSoftware() {// 初始化CGIC环境Cgicc cgi;// 获取上传的文件file_iterator fileIter cgi.getFile("button_browse"); //from表单中,输入为文件属性(typefile)的name属性值if (fileIter cgi.getFiles().end()){ #if (DEBUG true)co…

git显示提交次数

git shortlog 是一个特殊版本的 git log 命令&#xff0c;旨在创建发布公告。它将每个提交按作者分组&#xff0c;并显示每个提交消息的第一行。这是一种快速查看不同作者在项目中的贡献的方式。 以下是 git shortlog 的一些常用参数&#xff1a; -n 或 --numbered&#xff1…

北美码农面试流程,北美码农面试经验

听说有人还不知道OA是什么&#xff1f;HR电联跟Tech phone interview什么区别&#xff1f;Onsite interview有哪些关键点具体考些什么不清楚&#xff1f;下面为大家分享北美码农面试流程。 SDE面试流程主要包含&#xff1a; Online assessment HR contact email/phone Tech…

跳绳技巧一:蝴蝶步

跳绳蝴蝶步 跳绳蝴蝶步是一种跳绳技巧&#xff0c;结合了跳绳和舞蹈动作&#xff0c;形成一种优美而富有节奏感的跳跃方式。以下是学习和掌握跳绳蝴蝶步的基本步骤&#xff1a; 1. 基础准备 确保跳绳长度适合你的身高&#xff0c;站在绳子中间&#xff0c;两端绳柄应该到达你…

Ansible实战YAML语言完成apache的部署,配置,启动全过程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f3dd;️Ansible专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日15点59分 目录 &#x1f4af;趣站推荐&#x1f4af; &#x1f38a;前言 ✨️YAML语言回顾 &#x1f386;1.编写YAML文…

C++

定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。