您的位置:首页 > 编程语言 > Python开发

Python 简单的可逆加密程序

2013-06-18 10:58 477 查看
#coding=utf-8
'''''
Description: 可逆的加密与解密
Environment: python2.5.x
Author:idehong@gmail.com
'''

import os
import sys

class Code(object):
'''''可逆的加密与解密'''

def __init__(self, key = "idehong@gmail.com"):
self.__src_key = key
self.__key = self.__get_strascii(self.__src_key, True)

def encode(self, value):
'''''加密函数, 加密后为一串数字'''
return  "%d" % (self.__get_strascii(value, True) ^ self.__key)

def decode(self, pwd):
'''''解密函数'''
if self.is_number(pwd):
return self.__get_strascii( (int(pwd)) ^ self.__key, False )
else:
print 'require number.'

def reset_key(self, key):
'''''重新设置key'''
self.__src_key = key
self.__key = self.__get_strascii(self.__src_key, True)

#===============================================================================
#        内部调用接口
#===============================================================================

def __get_strascii(self, value, bFlag):
if bFlag:
return self.__get_str2ascii(value)
else:
return self.__get_ascii2str(value)

def __get_str2ascii(self, value):
ls = []
for i in value:
ls.append( self.__get_char2ascii( i ) )
return long("".join(ls))

def __get_char2ascii(self, char):
'''''获取单个字符的acsii码值'''
try:
return "%03.d" % ord(char)
except (TypeError, ValueError):
print "key error."
exit(1)

def __get_ascii2char(self, ascii):
if self.is_ascii_range(ascii):
return chr(ascii)
else:
print "ascii error(%d)" % ascii
exit(1)

def __get_ascii2str(self, n_chars):
ls = []
s = "%s" % n_chars
n, p = divmod(len(s), 3)
if p > 0:
nRet = int(s[0 : p])
ls.append( self.__get_ascii2char(nRet))

pTmp = p
while pTmp < len(s):
ls.append( self.__get_ascii2char( int(s[pTmp: pTmp + 3])) )
pTmp += 3
return "".join(ls)

#================================================================================
#        工具接口
#================================================================================

def is_number(self, value):
try:
int(value)
return True
except (TypeError, ValueError):
pass
return False

def is_ascii_range(self, n):
return 0 <= n < 256

def is_custom_ascii_range(self, n):
return 33 <= n <48 or 58 <= n < 126

class Usage(object):
'''''
命令行参数读取与解析
'''

def __init__(self):

self._clsWork = Code()
self._args_dic = {'arg_help' : ['-?', '-help'],
'arg_p' : ['-p', '-pwd'],
'arg_t' : ['-t', '-text'],
'arg_k' : ['-k', '-key'],
}

def help(self, *k):

strHelp = "Usage: pwd [-options] [args...] where option include:"
strHelp += """
-? -help                    print this help message
-k <key_str> -p <pwd_str>
-k <key_str> -t <text_str>"""

print strHelp

def args(self, argv_ls):
'''''dispatch command'''

#        print argv_ls
if len(argv_ls) <= 1 or len(argv_ls) > 5:
print 'Unrecognized option'
return

cmd_dic = {}
curr_cmd = ''
# control command
for i, v in enumerate(argv_ls[1:]):
for j in self._args_dic.items():
# add command
if v in j[1] and j[0] not in cmd_dic:
curr_cmd = j[0]
cmd_dic[curr_cmd] = []
break
else:
# add argv
if cmd_dic:
cmd_dic[curr_cmd].append(v)

# exec command
if cmd_dic:
self.exec_cmd(cmd_dic)
else:
print 'Unrecognized option'

def exec_cmd(self, cmd_dic):
'''''exec cmd'''
if len(cmd_dic) == 2:
if 'arg_p' in cmd_dic and 'arg_k' in cmd_dic\
and len(cmd_dic['arg_p']) == 1 and len(cmd_dic['arg_k']) == 1:

self._clsWork.reset_key(cmd_dic['arg_k'][0])
print self._clsWork.encode(cmd_dic['arg_p'][0])
return
elif 'arg_t' in cmd_dic and 'arg_k' in cmd_dic\
and len(cmd_dic['arg_t']) == 1 and len(cmd_dic['arg_k']) == 1:
self._clsWork.reset_key(cmd_dic['arg_k'][0])
print self._clsWork.decode(cmd_dic['arg_t'][0])
return
self.help()

if __name__ == '__main__':
usage = Usage()
usage.args(sys.argv)

转自:http://www.oschina.net/code/snippet_16840_1579

测试代码:

encode= Code().encode('test')
print encode
print Code().decode(encode)

结果:‘test'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: