本次所涉及到的知识有:itertools模块、cycle函数、chr函数、ord函数、next函数、python定义函数、string模块、isinstance函数、dictionary、get()方法。
注意:此文章仅供参考和学习,并不能完全说明作者的解析是正确的,觉得有错误的欢迎在评论区里指出。
题目
题目一:python利用异或算法实现字符串加密解密
题目二:python利用string模块判断密码强度
题目一
构建异或算法实现加密和解密
创建一个名为crypt函数,并传入两个参数:source和key。
source是要加密或解密的字符串,key是密钥字符串。
1 | def crypt(source,key): |
注意:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
为了达到每一个字符都能加密的效果,需要使用到迭代选择器;也就是使用itertools(循环器)中的cycle函数。
1 | from itertools import cycle |
需要一个变量来存放最终的结果。
1 | result = '' |
对密钥进行选择迭代。
1 | temp = cycle(key) |
通过for循环对source中的字符进行遍历。
1 | for ch in source: |
这时就需要使用到这道题就重要的地方“异或运算”。
首先通过next(temp)对字符进行迭代,然后获取字符串中每一个字符;之后通过ord()获取对应字符的ASCII编码;通过异或运算符的形式对两个ASCII编码进行处理(异或运算符(^):表示对于操作符两侧数字的二进制数进行异或操作。异或操作的含义为:同一位置上的数字相等则得0,同一位置上的数字相异则得1。(二进制表达中只有0,1两个数字))。
最后通过chr函数对异或处理完的编码进行对应unicode字符的处理并赋值到变量result上。
1 | result = result + chr(ord(ch) ^ ord(next(temp))) |
返回该变量结束crypt函数。
1 | return result |
输入字符串并对其加密和解密
需要加密的字符串。
1 | source = 'Shandong Institute of Business and Technology' |
创建密钥字符串。
1 | key = 'Dong Fuguo' |
打印没有加密的字符串。
1 | print('Before Encrypted:' + source) |
对字符串进行加密。
1 | encrypted = crypt(source,key) |
打印加密完成的字符串。
1 | print('After Encrypted:' + encrypted) |
对加密的字符串进行解密。
1 | decrypted = crypt(encrypted,key) |
打印解密完成的字符串。
1 | print('After Decrypted:' + decrypted) |
完整代码加注释解析
1 | #python利用异或算法实现字符串加密解密 |
题目二
判断字符条件
首先需要使用string模块,所以导入string模块。
1 | import string |
创建check函数并传入pwd参数。
1 | def check(pwd): |
使用isinstance函数和len()方法来判断其是否是字符和所需字符的长度。注意:这道题使用的是not运算符,其判断结果和判断的相反;也就是如果某一条件下判断为false时其结果为true。
1 | if not isinstance(pwd,str) or len(pwd)<6: |
判断如果没有符合上面所判断的条件时,就返回“没有合适的密码”。
1 | return 'not suitable for password' |
创建强弱密码对应关系
创建密码强度等级与包含字符种类的对应关系。(weak:弱、below middle:中间以下、above middle:中间以上、strong:强)
1 | d = {1:'week',2:'below middle',3:'above middle',4:'strong'} |
用变量r创建一个有4个False的列表。
1 | r = [False] * 4 |
分别用来标记pwd是否含有数字、小写字母、大写字母和指定的标点符。
1 | for ch in pwd: |
返回密码强度
通过Dictionary中get()方法获取所对应键的值,如果对应键没有值时就输出’error‘(错误)。
统计包含的字符种类,返回密码强度,如果统计到的字符种类越多则返回的密码强度越强。
1 | return d.get(r.count(True),'error') |
给check()函数传值并打印。
1 | print(check('a2Cd,11')) |
完整代码加注释解析
1 | #python利用string模块判断密码强度 |