Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧。

一、加密原理

记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这次既然学习了Python这个小练习当然不能放过(其实这个加密程序我用c++,java都写过可以说也算比较熟了)。加密原理就是循环读取文件每个字节,然后进行相应的加密运算后就是加密操作了,解密时候进行逆运算就是解密操作了。

比如我们读取文件的第一个字节数据是20(读取出来的每位数据为0~255,因为8位是1字节,所以二进制的00000000~11111111表示的无符号数字范围就是0~255了),加密我们可以选择在这个基础上加1,那么加密后的第1个字节就是21了,如果我们将所有字节加1,那么相当于文件进行了加密(需要注意的是如果是255的话加1会越界,所以边界值需要特殊处理,如256的话我们则直接写入0)。解密时候我们每个字节都减1即可(当然边界值需要自己处理,比如之前加密后的0,我们直接写入255)。当然这样解密是不是很容易就会破解那,所以我们可以定义一个字符串来进行加密,比如“123456”,我们第1个字节与1进行加密,第2个字节与2进行加密,到了第7个我们再与1加密进行,直到所有字节都循环与这个字符串加密完,这样是不是加大了破解的难度那?

当然我用的是异或加密算法,异或一个最神奇的地方莫过于不借助任何变量将2个变量的值交换了。比如 

a=10
b=20

a^=b
b^=a
a^=b

print(a)
print(b)

#输出
#20
#10

是不是很神奇呢,所以加密使用异或也可以很方便的进行加密和还原

二、程序效果演示

1.创建一个txt文件(当然图片,声音,所有格式文件都可以),这里方便演示我选择一个txt文件

2.运行写好的python脚本

加密后的文件是不是什么都看不出来了

3.进行解密(我们输入一次错误的密码,当然密码近似度越高,还原的内容就会越多,当然如果是图片或者声音那么你错一个都是无法播放的)

三、本汪写的加密源码(如有不足请指正)

  1 #作者:smallfoxdog 小狐狸狗狗
  2 #时间:2018年3月20日13:57:04
  3 #功能:文件的加密和解密
  4
  5 import os
  6
  7 #主函数
  8 def main():
  9     getInput()
 10
 11 #输入参数
 12 def getInput():
 13
 14     #获取操作的参数
 15     while(True):
 16
 17         oper = input("请输入操作(e:加密 d:解密):")
 18
 19         if(oper=="e" or oper=="d"):
 20             break
 21         else:
 22             print("输入有误,请重新输入!")
 23
 24     #获取文件密码
 25     while(True):
 26
 27        password= input("请输入密码:")
 28
 29        if(len(password)==0):
 30             print("密码不能为空!")
 31        else:
 32            break
 33
 34     #获取操作的文件路径
 35     while(True):
 36
 37         path=input("请输入文件路径:")
 38
 39         try:
 40             f_read  = open(path,"rb")
 41         except:
 42             print("文件没有找到,请检查路径是否存在!")
 43         else:
 44             break
 45
 46     #进行加密或解密操作
 47     if(oper=="e"):
 48         encrypt(path,password)
 49     elif(oper=="d"):
 50         decrypt(path, password)
 51
 52 #加密
 53 def encrypt(path,password):
 54
 55     #因为刚学可能有库可以直接获取这些信息吧,不过自己写个算法获取这些信息也没什么难度
 56     fileFullName = path.split(os.path.sep)#os.path.sep为操作系统的文件分隔符
 57     fileName = fileFullName[len(fileFullName)-1].split(".")[0]
 58     fileSuffix = fileFullName[len(fileFullName)-1].split(".")[1]
 59
 60     # print("文件全名称:",fileFullName[len(fileFullName)-1])
 61     # print("文件名称:",fileName)
 62     # print("文件后缀:",fileSuffix)
 63
 64     fileParent = path[0:len(path)-len(fileFullName[len(fileFullName)-1])]
 65     newFileName="加密_"+fileFullName[len(fileFullName)-1]
 66     newFilePath=fileParent+newFileName
 67
 68     # print("文件父路径:",fileParent)
 69     # print("新的文件名称:",newFileName)
 70     # print("新的文件全路径:", newFilePath)
 71
 72     f_read  = open(path,"rb")
 73     f_write = open(newFilePath,"wb")
 74
 75     count=0 #当前密码加密索引
 76
 77     #我们采用异或循环加密
 78     for now in f_read:
 79         for nowByte in now:
 80             newByte=nowByte^ord(password[count%len(password)])
 81             count+=1
 82             f_write.write(bytes([newByte]))
 83
 84     f_read.close()
 85     f_write.close()
 86
 87     print("汪~文件加密完毕^_^")
 88
 89 #解密(因为我们采取的异或解密,所以其实和加密算法一样)
 90 def decrypt(path, password):
 91     # 因为刚学可能有库可以直接获取这些信息吧,不过自己写个算法获取这些信息也没什么难度
 92     fileFullName = path.split(os.path.sep)  # os.path.sep为操作系统的文件分隔符
 93     fileName = fileFullName[len(fileFullName) - 1].split(".")[0]
 94     fileSuffix = fileFullName[len(fileFullName) - 1].split(".")[1]
 95
 96     # print("文件全名称:", fileFullName[len(fileFullName)-1])
 97     # print("文件名称:", fileName)
 98     # print("文件后缀:", fileSuffix)
 99
100     fileParent = path[0:len(path) - len(fileFullName[len(fileFullName)-1])]
101     newFileName = "解密_" + fileFullName[len(fileFullName) - 1]
102     newFilePath = fileParent + newFileName
103
104     # print("文件父路径:", fileParent)
105     # print("新的文件名称:", newFileName)
106     # print("新的文件全路径:", newFilePath)
107
108     f_read = open(path, "rb")
109     f_write = open(newFilePath, "wb")
110
111     count = 0  # 当前密码加密索引
112
113     # 我们采用异或循环加密
114     for now in f_read:
115         for nowByte in now:
116             newByte = nowByte ^ ord(password[count % len(password)])
117             count += 1
118             f_write.write(bytes([newByte]))
119
120     f_read.close()
121     f_write.close()
122
123     print("汪~文件解密完毕^_^")
124
125 main()

大家也来写一个属于自己的加密小程序吧^_^。加密和解密可以优化在一个方法里面,之前一开始想的采用一开始的加法进行加密,减法进行解密,最后还是采用了异或加密所以加密和解密就一样了,大家可以优化一下代码哦。也可以使用其他方式试试哦,欢迎一起交流^_^

原文地址:https://www.cnblogs.com/smallfoxdog/p/8609614.html

时间: 2024-10-07 01:43:47

Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)的相关文章

【python】10分钟教你用python如何正确把妹

前言 今天没妹子约,刚好朋友研究一下python.让他教大家如何用神奇的python打造一个把妹神器吧.看完这个,你们就能走向人生巅峰,迎娶白富美啦. 我知道你们想看看效果 当然啦,这只是测试版的效果,真正的版本可比这个厉害多啦.不过作为一个直男,另一个男的给小编发这个测试感觉还是有点怪怪的哈. 文:吉柏言 暑假来了,各位又不得不和男女朋友暂时分开2个月了!!长达两个月的时间里不能相见,你可知我多想你啊,想知道你的城市下雨了吗,想知道你带伞了吗,想知道你长什么样,想知道你叫啥,咳咳,单身汪小编表

【python】10分钟教你用python一行代码搞点大新闻

准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python.像下面一样. 1> python2Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win323Type "help", "copyright&q

2018-06-20 中文代码示例视频演示Python入门教程第三章 简介Python

知乎原链 Python 3.6.5官方入门教程中示例代码汉化后演示 对应在线文档: 3. An Informal Introduction to Python 不知如何合集, 请指教. 中文代码示例Python入门教程 3.1.1_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 中文代码示例Python入门教程 3.1.2 第一部分_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 中文代码示例Python入门教程 3.1.2 第二部分_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

2019刘老师教你用springboot2.x开发整合微信支付的线上教育平台带源码送springboot2.x零基础入门到高级实战教程

第一部分:springboot2.x零基础入门到高级实战教程一.零基础快速入门SpringBoot2.0 1.SpringBoot2.x课程全套介绍和高手系列知识点 简介:介绍SpringBoot2.x课程大纲章节 java基础,jdk环境,maven基础 2.SpringBoot2.x依赖环境和版本新特性说明 简介:讲解新版本依赖环境和springboot2新特性概述 3.快速创建SpringBoot2.x应用之手工创建web应用 简介:使用Maven手工创建SpringBoot2.x应用 4

Python学习教程:用Cython加速Python代码,快到你想不到

如果你曾经用Python编写过代码,那么等待某些代码块执行的时间可能比您希望的要长.虽然有一些方法可以提高代码的效率,但它很可能仍然比C代码慢.这主要归结为一个事实:Python是一种动态编程语言,它将许多东西移动到C在编译期间负责的运行时. 不过,如果您像我一样喜欢用Python编写代码,并且仍然希望加快代码的速度,那么您可以考虑使用Cython.虽然Cython本身是一种独立的编程语言,但是很容易将其融入到您的工作流程中,例如Jupyter Notebook.在执行时,Cython将您的Py

[Python]基础教程(3)、Python基础语法

Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小写的. 以下划线开头的标识符是有特殊意义的.以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入: 以双下划线开头的 __foo 代表类的私有成员:以双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专

Python基础教程(019)--执行Python的方式,IPython

前言 了解IPython 内容 IPython 是一个Python的交互式shell,比默认的Python shell 好用的多 查看图片 在提示符下执行 目的 了解进入IPython 退出IPython 原文地址:https://www.cnblogs.com/tiechui2015/p/11054931.html

【python开发教程】如何快速入门python开发?

想要学习python这门语言,却始终找不到一个全面的Python开发实战教程,倘若你是真心想学好一门语言,小编建议你亲自动手实践的.下面来看看入门python的学习教程. Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的).动态性.隐式类型(不需要做变量声明).大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言. 获取帮助 你可以很容易的通过Python解释器获取帮助.如果你想知道一个对象(object)是如何工作的,那么你所需要

python的文字和unicode/ascll 相互转换函数,和简单的加密解密。。。

1 import re 2 import random 3 4 5 # ord() 它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值 6 # chr() 是见数字变成汉字 7 8 9 #函数功能:将输入的字符串加密 10 #加密方式,将字变成Unicode 数值,然后加上一个随机数,然后再变成汉字,再在汉字后面加上这个数字,组成加密后的密文 11 #返回值:加密后的密文 12 # 13 def enc(s): 14 ret = '' 15 for