加密原理
因为:
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数组
,那么加密形同虚设。
若识别出来异或加密函数,则可用脚本跑出。
时间: 2024-08-01 23:10:18