Crypto

CTF常见编码及加解密

JavaScript

js在线加解密

jsfuck

  • false => ![]
  • true => !![]
  • undefined => [][[]]
  • NaN => +[![]]
  • 0 => +[]
  • 1 => +!+[]
  • 2 => !+[]+!+[]
  • 10 => [+!+[]]+[+[]]
  • Array => []
  • Number => +[]
  • String => []+[]
  • Boolean => ![]
  • Function => [][“filter”]
  • eval => [][“filter”][“constructor”]( CODE )()
  • window => [][“filter”][“constructor”](“return this”)()

RSA

1
2
3
4
5
6
7
8
9
10
11
12
import gmpy2
p=int(input())
q=int(input())
e=int(input())
# c=int(input())
# m=int(input())
d=gmpy2.invert(e,(p-1)*(q-1))
print(d)
# m=pow(c,d,p*q)
# c=pow(m,e,p*q)
print(m)
print(binascii.unhexlify(hex(m)[2:]))

Rabbit加密

  • 特点:U2FsdGVkX1开头的可能是rabbit,AES,DES

在线加解密网站

Ook!加密

  • 特点:包含了Ook

BrainFuck编码

  • 特点:含+率很高,BrainFuck 语言只有八种符号,所有的操作都由这八种符号 (> < + - . , [ ]) 的组合来完成。

Quoted-printable编码

  • 特点:任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.

解密网站

MD5

  • 特点:有固定长度,一般是32位或者16位,由数字“0-9”和字母“a-f”组成

可以解一些长度不够的md5

凯撒密码Caesar cipher

我写了个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import re
# 密文
s='gmbh{ifmmp_dug}'
res = []
# 答案包含的字符串
flag = 'flag'
for n in range(1,26):
str_decrypt=""
for word in s:
#遇到非字母就跳过
if re.match('[a-zA-Z]', word) is None:
str_decrypt+=word
continue
elif re.match('[a-z]', word):
word_decrypt=chr((ord(word)-ord("a") -n) %26 +ord("a"))
else:
word_decrypt=chr((ord(word)-ord("A") -n) %26 +ord("A"))
str_decrypt += word_decrypt
res.append(str_decrypt)
ans = list(filter(lambda x:flag in x,res))
print(ans)

埃特巴什码

  • 其原理为:它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。在罗马字母表中,它是这样出现的: 明文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import re
    alp = [chr(ord('a')+i) for i in range(0,26)]
    ALP = [chr(ord('A')+i) for i in range(0,26)]
    pla = alp[::-1]
    PLA = PLA[::-1]
    dic_a = dict(zip(alp,pla))
    dic = dict(dic_a,**dict(zip(ALP,PLA)))
    words = 'uozt{Zgyzhv_xlwv_uiln_xguhsld}'
    decypt = ''
    for w in words:
    decypt += dic[w] if re.match('[a-zA-Z]', w) else w
    print(decypt)

当铺密码

  • 根据当前汉字有多少笔画出头,对应的明文就是数字几。

    王:该字外面有 6 个出头的位置,所以该汉字对应的数字就是 6;

    口:该字外面没有出头的位置,那就是0;

    人:该字外面有 3 个出头的位置,所以该汉字对应的数字就是 3;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    s ='田由中人工大王夫井羊'
    en_str = '由田中 由田井 羊夫 由田人 由中人 羊羊 由由王 由田中 由由大 由田工 由由由 由由羊 由中大'
    l = en_str.split(' ')
    res = []
    for w in l:
    k=''
    for item in w:
    k+=str(s.index(item))
    print(chr(int(k)),end='')

费纳姆密码

crypto13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import string
import base64
with open(r'/Users/disda/Desktop/计算机培训/网安/ctfshow/base家族/base.txt') as f:
text = f.read()
while(1):
try:
text = base64.b64decode(text).decode()
except Exception as e:
try:
text = base64.b32decode(text).decode()
except Exception as e:
try:
text = base64.b16decode(text).decode()
except Exception as e:
break
print(text)

培根密码

  1. 密文使用英文语句来表示使用大小写来区分是a还是b,如果密文为大写那么加密就是第一种方式使用密文的每个字母大小写来判定是a还是b(大写为a,小写为b)—单文本语句模式

  2. 密文使用英文语句使用两种不同的·字体来区分a,b通常(将第一种字体转换为a,第二种字体转换为b)

萌新 密码3

1
题目名称:我想吃培根 题目描述: -- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-.. ..--.- -... ..- - ..--.- -... .- -.-. --- -. ..--.- .. ... ..--.- -.-. --- --- .-.. . .-. ..--.- -- -- -.. -.. -- -.. -- -.. -- -- -- -.. -.. -.. /-- -.. -- -.. -.. --/ -- -- -- -- -- /-- -.. -.. -- -.. -- /-- -.. -.. -- 格式:flag{***********}

放入CyberChef中获得

MORSE_IS_COOL_BUT_BACON_IS_COOLER_MMDDMDMDMMMDDDMDMDDMMMMMMMDDMDMMDDM

然后将M换成A,D换成B,解码选择Complete获得GUOWANG