加密原理
因爲:
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 B
,c 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數組
,那麼加密形同虛設。
若識別出來異或加密函數,則可用腳本跑出。