1、base64
#附一个脚本base64解码 #!/user/bin/env python # -*-coding:utf-8 -*- import base64 a = open(r'crypto1.txt','r') s = a.read() print(base64.b64decode(s))
2、Caesar
用凯撒在线解密工具,第一个字符到c的偏移量作为每个字符的偏移量(14),得到flag。
附两个脚本。
#!/usr/bin/python # -*- coding=utf -*- def caesar(cipher): for j in range(26): str_list = list(cipher) i = 0 while i < len(cipher): if not str_list[i].isalpha(): str_list[i] = str_list[i] else: a = "A" if str_list[i].isupper() else "a" str_list[i] = chr((ord(str_list[i]) - ord(a) + j) % 26 + ord(a)) i = i + 1 print(''.join(str_list)) if __name__ == '__main__': cipher = "oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}" caesar(cipher)
#!/user/bin/env python # -*-coding:utf-8 -*- a = open(r'crypto2.txt','r') ciphertext = a.read() b='abcdefghijklmnopqrstuvwxyz' for key in range(26): flag = '' for i in ciphertext: if i in b: num = b.find(i) num = num - key if num<0: num = num + len(b) flag = flag + b[num] else: flag = flag + i print('key %s :%s'%(key,flag))
cyberpeace{you_have_learned_caesar_encryption}
3、Morse
题解:0对应. 1对应-,去莫尔斯电码在线解码得到flag括号中内容,修改一下即可。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- CODE_TABLE = { # 26 个英文字符 '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': '--..', # 10 个数字 '0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', # 16 个特殊字符 ',': '--..--', '.': '.-.-.-', ':': '---...', ';': '-.-.-.', '?': '..--..', '=': '-...-', "'": '.----.', '/': '-..-.', '!': '-.-.--', '-': '-....-', '_': '..--.-', '(': '-.--.', ')': '-.--.-', '$': '...-..-', '&': '. . . .', '@': '.--.-.' # 你还可以自定义 } def morsedecode(morse): msg ='' codes = morse.split(' ') for code in codes: if code =='': msg += ' ' else: UNCODE =dict(map(lambda t:(t[1],t[0]),CODE_TABLE.items())) msg += UNCODE return msg a = open(r'crypto3.txt','r') ciphertext = a.read() ciphertext = ciphertext.replace('1','-') ciphertext = ciphertext.replace('0','.') FLAG = morsedecode(ciphertext) flag = FLAG.lower() flag = 'cyberpeace{'+flag+'}' print('flag is ',flag)
cyberpeace{morsecodeissointeresting}
4、混合编码
两次base64解码后得到字符的ASCII码,转成字符加上格式就是flag。
最后ASCLL转文本得flag
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import base64 a = open(r'crypto8.txt','r') s = a.read() # base64解密一下 b = base64.b64decode(s).decode('ascii') # 对解密后的字符串进行处理 b = b.strip('&#;') c = [] c = b.split(';&#') # unicode解密 d = '' for i in c: d += chr(int(i)) # base64再次解密 e = base64.b64decode(d).decode('ascii') # 对字符进行处理 e = e.strip('/') f = [] f = e.split('/') # 转化为ascii码 flag ='' for i in f: flag += chr(int(i)) print('flag is ',flag)
cyberpeace{welcometoattackanddefenceworld}
5、不仅仅是Morse
将/
化为空格,转化为标准morse码,进行morse解密,得到一串类似培根加密后的密文。先用莫尔斯电码解密
MAY_BE_HAVE_ANOTHER_DECODEHHHH////////这个才是培根密码AAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA
很明显前面的东西是假的而后面的东西才是我们应该关心的东西,培根解密后发现是flag。
#摩斯解密脚本 if __name__ == '__main__': file = open(r'D:\CTF\攻防世界\Crypto\不仅仅是Morse.txt', 'r') cipher = file.read() cipher = cipher.replace('/', ' ') plaintext = morse(cipher) print(plaintext)
#培根脚本 #!/usr/bin/env python3 # -*- coding:utf-8 -*- import re # 密文转化为指定格式 s = 'AAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA' a = s.lower() # 字典 CODE_TABLE = { 'a':'aaaaa','b':'aaaab','c':'aaaba','d':'aaabb','e':'aabaa','f':'aabab','g':'aabba', 'h':'aabbb','i':'abaaa','j':'abaab','k':'ababa','l':'ababb','m':'abbaa','n':'abbab', 'o':'abbba','p':'abbbb','q':'baaaa','r':'baaab','s':'baaba','t':'baabb','u':'babaa', 'v':'babab','w':'babba','x':'babbb','y':'bbaaa','z':'bbaab' } # 5个一组进行切割并解密 def peigendecode(peigen): msg ='' codes = re.findall(r'.{5}', a) for code in codes: if code =='': msg += ' ' else: UNCODE =dict(map(lambda t:(t[1],t[0]),CODE_TABLE.items())) msg += UNCODE return msg flag = peigendecode(a) print('flag is ',flag)
cyberpeace{attackanddefenceworldisinteresting}
6、幂数加密
二进制幂数加密法
二进制数除了0和1的表示方法外,在由二进制转换成十进制的时候,还可以表示成2的N次方的形式。例如:15=2^0 + 2^1 + 2^2 + 2^3
并且我们发现,任意的十进制数都可以用2^n 或 2^n + 2^m+……的形式表示出来。
把其中的次幂拿出来的牌排列作为这个数的密文的过程就是二进制幂数加密。
题解:这道题根本就不是二进制幂数加密,只是把这串数分开后,每组相加得到字母在字母表的顺序
密文分成: 88421 0122 048 02244 04 0142242 0248 0122
求出根据幂数求出明文。
lt = ["88421","0122","048","02244","04","0142242","0248","0122"] flag = '' for i in range(len(lt)): #len(lt)=8 list = [] for j in lt[i]: list.append(j) ans = 0 for k in list: ans += int(k) # 字母ascii值与字母顺序相差为96 print(ans) flag += chr(ans+64) print('flag is ',flag)
有博主说给的密文是云影密码
此密码运用了1248代码,因为本人才疏学浅,尚未发现有过使用的先例,因此暂归为原创密码,若有密码界前辈认为不妥,请指出此密码或类似密码的普遍使用历史并附寄一份到我站内邮箱,我将以最快速度核查并改正。由于这个密码,我和片风云影初识,为了纪念,将其命名为“云影密码”,原文请见谜题大全精华区。
原理很简单,有了1,2,4,8这四个简单的数字,你可以以加法表示出0-9任何一个数字,例如0=28,7=124,9=18。
这样,再用1-26来表示A-Z,就可以用作密码了。
为了不至于混乱,我个人引入了第五个数字0,来用作间隔,以避免翻译错误,所以还可以称“01248密码”。
题目:12401011801180212011401804
第一步,分割,即124 1 118 118 212 114 18 4
第二步,基本翻译,例如124可以表示7,也可以表示16(但不可能是34,因为不会超过26),所以可以放在一边,翻译其他没有异议的,可得:124 a s s w o 18 d
第三步,推测得出明文。可以推测后面的18表示r,前面的为p最合适。
明文:password(密码).
#!/user/bin/env python # -*-coding:utf-8 -*- a = open(r'crypto11.txt','r') ciphertext = a.read() s = ciphertext.split('0') flag = '' for i in range(len(s)): list = [] for j in s[i]: list.append(j) b = 0 for k in list: b += int(k) # 字母ascii值与字母顺序相差为96 flag += chr(b+96) print('flag is ',flag)
cyberpeace{WELLDONE}
7、Railfence
The rail fence cipher栅栏密码
此题有坑,栅栏密码具体操作不止一种,一些在线工具解密也会得到不一样的结果。题解:(复制了一段评论区的大佬的讲话):ccehg yaefnpeoo be{lcirg} epriec_o ra_g 这样断开,然后12345432123…的回形取每组第一个,提示是分5组,以及flag开头的词组和{以及以}结尾,难点在不是均匀分栏,要自己手动分。
cyberpeace{railfence_cipher_gogogo}
8、easy_RSA
RSA加密算法是一种非对称加密算法。(具体是个啥现在还没搞懂)
为了产生两个密钥,选取两个大素数,p和q,为了获得最大程度的安全性,两数的长度一样。计算乘积n=p*q;
随机取加密密钥e,使得e 和(p-1)(q-1) 互素,最后采用扩展欧几里得算法计算解密密钥d,
d=e^-1 mod (p-1)(q-1)
(n,e)是公钥,(n,d)是私钥。
思路1
- RSA的算法涉及三个参数,n、e、d。
其中,n是两个大质数p、q的积,n的二进制表示所占用的位数,就是所谓的密钥长度。
e和d是一对相关的值,e可以任意取,但要求e与(p-1)(q-1)互质;再选择d,要求(de)mod((p-1)*(q-1))=1。
(n,e),(n,d)就是密钥对。其中(n,e)为公钥,(n,d)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^d mod n;B=A^e mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e和d可以互换使用,即:
A=B^d mod n;B=A^e mod n - 直接给了p,q,e,求d,即为暴力破解RSA的私钥之一的d
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import gmpy2 p = 473398607161 q = 4511491 e = 17 s = (p-1)*(q-1) d = gmpy2.invert(e,s) print('flag is :',d)
思路2
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17求解出d
RSA算法中,d,e,p,q的关系如下:
d=e^-1 mod (p-1)(q-1)
现已知p,q,e,可用扩展欧几里得算法进行求逆运算:
#!/usr/bin/python # -*- coding=utf -*- def exgcd(a, n): if n == 0: return 1, 0 else: x, y = exgcd(n, a % n) x, y = y, x - (a // n) * y return x, y def getReverse(a, n): re, y = exgcd(a, n) while(re < 0): re += n return re if __name__ == "__main__": p = 473398607161 q = 4511491 e = 17 d = getReverse(e, (p - 1)*(q - 1)) print('d = ' + str(d))
d = 125631357777427553
cyberpeace{125631357777427553}
9、转轮机加密
转轮密码机是由一个输入键盘和一组转轮组成,每个转轮上标有有26个字母,字母的的顺序随意。转轮之间由齿轮进行连接,当一个转轮转动的时候,可以将一个字母转化成另外一个字母。
转轮密码机由多个转轮构成,每个转轮旋转的速度都不一样,比如有3个转轮,分别标号为1,2,3,其中1号转轮转动26个字母后,2号转轮就转动一个字母,当2号转轮转动26个字母后,3号转轮就转动1个字母。因此,当转轮密码机转动26X26X26次后,所有转轮恢复到初始状态,即3个转轮密码机的一个周期长度为26X26X26(17576)的多表代换密码。
转轮机的工作原理
每一个旋转轮代表一个单表替代系统,旋转一个引脚,再转变为另一个单表替代系统。为使机器更安全,可把几种转轮和移动的齿轮结合起来。因为所有转轮以不同的速度移动,n个转轮的机器的周期是26的n次方,即n个单表替代系统。最后一个转轮转完一圈之后,它前面的转轮就旋转一个引脚,有点像时钟的齿轮。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import re sss = '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 <' m = 'NFQKSEVOQOFNP' # 将sss转化为列表形式 content=re.findall(r'< (.*?) <',sss,re.S) # re.S:DOTALL,此模式下,"."的匹配不受限制,可匹配任何字符,包括换行符 iv=[2,3,7,5,13,12,9,1,8,10,4,11,6] print(content) vvv=[] for i in range(13): index=content[iv[i]-1].index(m[i]) vvv.append(index) print(vvv) for i in range(0,26): flag="" for j in range(13): flag += content[iv[j]-1][(vvv[j]+i)%26] print(flag.lower())
2。手动转
转前: OSFEZWAXJGDLUBVIQHKYPNTCRM NACZDTRXMJQOYHGVSFUWIKPBEL FHTEQGYXPLOCKBDMAIZVRNSJUW FCUKTEBSXQYIZMJWAORPLNDVHG KCPMNZQWXYIHFRLABEUOTSGJVD PNYCJBFZDRUSLOQXVETAMKGHIW QGWTHSPYBXIZULVKMRAFDCEONJ QNOZUTWDCVRJLXKISEFAPMYGHB VUBMCQWAOIKZGJXPLTDSRFHENY OWTGVRSCZQKELMXYIHPUDNAJFB NBVCXZQWERTPOIUYALSKDJFHGM EIURYTASBKJDFHGLVNCMXZPQOW SXCDERFVBGTYHNUMKILOPJZQAW 转后: NACZDTRXMJQOYHGVSFUWIKPBEL FHTEQGYXPLOCKBDMAIZVRNSJUW QGWTHSPYBXIZULVKMRAFDCEONJ KCPMNZQWXYIHFRLABEUOTSGJVD SXCDERFVBGTYHNUMKILOPJZQAW EIURYTASBKJDFHGLVNCMXZPQOW VUBMCQWAOIKZGJXPLTDSRFHENY OSFEZWAXJGDLUBVIQHKYPNTCRM QNOZUTWDCVRJLXKISEFAPMYGHB OWTGVRSCZQKELMXYIHPUDNAJFB FCUKTEBSXQYIZMJWAORPLNDVHG NBVCXZQWERTPOIUYALSKDJFHGM PNYCJBFZDRUSLOQXVETAMKGHIW 密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6 密文为:N F Q K S E V O Q O F N P 在第 17 行发现有语义的:FIREINTHEHOLE cyberpeace{fireinthehole}
剩下得题目可以参考 https://blog.csdn.net/weixin_42172261/article/details/96327102 https://www.lizenghai.com/archives/5800.html https://blog.csdn.net/Ryannn_/article/details/102708011#0x01%20Caesar