異或加密原理

加密原理

因爲:
1. A xor B xor C = (A xor B) xor C = A xor (B xor C)
2. A xor B xor B = A

所以有:
A xor B xor B = (C= A xor B) xor B = C xor B = A

公開加密後的值C,保留key Bc xor B 得到原始數據A

#PYTHON 2.7
#coding: utf-8
'''
xor operator lab
'''

def xor_encode(original,key):
    '''
    function:   異或加密
    original:   原始字符
    key:        異或表
    return:     加密後的字符串
    '''
    encoded=[]
    for i in range(len(original)):
        encode_chr = chr( ord( original[i] ) ^ key[i] )
        encoded.append(encode_chr)
    return ''.join(encoded)

def xor_decode(fakeStr,key):
    '''
    function: 疑惑解密
    fakeStr:  待解密字符
    key:      異或表
    return:   解密後的字符串
    '''
    decoded=[]
    for i in range( len( fakeStr ) ):
        decode_chr = chr( ord( fakeStr[i] ) ^ key[i] ) 
        decoded.append(decode_chr)
    return ''.join( decoded )

def create_keyList(start,len):
    '''
    function: 創建KeyList
    start:     第一個key值
    len:       與待解密字符串長度一致
    return:   創建好的KeyList
    '''
    keyList=[]
    for i in range(len):
        keyList.append(start+i)
    return keyList


def strtoHex(str):
    '''
    function: 將字符串轉化爲16進制字符串
    str:      待轉換字符串 like 'AAAA'
    return:   轉換後的字符串 like '41414141'
    '''
    return str.encode('hex')

def HextoStr(hexStr):
    '''
    function: 將16進制字符串轉爲可打印字符串
    hexStr:   待轉化字符串 like '42424242'不帶前綴0x之類
    return :  轉化後的字符串  like 'BBBB' 
    '''
    return hexStr.decode('hex')

def rmPrefix(str,prefix):
    '''
    function: 爲16進制字符串去掉如'0x,/x,\x, '等前綴
    str:      含前綴的字符串
    prefix:    前綴標誌
    return:    去掉前綴的字符串
    '''
    lStr=[]
    lStr = str.split(prefix)
    return ''.join(lStr)

#usage:

ori="welcome to here"
keylist=create_keyList(0x70,len(ori))


decoded= xor_encode(ori,keylist)
print decoded
real=xor_decode(decoded,keylist)
print real



#輔助功能
hex_code=strtoHex(decoded)
print hex_code

#when you can't copy the un-printed code, so using the hex-str
decode_str=HextoStr(hex_code)
print decode_str

#when using od
noPre_str=rmPrefix("00 D0 00 00 00 00 FC 77 00 10 00 00 00 02 00 00",' ' )
print HextoStr(noPre_str)

OUTPUT
這裏寫圖片描述

異或加密的,關鍵是在key Table 上,如果在程序中明文存放key數組 ,那麼加密形同虛設。

若識別出來異或加密函數,則可用腳本跑出。

發佈了63 篇原創文章 · 獲贊 6 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章