原理就是当成二进制数据流,然后zip,最后输出二进制对应的bit作为文本,因为文本是可以贴出来的……
可以指定一个整数作为加密的密码……
#coding:utf-8
# version 1.1
# 添加了一个参数,可以指定轮换的值,虽然暴力破解完全没难度……
import sys
import getopt
import zlib
import base64
from cStringIO import StringIO
_move = 15
_line_sep = "\n"
class TMain:
def __init__(self):
options, args = 0,0
if len(sys.argv) == 1:
self.usage()
try:
options, args = getopt.getopt(sys.argv[1:], 'dm:')
except getopt.GetoptError, err:
print str(err)
self.usage()
global _move
mode = "serialize"
for opt, value in options:
if opt == "-d":
mode = 'deSerialize'
if opt == "-m":
try:
_move = int(value)
if _move < 0 or _move > 128:
print "Specify a value in range [0, 128]"
sys.exit(1)
except ValueError:
# won't effect _move
pass
for filename in args:
f = getattr(self, mode)
s = f(self.readfile(filename))
fout = file(filename + ".out.py", 'wb')
fout.write(s)
fout.close()
print
print "##################################"
print s
def moveCode(self, strobj ):
result = ""
for i in strobj:
pass
def compress(self,strobj):
return zlib.compress(strobj, 9)
def decompress(self,strobj):
return zlib.decompress(strobj)
def serialize(self, strobj ):
'''serialize the string into encoded format'''
strobj = self.compress( strobj )
strobj = base64.standard_b64encode(strobj)
max_char_per_line = 40
c = 0
result = ""
for i in strobj:
c += 1
if c >= max_char_per_line:
c = 1
result += _line_sep
result += hex( ord( i ) #+ _move
)[2:]
return result
def deSerialize(self, strobj ):
strobj = strobj.replace( _line_sep, '' )
result = ""
strlen = len(strobj)
if strlen % 2 != 0 :
raise Exception("Bad value")
for i in xrange( 0, len( strobj ), 2 ):
c = strobj[i:i + 2]
try:
c = chr( int( c, 16 ) #- _move
)
tmp= hex( ord(c))[2:]
result += c
except ValueError, err:
print c, int( c, 16 ), int( c, 16 ) - _move
# for i in result:
# sys.stdout.write(i)
# print
result = base64.standard_b64decode(result)
#return compress(result)
return self.decompress( result )
def readfile(self, filename ):
return open( filename ).read()
def usage(self,):
usage_str= '''
{this_program} [-d] [-m 10] filename
if the -d option is given, program will try to decode file,
otherwise, program will encode file and print the result.
-m specifies the move steps for character,
defaults to 15, notice, remember this value!
you will need it
'''.format( this_program = sys.argv[0])
print usage_str
sys.exit()
def main():
m = TMain()
if __name__ == '__main__':
main()