Pythonは簡単な符号化と復号化の変換を実現する
33314 ワード
Pythonはいくつかの簡単な符号化と復号化の変換を実現します
CTFに入門してしばらくの間、いくつかの簡単な暗号問題を処理する時、各種のオンライン復号サイトを使って問題を解くことに慣れていたが、その中の良萎がそろっていないことを発見して、よく問題を解くのに不要な面倒をもたらして、そこで自分でPythonでいくつかの簡単な暗号あるいは文字の数字の転換を実現することを試みた.△主にpythonの使い方を練習したいのですが...
1.各進数間の変換
pythonの内蔵関数をそのまま使えばいいです
バイナリプレフィックス:0 bまたは0 B 8進(octonary)プレフィックス:0 oまたは0 O 16進(hexadecimal)プレフィックス:0 xまたは0 X任意進数回転10進数
-基本進数(2,8,10,16)を2進数に変換(任意進数不可)回転8進 回転16進 10進数任意進数(転がり相除算を用いる) .
2.stringとbytes間の変換
python 3では、文字列はunicode形式であり、バイトはutf-8、gbkなどを含み、ネットワーク転送、ハードディスク保存はバイト形式で保存される.
strとbytesフォーマットの違い:
str:
表現形式:a=“hello,world”
内部原理:
00000000 00000000 00000000 01101000 ‘h’ ... ... bytes:
表現形式:a=b’hello,world’
内部原理:
01101000 utf-8 ... ...
00000000 01101000 gbk ... ...
変換コード
3.文字列とベース間の相互変換
以下のコードはpython 3を例にとります
4.URL符号化「中国語」および「特殊文字」は、UTF-8文字セットを用いてurl符号化に対応している.例えば、」では、UTF-8文字セットを用いて得られるバイトは0 xE 4 0 xB 8 0 xADであり、Url符号化後に「%E 4%B 8%AD」が得られる.
5.シーザー暗号解読
復号コードを直接添付
6.フェンスパスワード解読
7.バージニアパスワード
CTFに入門してしばらくの間、いくつかの簡単な暗号問題を処理する時、各種のオンライン復号サイトを使って問題を解くことに慣れていたが、その中の良萎がそろっていないことを発見して、よく問題を解くのに不要な面倒をもたらして、そこで自分でPythonでいくつかの簡単な暗号あるいは文字の数字の転換を実現することを試みた.△主にpythonの使い方を練習したいのですが...
1.各進数間の変換
pythonの内蔵関数をそのまま使えばいいです
バイナリプレフィックス:0 bまたは0 B 8進(octonary)プレフィックス:0 oまたは0 O 16進(hexadecimal)プレフィックス:0 xまたは0 X
int(num)
int("num",sys)
# num ,sys
int(0X12ab) #16 10
>>> 4779
int("12ab",12) #12 10
>>>2147
-基本進数(2,8,10,16)を2進数に変換(任意進数不可)
bin(num)
>>> bin(8)
'0b1000'
>>> bin(8)[2:]
'1000'
oct(num)
hex(num)
def Decconvert(dec,sys):
result = []
while (dec/sys)!=0:
a=dec%sys
if a>=10:
a=chr(65+(a-10))
result.append(a)
dec=int(dec/sys)
result.reverse()
for i in result:
print(i,end="")
print("")
Decconvert(22,12)
>>>1A # 10 22 12 1A
2.stringとbytes間の変換
python 3では、文字列はunicode形式であり、バイトはutf-8、gbkなどを含み、ネットワーク転送、ハードディスク保存はバイト形式で保存される.
strとbytesフォーマットの違い:
str:
表現形式:a=“hello,world”
内部原理:
00000000 00000000 00000000 01101000 ‘h’ ... ... bytes:
表現形式:a=b’hello,world’
内部原理:
01101000 utf-8 ... ...
00000000 01101000 gbk ... ...
変換コード
b = b'' # bytes
b = byte() # bytes
b = b'hello' # hello bytes
b = bytes('string',encoding=' ') # bytes , bytes
b = str.encode(' ') # encode bytes, utf-8
str = b.decode(' ') # bytes , utf-8 。
3.文字列とベース間の相互変換
以下のコードはpython 3を例にとります
# ->base
import base64
string=' a' #
string=string.encode('utf-8') # byte , b64encode byte
print("Base64:",str(base64.b64encode(string),'utf-8')) #
print("Base32:",str(base64.b32encode(string),'utf-8'))
print("Base16:",str(base64.b16encode(string),'utf-8'))
>>>
Base64: 5a2X56ym5Liy5Zyo6L+ZYQ==
Base32: 4WWZPZ5MU3SLRMXFTSUORP4ZME======
Base16: E5AD97E7ACA6E4B8B2E59CA8E8BF9961
base->
import base64
print(str(base64.b64decode('5a2X56ym5Liy5Zyo6L+ZYQ=='),'utf-8'))
print(str(base64.b32decode('4WWZPZ5MU3SLRMXFTSUORP4ZME======'),'utf-8'))
print(str(base64.b16decode('E5AD97E7ACA6E4B8B2E59CA8E8BF9961'),'utf-8'))
>>>
a
a
a
4.URL符号化「中国語」および「特殊文字」は、UTF-8文字セットを用いてurl符号化に対応している.例えば、」では、UTF-8文字セットを用いて得られるバイトは0 xE 4 0 xB 8 0 xADであり、Url符号化後に「%E 4%B 8%AD」が得られる.
from urllib import parse
str1 = 'url '
str2 = parse.quote(str1) #
print(str2) #str2=url%E7%BC%96%E7%A0%81
str3 = parse.unquote(str2) #
print(str3) #str3=url
5.シーザー暗号解読
復号コードを直接添付
def caesar_Crypto(msg):
lowercase = 'abcdefghijklmnopqrstuvwxyz'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
result = []
offset = 1
while offset<=26:
temp = []
for char in msg:
if char in lowercase:
temp.append(chr(97 + (ord(char) - 97 + offset) % 26))
elif char in uppercase:
temp.append(chr(65 + (ord(char) - 65 + offset) % 26))
else:
temp.append(char)
string = "".join(temp)
print (string)
result.append(string)
offset += 1
return result
caesar_Crypto('LZYGQ326N5QXM')
6.フェンスパスワード解読
def railfence(msg):
l=len(msg)
a=[]
for i in range(2,l):
if l%i==0:
a.append(i)
if a==[]:
print(" ")
for j in a:
result=[]
for k in range(j):
for p in range(k,l,j):
result.append(msg[p])
string="".join(result)
print("%d :"%j+string)
railfence('adqwertt') #
>>>2 :aqetdwrt
4 :aedrqtwt
7.バージニアパスワード
#
def VigenereEncrypto (input,key) :
ptLen = len(input)
keyLen = len(key)
quotient = int(ptLen/keyLen) #
remainder = ptLen % keyLen #
out = ""
for i in range (0 , quotient) :
for j in range (0 , keyLen) :
c = int((ord(input[i*keyLen+j]) - ord('a') + ord(key[j]) - ord('a')) % 26 + ord('a'))
out += chr(c)
for i in range (0 , remainder) :
c = int((ord(input[quotient*keyLen+i]) - ord('a') + ord(key[i]) - ord('a')) % 26 + ord('a'))
out += chr(c)
print(out)
VigenereEncrypto('input','key')
>>> :srnex
#
def VigenereDecrypto (output , key) :
ptLen = len (output)
keyLen = len (key)
quotient = int(ptLen/keyLen)
remainder = ptLen % keyLen
inp = ""
for i in range (0 , quotient) :
for j in range (0 , keyLen) :
c = int((ord(output[i*keyLen+j]) - ord('a') + 26 - (ord(key[j]) - ord('a'))) % 26 + ord('a'))
inp += chr (c)
for i in range (0 , remainder) :
c = int((ord(output[quotient*keyLen + i]) - ord('a') + 26 - (ord(key[i]) - ord('a'))) % 26 + ord('a'))
inp += chr (c)
print(inp)
VigenereDecrypto('srnex','key')
>>>input