码迷,mamicode.com
首页 > 其他好文 > 详细

异或加密原理

时间:2015-05-26 21:27:45      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:加密

加密原理

因为:
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数组 ,那么加密形同虚设。

若识别出来异或加密函数,则可用脚本跑出。

异或加密原理

标签:加密

原文地址:http://blog.csdn.net/bugmeout/article/details/46011903

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!