使用python对txt文本文档简单加密

今天想到自已有一些个人数据什么的常常会存在服务器上,或者邮件中,或者网盘上。因为不想因为帐号被盗,这些个人数据会轻易就被别人看到,想对文件进行加密,想到了使用一个密钥与文档中的数据进行异或运算,在解密的时候再使用同样的密钥与数据再进行一次异或运算就可对数据进行解密,所以这里想到使用语法最简单的python来作这个事,也没有想过用c语言,因为C语言如果给别人用,在不同的并台上还要再编译后再能用。
先上源码:

#-*- coding: utf-8 -*-

#加密测试

import os,sys

import numpy


codepw = 'testpassword'


#获取脚本路径

def cur_file_dir():

    pathx = sys.argv[0]

    path,_file = os.path.split(pathx)

    if cmp(path,'') == 0:

        path = sys.path[0]

    #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径

    if os.path.isdir(path):

        return path

    elif os.path.isfile(path):

        return os.path.dirname(path)

    

#获取父目录

def GetParentPath(strPath):

    if not strPath:

        return None;

    lsPath = os.path.split(strPath);

    if lsPath[1]:

        return lsPath[0];

    lsPath = os.path.split(lsPath[0]);

    return lsPath[0];


#获取所有界面的json文件列表

def getAllExtFile(path,fromatx = ".txt"):

    jsondir = path

    jsonfilelist = []

    for root, _dirs, files in os.walk(jsondir):

        for filex in files:          

            #print filex

            name,text = os.path.splitext(filex)

            if cmp(text,fromatx) == 0:

                jsonArr = []

                rootdir = path

                dirx = root[len(rootdir):]

                pathName = dirx +os.sep + filex

                jsonArr.append(pathName)

                (newPath,_name) = os.path.split(pathName)

                jsonArr.append(newPath)

                jsonArr.append(name)

                jsonfilelist.append(jsonArr)

    return jsonfilelist


def getAllTxtFileFromDir(txtpath = '/Users/fengmm521/Documents/ebook/book'):

    txts = getAllExtFile(txtpath,'.txt')

    txtfs = []

    for dx in txts:

        txtfs.append(txtpath + dx[0])

    print txtfs

    return txtfs



def getAllPxtFileFromDir(txtpath = ''):

    txts = getAllExtFile(txtpath,'.ptx')

    txtfs = []

    for dx in txts:

        txtfs.append(txtpath + dx[0])

    return txtfs



def ecodeTxtFileAndSave(txtf,pw = 'password'):

    f = open(txtf,'r')

    txtstr = f.read()

    f.close()

    ptxtstr = []

    print txtstr[0:10]

    pwn = 0

    for c in txtstr:

        if pwn >= len(pw):

            pwn = 0

        ptxtstr.append(ord(c)^ord(pw[pwn]))

        pwn += 1

    print len(ptxtstr)

    print len(txtstr)

    print ptxtstr

    (newPath,_extname) = os.path.splitext(txtf)

    (pathx,filename) = os.path.split(newPath)

    print pathx

    print filename

    savefname = filename + '.ptx'

    fsave = open(savefname,'w')

    ary = numpy.asarray(ptxtstr)

    ary.astype('float').tofile(fsave)

    fsave.close()

    

def decodeTxtFromFilePath(txtf,pw = 'password'):

    ptxfile = open(txtf,'r')

    xtx = numpy.fromfile(ptxfile)

    ptxfile.close()

    ptxtstr = list(xtx)

    pxtmp = ''

    pwn = 0

    for c in ptxtstr:

        if pwn >= len(pw):

            pwn = 0

        pxtmp += chr(int(c)^ord(pw[pwn]))

        pwn += 1

    print ptxtstr

    print pxtmp


def ecodeAllFileAndSave():

    txtfs = getAllTxtFileFromDir()

    if txtfs:

        for tx in txtfs:

            ecodeTxtFileAndSave(tx)

def decodeAllTxtFromFile():

    txtfs = getAllPxtFileFromDir(cur_file_dir())

    for ftmp in txtfs:

        decodeTxtFromFilePath(ftmp)

    print txtfs

def main():

    ecodeAllFileAndSave()

    decodeAllTxtFromFile()

if __name__ == '__main__':

    main()


这里有一些处理方法在别的地方可能大家会用的上,像:

1.如何对字符串中每一个字符转为ascii码,以及如何将ascii码转为字符的两个函数

   ord(c):

这个python函数的主要功能是将字符转为ascii码整数

   chr(i):

这个函数的功能自然就是将整数的ascii码转为字符

2.使用numpy模块的tofile(f)函数将list数据以二进制数据流的型式写入文件。

  nuarray = numpy.asarray(list_type),可以将list数组转为numpy.array

      为了将数据按整数写入文件,需要对数据转为float类型,如果系统是64位的,则在写入文件时会保存为float64。这样从文件中载入array后解析时就无法解析出ascii码。

  所以要作以下astype('float')处理:

  arraydat.astype('float').tofile(savefile)

3.使用numpy.fromfile(savefile),可以从文件中载入通过numpy.tofile(sf)保存的二进制数组

4.使用list(numpyarray),可以轻松将numpy.array转为list数组。

5.使用异或运算(^)只能对整数与整数操作。所以对字符使用异或加密时,要将字符转为ascii码才行。


欢迎转载:
转载请注明出处: http://fengmm521.blog.163.com/blog/static/25091358201623021347813/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值