CTF--密碼學筆記
凱撒密碼
for shift in range(26):
str = r"YSMWGTZOGVWGTNGHAOB"
new_str = ''
for i in str:
if i >= 'A' and i <= 'Z': # or i>='A'and i<='Z':
i = ord(i)
i = ((i + shift) - 97) % 26 + 97
i = chr(i)
new_str = new_str + i
print(new_str)
替代密碼
維吉尼亞加密
在凱撒密碼基礎之上的加密方式,添加了金鑰的概念
例如明文:TO BE OR NOT TO BE THAT IS THE QUESTION
金鑰: RELATIONS
加密過程如下:
Base64編碼
base64是一種用64個字元來表示任意二進位制資料的方法。(因為2的6次方為64)
base64編碼要求把3個8位位元組(3*8=24)轉化為4個6位位元組(4*6=24),之後在6位位元組的前面補兩個0,形成新的8位位元組。如果剩下的字元不足3個位元組,則用0填充,輸出字元試用‘=’,因此編碼後輸出帶文字末尾可能會出現一個或兩個‘=’。
import base64
print base64.b64decode('dGhpc2lzYW5hcHBsZQ==')
print base64.b64encode('thisisanapple')
ascii碼
ascii,是基於拉丁字母的一套電腦編碼系統
print ord('a')
print chr(97)
ROT13加密
rot13是一種簡易的置換,將26個字母的前半部分與後半部分相互交換,如‘a’<=>’n’,’b’<==>’o’
def rot13(s, OffSet=13):
def encodeCh (ch):
f = lambda x: chr((ord(ch) - x + OffSet) % 26 + x)
return f(97) if ch.islower() else (f(65) if ch.isupper() else ch)
return ''.join(map(encodeCh, s))
s = 'Hello!'
print rot13(s) # Uryyb!
print rot13(rot13(s)) # Hello!
print rot13(s, 13) # Hello!
莫斯密碼
CODE = {'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': '--..',
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.'
}
def main():
msg = raw_input('MESSAGE: ')
for char in msg:
if char == ' ':
print
else:
print CODE[char.upper()] + ' ',
if __name__ == "__main__":
main()
手機按鍵
21表示a,22表示b,51表示j,依此類推。
當鋪密碼
這尼瑪有什麼蛋用?
矩陣加密
下圖為5*5矩陣加密
11表示A,12表示B,依次類推。
柵欄加密
一般比較常見的是2欄的柵欄密碼。
比如明文:THEREISACIPHER
兩個一組,得到:TH ER EI SA CI PH ER
先取出第一個字母:TEESCPE
再取出第二個字母:HRIAIHR
連在一起就是加密的內容:TEESCPEHRIAIHR
而解密的時候,我們先把密文從中間分開,變為兩行:
T E E S C P E
H R I A I H R
再按上下上下的順序組合起來:
THEREISACIPHER
希爾密碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from numpy.ma import array
__Url__ = 'Http://www.purpleroc.com'
__author__ = 'Tracy_梓朋'
from numpy import *
Dic = {chr(i+97):i for i in range(26)}
def decode(pwd, org):
temp = []
result = []
while True:
if len(pwd) % 3 != 0:
pwd.append(pwd[-1])
else:
break
for i in pwd:
temp.append(Dic.get(i))
temp = array(temp)
temp = temp.reshape(len(pwd)/3, 3)
#print temp
#print org
xx = matrix(temp)*org
for j in range(len(pwd)/3):
for i in range(3):
if (int(xx[j, i]) >= 26):
result.append(chr(xx[j, i] % 26 + 97))
#print xx[j, i] % 26
else:
#print xx[j, i]
result.append(chr(xx[j, i] + 97))
return result
def get_vmatrix(org):
org_adjoin = org.I*linalg.det(org)
print org_adjoin
org_det = int(str(abs(linalg.det(org))).split('.')[0])
print org_det
for i in range(1, 26):
if i * org_det % 26 == 1:
break
org_mod = -org_adjoin * i % 26
org_mod = matrix(org_mod)
temp = []
for i in range(org_mod.shape[0]):
for j in range(org_mod.shape[1]):
temp.append(int(str(org_mod[i, j]).split('.')[0]))
org_final = matrix(temp).reshape(org_mod.shape[0], org_mod.shape[1])
#print org_final
return org_final
if __name__ == '__main__':
''' for test
pwd = list("act")
org = matrix(array([[6, 24, 1], [13 , 16, 10], [20, 17, 15]]))
result = decode(pwd, org)
print "".join(result)
deorg = matrix(array([[8, 5, 10], [21 , 8, 21], [21, 12, 8]]))
result = decode(result, deorg)
print "".join(result)
'''
pwd = "wjamdbkdeibr"
pwd = list(pwd)
org = matrix(array([[1,2,3],[4,5,6],[7,8,10]]))
org_vm = get_vmatrix(org)
print org_vm
print "Your flag is :" + "".join(decode(pwd, org_vm))
JSFuck
培根密碼
使用a和b或其他方式代表0和1的二進位制
例如:密文是LOVE,採用大小寫進行二進位制的區分,並且採用“隨意選取句子和文”加密,得到結果就是“SuIyI XuaNq uJUzi HEwEN”
CRC校驗
CRC是為了保證資料的正確採用的一種檢錯的手段。在諸多檢錯手段中,CRC是最著名的一種。CRC的全稱是迴圈冗餘校驗。
import zlib
def crc32(st):
crc = zlib.crc32(st)
if crc > 0:
return "%x" % (crc)
else:
return "%x" % (~crc ^ 0xffffffff)
print crc32('20190804')
Brainfuck/Ook!
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.