CTF常见密码汇总
栅栏密码
fg2ivyo}l{2s3_o@aw__rcl@-->flag{w22_is_v3ry_cool}
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)用一定的规则把原文打乱然后用@连接)
类栅栏密码
特征:会给你一串乱序的密文 C,同时给你从1 到 n 的一串乱序的数,找下 C 对于 n 的最大公约数,然后将他们重新排序。
动手画一画就出来了。
BugKu中的一道题:
lf5{ag024c483549d7fd@@1}
一张纸条上凌乱的写着2 1 6 5 3 4
再按照123456的顺序数从第一行排到最后一行:
flag{52048c453d794df1}@@
提交 flag发现不对,这两个@@有点奇怪,去掉@就成功了,那么一般这种字符都是迷惑人的。
md5
18414996c5377f5f4419a40eba901789-->flag{hello_world!}
一般为32位 由数字和小写字母组成
base家族
base64
ZmxhZ3toZWxsb193b3JsZCF9IAo==-->flag{hello_world!}
base64的空格被加密成=
base16
666C61677B6D795F6E616D655F482121487D-->flag{my_name_H!!H}
由数字和大写字母组成
base58
xpoetRPM7vtSVDSRGRp4nXv-->flag{hello-world}
Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号。
base91
@iH<,{bdR2H;i6*Tm,Wx2izpx2!--> flag{554a5058c9021c76}
国外解密网站:
https://www.dcode.fr/base-91-encoding
http://www.hiencode.com/base91.html
XXencode编码
hS5VZPaBjN4IU6G2VFqZqNG-tPrJm64NgMKQuEa3nNIBIFbh0MLBZEpF4LqZn
9LpBjLoRjPqEV6Lo+
-->
xxencode !!!Give your flag:BaseCTF{BaseCTF_is_So_Good!!}
http://web.chacuo.net/charsetxxencode
UUencode编码
unicode
\u0066\u006c\u0061\u0067\u007b\u0069\u005f\u0077\u0069\u006c\u006c\u005f\u006b\u0069\u006c\u006c\u005f\u0079\u006f\u0075\u0021\u007d-->flag{i_will_kill_you!}
万国码:每一字符都用一个5位字符编码表示,并用\分割
Unicode 字符可以适用于所有已知的编码。Unicode 是继 ASCII(美国国家交互信息标准编码)字符码后的一种新字符编码,它为每一个符号定义一个数字和名称,并指定字符和它的数值(码位),以及该值的二进制位表示法,通过一个十六进制数字和前缀(U)定义一个16位的数值,如:U+0041 表示 A,其唯一的名称是 LATIN CAPITAL LETTER A。
零字符宽度隐写
http://330k.github.io/misc_tools/unicode_steganography.html
零宽度字符是隐藏的不显示的,也是不可打印的,也就是说使用大部分程序和编辑器是看不到这种字符的。它们存在于页面中主要用于调整字符的显示格式。
零宽空格(zero-width space, ZWSP)用于可能需要换行处。
Unicode: U+200B HTML:
零宽不连字 (zero-width non-joiner,ZWNJ)放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。
Unicode: U+200C HTML:
零宽连字(zero-width joiner,ZWJ)是一个控制字符,放在某些需要复杂排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会发生连字的字符产生了连字效果。
Unicode: U+200D HTML:
左至右符号(Left-to-right mark,LRM)是一种控制字符,用于计算机的双向文稿排版中。
Unicode: U+200E HTML: 或
右至左符号(Right-to-left mark,RLM)是一种控制字符,用于计算机的双向文稿排版中。
Unicode: U+200F HTML: 或
字节顺序标记(byte-order mark,BOM)常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的标记。
Unicode: U+FEFF
零宽度字符的作用
数据防爬
将零宽度字符插入关键词文本中,使得匹配关键字时不能正确匹配,但是不影响用户的正常阅读
信息隐藏
可以将信息隐藏在正常文字中而不影响阅读
如何隐藏
首先,输入需要被加密的内容将被转换为其二进制(Morse编码),然后该二进制(Morse编码)将被转换为一系列的零宽度字符。然后可以将零宽度的字符串不可见地插入正常文本中,这样就被隐藏了。
每一种基于零宽度字符的隐写都可以有自己的隐写方式及加密方式,所以可能用这一个工具或脚本加密过的字符串在另一个解密网站就无法成功解密。
注意:加密和解密一定要用同一个网站或脚本!!!
摩斯电码
-... -.- -.-. - ..-. -- .. ... -.-.-->BKCTFMISC
相当于二进制编码
摩斯电码变形
0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0 000 1 01111 10 11110 101011 1111101-->flag{}m0rse_code_1s_interest1n9!}
特点:由0和1组成,并且每段的长度不一样
OOK语言
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.……-->flag{ok-ctf-1234-admin}
https://tool.bugku.com/brainfuck/
OOK!是一种为红毛猩猩设计的编程语言。OOK!与众所周知的深奥语言BrainF ***基本上是同构的 ,但语法元素更少
OOK语言变形
..... ..... ..... ..... !?!!. ?.... ..... ..... ..... .?.?! .?... .!........ ..... !.?.. ..... !?!!. ?!!!! !!?.? !.?!! !!!.. ..... ..... .!.?...... ...!? !!.?. ..... ..?.? !.?.. ..... .!.?. ..... ..... !?!!. ?!!!!!!!!! !?.?! .?!.? ..... ....! ?!!.? ..... ...?. ?!.?. .....
-->
flag{bugku_jiami}
Brainfuck语言
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. -->Hello World!
https://tool.bugku.com/brainfuck/
-
< . ] [ -,8种符号
凯撒密码
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
特点: 在原来字符上进行一定的偏移
escape
flag%7Bi-will-kill-you%21%7D -->flag{i-will-kill-you!}
核心价值观编码
公正公正公正诚信文明公正民主公正法治法治友善平等和谐敬业和谐富强和谐富强和谐文明和谐平等公正公正和谐法治公正公正公正文明和谐民主和谐敬业和谐平等和谐敬业和谐敬业和谐和谐和谐公正法治友善法治-->flag{90025f7fb1959936}
http://www.hiencode.com/cvencode.html
由核心价值观的12个词语组成的编码方式
sha1
7c2380341e0f03f81f873ab8d2ea5b88bc690793 -->flag{hello_world!}
40 位 由数字和小写字母组成
urlencode
%68%61%63%6b%65%72%44%4a-->hackerDJ
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
比如:
空格ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+,见RFC-1738
默认:字母是不进行编码的
当铺密码
羊由大井夫大人王中工-->9158753624
当铺密码[1]就是一种将中文和数字进行转化的密码,算法相当简单:当前汉字有多少笔画出头,就是转化成数字几
rot13
Ubj pna lbh gryy na rkgebireg sebz na vagebireg ng AFN? In the elevators, the extrovert looks at the OTHER guy's shoes.
-->How can you tell an extrovert from an introvert at NSA? Va gur ryringbef, gur rkgebireg ybbxf ng gur BGURE thl'f fubrf.
ROT13是它自己本身的逆反;也就是说,要还原ROT13,套用加密同样的算法即可得,故同样的操作可用再加密与解密。该算法并没有提供真正的密码学上的保全,故它不应该被套用在需要保全的用途上。它常常被当作弱加密示例的典型
词频分析
Eg qnlyjtcnzydl z umaujejmjetg qeydsn eu z bsjdtx tw sgqtxegc al kdeqd mgeju tw yrzegjsoj zns nsyrzqsx kejd qeydsnjsoj
Ew ltm fgtk jds kzl tw sgqtxegc m kerr csj jds wrzc kdeqd eu qrzuueqzr-qeydsn_eu_gtj_usqmnejl_du
-->
In cryptography a substitution cipher is a ?ethod of encoding by which units of plaintext are replaced with ciphertext If you know the way of encoding u will get the flag which is classical-cipher_is_not_security_hs
一种加密方式,做攻防世界的时候遇到的,
在线解密:
https://quipqiup.com/
jsfuck
(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[+[]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+
-->flag{hhaj}
F12打开控制台
将密文复制进去,回车就可以得到密码
decode HTML
LzExOS8xMDEvMTA4Lzk5LL122;ExM-->LzExOS8xMDEvMTA4Lzk5LzExM
DES
秘钥:6XaMMbM7
U2FsdGVkX18IBEATgMBe8NqjIqp65CxRjjMxXIIUxIjBnAODJQRkSLQ/+lHBsjpv1BwwEawMo1c=
-->ctf{67a166801342415a6da8f0dbac591974}
DES是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法
键盘格子密码
r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM
-->
t o n g y u a n
特征:由三到四个英文字母或数字为一组。
在键盘上找对应的键位,中间围起来的就是密文
托马斯杰斐逊 转轮密码
密码表:
密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12
密文:HCBTSXWCRQGL ES
在第 2 行密码表中找H开头的字母,然后以H开头再到尾过一遍,以此类推,整理出另一个密码表:
脚本:
# Rotor cipher decoder
# parameter input
rotor = [
"ZWAXJGDLUBVIQHKYPNTCRMOSFE", "KPBELNACZDTRXMJQOYHGVSFUWI",
"BDMAIZVRNSJUWFHTEQGYXPLOCK", "RPLNDVHGFCUKTEBSXQYIZMJWAO",
"IHFRLABEUOTSGJVDKCPMNZQWXY", "AMKGHIWPNYCJBFZDRUSLOQXVET",
"GWTHSPYBXIZULVKMRAFDCEONJQ", "NOZUTWDCVRJLXKISEFAPMYGHBQ",
"QWATDSRFHENYVUBMCOIKZGJXPL", "WABMCXPLTDSRJQZGOIKFHENYVU",
"XPLTDAOIKFZGHENYSRUBMCQWVJ", "TDSWAYXPLVUBOIKZGJRFHENMCQ",
"BMCSRFHLTDENQWAOXPYVUIKZGJ", "XPHKZGJTDSENYVUBMLAOIRFCQW"
]
cipher = "HCBTSXWCRQGLES"
key = [2, 5, 1, 3, 6, 4, 9, 7, 8, 14, 10, 13, 11, 12]
tmp_list=[]
for i in range(0, len(rotor)):
tmp=""
k = key[i] - 1
for j in range(0, len(rotor[k])):
if cipher[i] == rotor[k][j]:
if j == 0:
tmp=rotor[k]
break
else:
tmp=rotor[k][j:] + rotor[k][0:j]
break
tmp_list.append(tmp)
# print(tmp_list)
message_list = []
for i in range(0, len(tmp_list[i])):
tmp = ""
for j in range(0, len(tmp_list)):
tmp += tmp_list[j][i]
message_list.append(tmp)
print(message_list)
Linux系统的 shadow 文件格式
root:\(6\)HRMJoyGA\(26FIgg6CU0bGUOfqFB0Qo9AE2LRZxG8N3H.3BK8t49wGlYbkFbxVFtGOZqVIq3q
Q6k0oetDbn2aVzdhuVQ6US.:17770:0:99999:7:::
Linux的 /etc/shadow 文件存储了该系统下所有用户口令相关信息,只有 root 权限可以查看,用户口令是以 Hash + Salt 的形式保护的。
每个字段都用 “\)” 或“:”符号分割;
第一个字段是用户名,如root ;
第二个字段是哈希算法,比如 6 代表SHA-512,1 代表 MD5;
第三个字段是盐,比如上面的 HRMJoyGA
第四个字段是口令+盐加密后的哈希值
后面分别是密码最后一次修改日期、密码的两次修改间隔时间(和第三个字段相比)、密码的有效期(和第三个字段相比)、密码修改到期前的警告天数(和第五个字段相比)、密码过期后的宽限天数(和第五个字段相比)、账号失效时间,这里不太重要要;
直接跑 John 试试
john shadow
如果解开了,加 --show 查看解密口令
john --show shadow
就是Linux的shadow文件格式
ZIP 伪加密
使用 WinHex
我们用winhex打开压缩包,搜索504B,点击第二个504B,从后面找第七、八位,发现是 09 00,改为 00 00 即可。
这种方式只适用于ZIP的伪加密,真加密了此方法不适用。
RSA 加解密
a) 密钥生成
1) 选取两个长度为 K 的素数 P 和 Q,计算 N = P * Q;
2) 计算 phi(N) = (P-1) * (Q-1), 其中 phi(N) 是 Z_(N^*) 的阶;
3) 随机选取一个int整数 e ∈ [ 1, phi(N) - 1 ],使得 gcd( e, phi(N)) = 1;
4) 计算它的逆 d,使得 [ e * d mod phi(N) ] = 1;
5) 输出私钥和公钥 sk = ( N, d ), pk = ( N, e );
b) 加密
c = m^e mod(N)
c) 解密
m = c^d mod(N)
标准银河字母
游戏《指挥官基恩》系列
仿射密码 affine cipher
# Q: y = 17x-8 flag{szzyfimhyzd}
flag = "szzyfimhyzd"
flaglist = []
for i in flag:
flaglist.append(ord(i)-97)
flags = ""
for i in flaglist:
for j in range(0,26):
c = (17 * j - 8) % 26
if(c == i):
flags += chr(j+97)
print('flag{'+ flags + '}')
可能会提示你是放射密码 affine,公式: y = k * x + b mod 26 (跟一元一次函数似的)
后面的取模,如果都是英文字母的话是26,不排除有其他形式,比如ASC II 什么的,取模可能会换。
进制转换
二进制 b开头,八进制 o开头,十进制 d开头,十六进制 x开头
s = 'd87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e'
ss = s.split()
sss = []
print(ss)
for i in ss:
if i[0] == 'd':
i = i[1:]
i = int(i,10)
i = chr(i)
sss.append(i)
elif i[0] == 'x':
i = i[1:]
i = int(i,16)
i = chr(i)
sss.append(i)
elif i[0] == 'o':
i = i[1:]
i = int(i,8)
i = chr(i)
sss.append(i)
elif i[0] == 'b':
i = i[1:]
i = int(i,2)
i = chr(i)
sss.append(i)
print(sss)
flag = ''.join(sss)
print(flag)