CRYPTOLOGY
by watermelon
推個研究大攝影
這頁真是做的可有可無
這句也是
這句也是
這句也是
這句也是
這句也是
這句也是
真正的Crypto高手只要一張紙一支筆以及Python環境就可以稱霸全場了
編碼
內容單純
一般被認為無安全性
用f(x)加密
用f⁻¹(x)解密
有基礎認識
googleGPT能力
明文(plaintext)
編碼(encoded data)
f(x)
f
⁻¹(x)
f(x) = logₐx
,則f⁻¹(x) = aˣ
有超連結可以點
進制 | 英文 | 範圍 | 前缀 |
---|---|---|---|
二進制 | Binary | 0-1 | 0b |
八進制 | Octal | 0-7 | 0 |
十進制 | Decimal | 0-9 | \ |
十六進制 | Hexadecimal | 0-9, A-F | 0x |
# 不一定要有前後綴
hex_value = "0xabc"
# int(x,base=10)
# x:字串或者數字 base: 進制數 預設為10
dec_val = int(hex_value,16)
# 輸出
print(dec_val) # 2748
# 不一定要有前後綴
dec_value = "2486"
# hex(x) x:十進位數字
hex_val = hex(dec_value)
# 輸出
print(dec_val) #0x9b6
hex_data = "686578" # 16 進位字串
# 數據的長度是奇數 需補0
decoded_string = bytes.fromhex(hex_data).decode("utf-8")
print(decoded_string) # 輸出:'hex'
# 自動補零版
def num2str(num):
# 去掉 '0x' 和可能存在的 'L'
hex_str = hex(num)[2:].replace("L", "")
if len(hex_str) % 2 == 1:
hex_str = "0" + hex_str # 補零
return bytes.fromhex(hex_str).decode("utf-8")
%E5%BB%BA%E5%8C%97%E9%9B%BB%E8%B3%87
%E6%89%80%E4%BB%A5%E4%BD%A0%E8%A6%81%E5%A0%B1%E5%AF%92%E8%A8%93
%E7%BE%85%E5%82%91%E8%AA%AA%E4%BD%A0%E6%98%AF2486
+[------->++<]>.---------.[--->+<]>-.+[->+++<]>.+++++++++++++.[-->+++++<]>+++.++[->+++<]>+.++++++++.-..-------------.-[->+++<]>.++[->+++<]>+.++.[->++++++<]>.+[->+++<]>.--[--->+<]>-.---[->++++<]>+.-[---->+<]>+++.---[->++++<]>+.-----.>++++++++++.-[------->+<]>-.---------.[--->+<]>-.+[->+++<]>.+++++++++++++.[-->+++++<]>+++.++[->+++<]>+.++++++++.-..-------------.-[->+++<]>.++[--->++<]>.-------.[--->+<]>---.[---->+<]>+++..---[->++++<]>+.-[---->+<]>+++.+[->+++<]>+.+++++++++++.++++++++.---------.
借 盧卡斯太強辣
jjencode
這個是不同進位制的轉換
import base64
raw = "melon_idoita"
data = base64.b64encode(raw) # encode
assert raw == base64.b64decode(data) # decode
編碼 | 字符集 |
---|---|
base64 | a-z,A-Z,0-9.+,/,= |
base32 | A-Z,2-7,= |
base16 | 0-9,A-F,= |
hex和base16只差在字母大小寫,why?
即使密碼系統的任何細節已為人悉知,只要密匙(key,又稱金鑰或金鑰)未洩漏,它也應是安全的。
公鑰:沒有洩漏問題
只能加密 不能解密
私鑰:必須保密
只能解密
私鑰可以推導出公鑰,但公鑰推導出私鑰極度困難
(ex:計算時間好幾億年)
私鑰:必須保密
只能解密
公鑰:沒有洩漏問題
只能加密 不能解密
古典密碼
len(K)
,把每個片段中的第i個移到第Kᵢ個
1 | 2 | 3 | 4 |
m | e | l | o |
4 | 2 | 1 | 3 |
l | e | o | m |
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
例:(k=3)
1 2 3 4 5 6 7 8 9
我自己將他命名為跳k個好了
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
例:(k=3)
1 2 3 4 5 6 7 8 9
147
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
例:(k=3)
1 2 3 4 5 6 7 8 9
147 258
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
例:(k=3)
1 2 3 4 5 6 7 8 9
147 258 369
def shift_encode(m,k):
c = ""
for i in range(0, len(m), len(k)):
m1 = [""]*len(k)
if i+len(k) > len(m):
temp = m[i:]
else:
temp = m[i:i+len(k)]
for j in range(len(temp)):
m1[int(k[j])-1] = temp[j]
c += "".join(m1)
return c
if __name__ == '__main__':
m = "melonCTF{cuz_i_am_a_chill_guy}"
k = "4213"
print (shift_encode(m,k))
例:(k=3)
1 2 3 4 5 6 7 8 9
147 258 369
解密:窮舉K即可反推
例:(k=3)
1 2 3 4 5 6 7 8 9
解密:窮舉K即可反推
1 | 5 | 9 | ||||||
---|---|---|---|---|---|---|---|---|
2 | 4 | 6 | 8 | |||||
3 | 7 |
C = 159
例:(k=3)
1 2 3 4 5 6 7 8 9
解密:窮舉K即可反推
1 | 5 | 9 | ||||||
---|---|---|---|---|---|---|---|---|
2 | 4 | 6 | 8 | |||||
3 | 7 |
C = 1592468
例:(k=3)
1 2 3 4 5 6 7 8 9
解密:窮舉K即可反推
1 | 5 | 9 | ||||||
---|---|---|---|---|---|---|---|---|
2 | 4 | 6 | 8 | |||||
3 | 7 |
C = 159246837
for i in m: c+= chr((ord(i)+k)%128)
解密邏輯:for i in m: c+= chr((ord(i)-k)%128)
太費腦了 反正就人家算出來的結果
這次不講 大抵上是用線性同餘
現代密碼
a | b | a^b |
---|---|---|
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
模逆:在a × x = 1 (mode k)的情況下求x
RSA是這三個老哥的名子開頭
怎麼有點4K