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進数
  • 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'
    
  • 回転8進
  • oct(num)
    
  • 回転16進
  • hex(num)
    
  • 10進数任意進数(転がり相除算を用いる)
  • .
    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