当前位置: 首页 > news >正文

CryptoHack 简介

CryptoHack 简介

文章目录

    • CryptoHack 简介
      • 一、python的安装,运行
      • 二、ASCII码
      • 三、十六进制
      • 四、Base64
      • 五、字节和大整数
      • 六、XOR
        • 1.基本
        • 2.xor属性
        • 3.xor隐藏字节
        • 4.cryptohack——You either know, XOR you don't

一、python的安装,运行

二、ASCII码

  1. chr()函数可用于将 ASCII 序数转换为字符(该ord()函数执行相反的操作)。

  2. a=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
    for i in range(len(a)):print(chr(a[i]))
    #crypto{ASCII_pr1nt4bl3}
    

三、十六进制

  1. 首先,根据 ASCII 表将每个字母转换为序数。然后将十进制数转换为以 16 为基数的数字,也称为十六进制。这些数字可以组合在一起,形成一个长的十六进制字符串。

  2. 在 Python 中,该bytes.fromhex()函数可用于将十六进制转换为字节。.hex()可以对字节字符串调用实例方法来获取十六进制表示形式。

  3. a="63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d"
    print(bytes.fromhex(a))
    #b'crypto{You_will_be_working_with_hex_strings_a_lot}'
    

四、Base64

  1. Base64,它允许我们使用 64 个字符的字母表将二进制数据表示为 ASCII 字符串。Base64 字符串的一个字符编码 6 个二进制数字(位),因此 Base64 的 4 个字符编码 3 个 8 位字节。

  2. 在 Python 中,使用 导入 base64 模块后import base64,即可使用该base64.b64encode()函数。请记住先解码十六进制,如挑战描述所述。

  3. import base64
    a="72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
    print(base64.b64encode(bytes.fromhex(a)))
    #crypto/Base+64+Encoding+is+Web+Safe/
    

五、字节和大整数

  1. 最常见的方法是获取消息的序数字节,将其转换为十六进制,然后连接起来。这可以解释为 16 进制/十六进制数字,也可以用 10 进制/十进制表示。

  2. 消息:HELLO
    ascii 字节:[72, 69, 76, 76, 79]
    十六进制字节:[0x48, 0x45, 0x4c, 0x4c, 0x4f]
    十六进制:0x48454c4c4f
    十进制:310400273487

  3. Python 的 PyCryptodome 库使用方法bytes_to_long()和来实现这一点long_to_bytes()。您首先必须安装 PyCryptodome 并使用导入它from Crypto.Util.number import *

  4. from Crypto.Util.number import *
    a=11515195063862318899931685488813747395775516287289682636499965282714637259206269
    print(long_to_bytes(a))
    b'crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}'
    

六、XOR

1.基本
  • 对于较长的二进制数,我们逐位进行异或:0110 ^ 1010 = 1100。我们可以先将整数从十进制转换为二进制,然后对整数进行异或。我们可以先将每个字符转换为表示 Unicode 字符的整数,然后对字符串进行异或。
  • 给定字符串label,将每个字符与整数13进行异或。将这些整数转换回字符串并将标志提交为crypto{new_string}。Pythonpwntools库有一个方便的xor()函数,可以将不同类型和长度的数据异或在一起。但首先,您可能需要实现自己的函数来解决这个问题。
from pwn import xor# 定义字符串
label = "label"# 将字符串转换为字节
label_bytes = label.encode()# 使用 pwntools 的 xor 函数进行 XOR 操作
new_bytes = xor(label_bytes, 13)# 将结果转换回字符串
new_string = new_bytes.decode()# 格式化输出
flag = f"crypto{{{new_string}}}"
print(flag)
2.xor属性

使用 XOR 运算符解决挑战时,我们应该考虑四个主要属性

交换律:A ⊕ B = B ⊕ A
结合律:A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C恒
等式:A ⊕ 0 = A
自逆:A ⊕ A = 0

from pwn import xork1=bytes.fromhex("a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313")
k12=bytes.fromhex("37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e")
k2=xor(k1,k12)
k23=bytes.fromhex(" c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1")
k3=xor(k2,k23)
flag_xor=bytes.fromhex("04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf")
flag=xor(k1,k2,k3,flag_xor)
print(flag)
#b'crypto{x0r_i5_ass0c1at1v3}'
3.xor隐藏字节
#我使用 XOR 与单个字节隐藏了一些数据,但该字节是秘密。别忘了先从十六进制解码。#73626960647f6b206821204f21254f7d694f7624662065622127234f726927756dfrom pwn import xor# 已知的十六进制加密数据
encrypted_hex = "73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d"
encrypted_bytes = bytes.fromhex(encrypted_hex)# 尝试所有可能的单字节密钥
for key in range(256):decrypted = xor(encrypted_bytes, key)try:# 尝试解码成可读字符串result = decrypted.decode("utf-8")print(f"Key: {key} -> {result}")except UnicodeDecodeError:# 跳过不可解码的字节组合continue
#crypto{0x10_15_my_f4v0ur173_by7e}
4.cryptohack——You either know, XOR you don’t

在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/476122.html

相关文章:

  • transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.
  • 游戏开发与游戏运营:哪个更难?
  • 大模型在自动化渗透测试中的应用
  • 《AI在企业战略中的关键地位:以微软和阿里为例》
  • C语言 | Leetcode C语言题解之第537题复数乘法
  • Vue如何实现数据的双向绑定和局部更新?
  • java学习1
  • 如何缩小PPT演示文稿的大小?
  • 闯关leetcode——234. Palindrome Linked List
  • 通过源码分析类加载器里面可以加载的类
  • RSA算法:数字安全的基石
  • DPDK高性能处理框架VPP
  • Spring工厂方式实现实例化bean有哪些方式?
  • 衡石分析平台系统分析人员手册-指标分析看板
  • 《C++17 结构化绑定:解锁不同类型处理的秘籍》
  • 大型音频模型:AudioLLMs
  • 【ShuQiHere】️理解Python中的相对路径:使用 `..` 和 `.` 的指南
  • DMFLDR数据载入使用实践
  • 发布 NPM 包时,终端显示发布成功但实际上版本并没有更新,可能是由于以下原因
  • Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)
  • 物联网开发教程专栏介绍与专栏说明——列表目录查阅(持续更新)
  • uni-app实现app展示进度条在线更新以及定时更新提醒
  • 【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)
  • [Android]从FLAG_SECURE禁止截屏看surface
  • python 五子棋小游戏
  • JeecgBoot集成工作流实战教程
  • 第三十章 章节练习商品列表组件封装
  • NumPy 高级索引
  • C/C++常用编译工具链:GCC,Clang
  • let和war的区别