古典密码?
网站集合:
中国电码:
Rabbit:
恺撒:
quipqiup - cryptoquip and cryptogram solver
MD5:
[会员登录 - 查md5啦cmd5.la]
猪圈:
CTF在线工具-在线猪圈密码加密|在线猪圈密码解密|猪圈密码算法|Pigpen Cipher
爆破:
quipqiup - cryptoquip and cryptogram solver
JSfuck:
维吉尼亚
oOK
[Brainfuck/Ook! Obfuscation/Encoding splitbrain.org]
JJencode
XXencode
CTF在线工具-在线XXencode编码|XX编码|XXencode解码|XXencode编码原理|XXencode编码算法
零宽隐写
Hill加密
一、中国电码
参考:BUUCTF信息化时代的步伐
题干:606046152623600817831216121621196386
二、Rabbit
Rabbit 加解密算法是一种流密码(stream cipher),它由 David Wheeler 和 Roger Needham 在 2003 年提出,并在 2004 年发布了相关的算法文档。Rabbit 算法的设计目的是提供一个高速且高效的加密方法,用于在资源受限的设备上进行加密操作(例如嵌入式系统和无线通信等)。Rabbit 使用的是一种基于状态的流密码机制,能够对任意长度的数据进行加密。
Rabbit 加解密算法的工作原理
1. 流密码(Stream Cipher)概述
流密码加密算法通过生成一个密钥流并与明文进行逐位异或(XOR)操作来加密数据。这个密钥流通常是由密钥和初始向量(IV,Initialization Vector)生成的,密钥流的长度和数据长度相同。加密的过程就是将明文与密钥流进行逐位异或,解密过程则相同,因为异或操作是可逆的。
2. Rabbit算法的核心思想
Rabbit算法通过一个状态机来生成伪随机的密钥流。Rabbit的状态机是由一个128位的密钥和64位的初始化向量(IV)所定义的。算法的基本步骤是:
初始化:使用128位的密钥和64位的IV初始化Rabbit的状态机。
生成密钥流:通过状态机生成伪随机的密钥流。
加密/解密:将明文与生成的密钥流逐位异或(XOR),得到密文。由于流密码的对称性,使用相同的密钥流可以将密文解密还原为明文。
3. Rabbit算法的结构
Rabbit算法由三个主要组件组成:
1)状态寄存器: Rabbit的状态由一个256位的寄存器表示,分为4个64位的寄存器:
X0, X1, X2, X3:64位的寄存器,存储伪随机的状态信息。
Y0, Y1, Y2, Y3:64位的寄存器,辅助生成密钥流。
2)一步都包括复杂的位移、加法和异或操作。
3)密钥流生成: Rabbit通过对X0、X1、X2、X3和Y0、Y1、Y2、Y3进行一系列操作,生成新的64位密钥流。每生成一次64位密钥流,就会对状态寄存器进行更新,循环生成伪随机的密钥流。
4.Rabbit的加密/解密过程
初始化
:
- 将128位的密钥和64位的IV输入到Rabbit算法,初始化8个寄存器(4个64位的X寄存器和4个64位的Y寄存器)。
生成密钥流
:
- 在每个加密或解密循环中,Rabbit通过状态机生成64位密钥流。
- 生成的64位密钥流与待加密的明文进行异或操作,从而得到加密后的密文。
加密
:
- 生成64位密钥流。
- 使用密钥流与明文进行逐位异或(XOR)操作,得到密文。
解密
:
1)同样生成相同的64位密钥流。
2)使用密钥流与密文进行逐位异或(XOR)操作,恢复原始明文。
由于Rabbit是一种流密码,它的加密过程与解密过程完全相同,都是基于对称密钥和密钥流进行异或操作。
5、Rabbit算法的具体步骤
输入:
- 密钥:128位。
- 初始向量(IV):64位。
状态初始化: Rabbit算法的状态初始化步骤涉及将密钥和IV填充到X寄存器和Y寄存器中,形成初始的状态。
密钥流生成: Rabbit通过以下步骤来生成密钥流:
- 根据当前的状态计算新的密钥流。
- 通过特定的函数对寄存器中的数据进行处理,更新状态。
- 生成新的伪随机密钥流。
- 继续重复这一过程直到处理完所有的明文数据。
异或加解密: 生成的密钥流与明文进行异或操作,得到密文。解密时也使用相同的密钥流对密文进行异或操作,恢复出原始明文。
参考:BUUCTF Rabbit
题干:U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
网站:https://www.sojson.com/encrypt_rabbit.html
三、凯撒
参考:BUUCTF凯撒?替换?呵呵!
题干:MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
解题:MTHJ=flag爆破
四、哈希函数
1、MD5与hash的关系
(1) Hash 函数:
Hash 是一种将任意大小的数据(通常是字符串)转换为固定大小输出的函数。它的主要特点包括:
- 固定长度输出:无论输入数据的大小如何,输出的 hash 值(通常称为散列值)长度是固定的。
- 快速计算:hash 函数计算速度较快,适合大数据量的处理。
- 不可逆:hash 函数是单向的,意味着从 hash 值无法逆向恢复原始输入数据。
- 碰撞性:不同的输入数据可能产生相同的 hash 值,这种现象被称为碰撞。好的 hash 函数应当尽量减少碰撞的概率。
- 广泛应用:hash 函数用于数据检索、文件完整性验证、密码存储等场景。
常见的 hash 函数包括:
- SHA-1(不再安全,已被弃用)
- SHA-256
- SHA-512
- MD5(曾经广泛使用,但现在已不安全)
(2)MD5(Message-Digest Algorithm 5):
MD5 是一种特定的 hash 函数,由 Ronald Rivest 于 1991 年设计。它生成一个 128 位(16 字节)长度的 hash 值,通常表示为 32 位的十六进制数字。虽然 MD5 曾经是广泛使用的哈希算法,但现在它被认为不安全,并已被许多应用场景中弃用。
MD5 的特点:
- 输出 128 位(16 字节),通常以 32 位十六进制数字表示。
- 快速计算。
- 初衷是用于验证文件的完整性,但由于存在碰撞漏洞,现在不再适用于安全关键任务。
(3)Hash 与 MD5 的关系:
MD5 是一种 Hash 函数,属于更广泛的 哈希算法(hash function)类别。
所有 MD5 都是 hash,但并不是所有 hash 都是 MD5。在 hash 的家族中,MD5 只是众多 hash 函数中的一种。例如,SHA-256 是另一种常见的 hash 函数,它的输出更长且更安全。
MD5 的局限性
:
- 碰撞漏洞:MD5 的一个严重问题是,它容易产生 碰撞,即不同的输入数据可能会产生相同的 MD5 值。对于很多安全要求较高的应用(如数字签名、证书验证),这意味着 MD5 已不再安全。
- 易受攻击:例如,攻击者可以通过 构造碰撞 来伪造文件的 MD5 校验和,造成数据篡改。
(4) MD5 的用途(曾经广泛使用):
- 文件校验:MD5 常用于文件完整性校验,检查文件是否在传输或存储过程中发生了改变。
- 密码存储:在早期,MD5 曾经被用来存储用户密码的 hash 值。然而,由于 MD5 的漏洞,它现在不再推荐用于密码存储。
(5)MD5 的替代品:
[1]SHA-256:相较于 MD5,SHA-256(属于 SHA-2 系列)提供更强的安全性,并且几乎没有碰撞的概率,因此广泛应用于各种安全场景。
[2]bcrypt、scrypt 等:这些算法在密码存储中被推荐使用,因为它们除了加密外,还可以通过引入盐(salt)和计算强度来防止暴力破解和碰撞攻击。
2、奇奇怪怪的题
网站:
https://cmd5.la/user/index.php
[1]BUUCTF Windows系统密码
文件添加后缀txt 用记事本打开后得到
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
满足MD5三十二位十六进制数
flag{good-luck}——–a7fcb22a88038f35a8f39d503e7f0062
[2]BUUCTF还原大师
1 | import hashlib |
3、加密脚本
1 | import hashlib |
五、猪圈
网站:http://www.hiencode.com/pigpen.html
对照表:
[1]BUUCTF 萌萌哒八戒1
(不知道为什么压缩包无效了)
六、奇了八怪的玩意儿,直接爆破
网站:https://quipqiup.com/
[1]BUUCTF old-fashion
密文:Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l
爆破结果:
flag{n1_2hen-d3_hu1-mi-ma_a}
七、转轮机加密
原理:
是托马斯·杰斐逊,是转轮加密。我们先了解一下转轮加密的原理:托马斯-杰弗逊转轮加密由三串字符串组成,第一部分为加密表,第二部分为密钥,第三部分为密文。加密表就是我们需要利用密钥和密文来进行加密。
攻防世界:转轮机加密
1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <
密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP
1 | import re |
八、维吉尼亚
网站(爆破)
例题
[1]0xGame
1 | 0lCcop{oyd94092-g8mq-4963-88b6-4helrxdhm6q7} |
flag对应0xgame的开头
行头表示明文字母,列头为关键字,交点为密文字母
运算公式:密文-关键字mod26
步骤:密文-关键字 若结果为负数+26得到明文
对照维吉尼亚表获得密钥
横排为目标flag格式 表内部为密文所对应字母,以此对应最左边竖排字母找到密钥owccl
0xGame{acb94092-e8bc-4963-88f6-4fcadbbfb6c7}
[2]MRCTF2020 Vigenere
原文网站爆破得到最后一行flag is arctf vigebere cryptc crack man, dlease add inderscors and curly praces.
flag为flag{vigebere_cryptc_crack_man}
[3]AFCTF Vigenère
将文本复制到网站爆破得到明文 往下翻得到flag
afctf{Whooooooo_U_Gotcha!}
九、JSfuck
解密网址:https://www.bugku.com/tools/jsfuck/#
内容:
- false => ![]
- 真 => !![]
- 未定义 => [][[]]
- NaN => +[![]]
- 0 => +[]
- 1 => +!+[]
- 2 => !+[]+!+[]
- 10 => [+!+[]]+[+[]]
- 数组 => []
- 数字 => +[]
- 字符串 => []+[]
- 布尔值 => ![]
- 函数 => [][“filter”]
- eval => [][“filter”][“constructor”]( 代码 )()
- window => [][“filter”][“constructor”](“return this”)()
例BUUCTF这是什么
解题:附件格式为apk 手动改为zip(俺打不开,改成7z打开了)
用记事本打开WordDocument
放入网址得到flag{a0448fd730b62c13ca80200c4529daa2}
十、准银河字母
十一、圣堂武士(templar)
十二、猪圈密码
传统猪圈密码
新猪圈密码
十三、Atbash cipher古埃及象形
参考:BUUCTF NPUCTF classical cipher
十四、异或
参考:BUUCTF异性相吸
1 | exp: |
🔍 为什么要取最小长度?
在 Python 中,如果 miwen_bytes
和 key_bytes
长度不同,直接 for i in range(len(miwen_bytes))
可能会导致 索引越界(IndexError)。
💡 异或(XOR)运算的本质:
- 逐字节异或:
flag_bytes[i] = miwen_bytes[i] ^ key_bytes[i]
- 密钥通常是固定长度的,而密文长度可能更长
- 如果密钥比密文短,直接
miwen_bytes[i] ^ key_bytes[i]
可能会超出key_bytes
的索引范围,导致错误
十五、天干地支
参考:BUUCTF天干地支+甲子
解题思路:
一甲子=60年 密文所的数字+60 对照ASCII表
得到flag
1 | exp: |
豁~八卦!
NSSCTF SWPUCTFtraditional
八卦转二进制 黑为0 红为1
二进制转ASCII得flag{Da01sall}
十六、XX and JJencode
JJencode
特点:
1 | $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())(); |
XXencode的特点包括:
编码方式:XXencode将输入文本以每三个字节为单位进行编码,最后不够三个字节的部分用零补齐。
字符集:使用64个可打印字符进行编码,这些字符包括+``-``0-9``A-Z``a-z
。
这些特点使得XXencode在某些场合下成为一种有效的编码方式。
十七、哥特风字母
[1]Litctf2023 原来你也玩原神
最后一行对照获得flag
十八、hill加密
NSSCTF HDCTF小明爬山去看云
题干:
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云
网站直接解得到
your pin is eight four two zero eight four two one zero eight eight four zero two four zero eight four zero one zero one two fourx
842084210884024084010124
十九、云影密码
密码原理
有1,2,4,8这四个数字,可以通过加法来用这四个数字表示0-9中的任何一个数字,列如0=28, 也就是0=2+8,同理7=124, 9=18。这样之后再用1-26来表示26个英文字母,就有了密文与明文之间的对应关系。引入0来作为间隔,以免出现混乱。所以云影密码又叫“01248密码”。
解密代码:
1 | a="842084210884024084010124" |