实例五:简单密码加密
源代码:
def passwd_pre(pwd): vret=[]for char in pwd:if char in 'abc': char='!'elif char in 'def': char ='@'elif char in 'ghi': char='#'elif char in 'jkl': char='%'elif char in 'mno': char='^'elif char in 'pqr': char='&'elif char in 'stu': char='*'elif char in 'vwx': char='>'elif char in 'yz': char='?'elif char.isupper(): char=chr(ord(char.lower())+1) vret.append(char)#这里缩进应该和for对齐return ''.join(vret)#这里变成了字符串,列表转字符串
def change_txt(pwd,str1,str2): vret=''pwd=pwd.lower()for char in pwd:#这里不理解,str1应该是字符串,但是这个j说是索引值,不是列表才有索引值j=str1.find(char)if j==-1: vret=vret+charelse: vret=vret+str2[j]#注意到这次的return与上面的缩进不一样return vret
def change_password(pwd):if pwd==None:return '-1'vret=''vpre=passwd_pre(pwd) vlen=len(pwd) vstr = change_txt(pwd, "1234567890abcdefghijklmnopqrstuvwxyz","abcdefghijklmnopqrstuvwxyz1234567890")if vlen<=4: vret=vpre+vstr[0:vlen]else: vret=vpre+vstr[0:4] vstr = change_txt(pwd, "1234567890abcdefghijklmnopqrstuvwxyz","qwertyuiopasdfghjklmnbvcxz0987654321")if vlen<=4: vret=vret + vstr[0:vlen]else: vret=vret + vstr[0:4] vstr = change_txt(pwd, "1234567890abcdefghijklmnopqrstuvwxyz","1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p")if vlen <= 4: vret = vret + vstr[0:vlen]else: vret = vret + vstr[0:4]# 调用函数对密码进行一次转换vstr = change_txt(pwd, "1234567890abcdefghijklmnopqrstuvwxyz","pl0okm9ijn8uhb7ygv6tfc5rdx4esz3wa2q1")if vlen <= 4: vret = vret + vstr[0:vlen]else: vret = vret + vstr[0:4]return vretif __name__ == '__main__':while True: pwd=input('Enter your password: ')if pwd=='q': print('Thank you!') breakelse: pwdnew=change_password(pwd)print('Your password is: ',pwd,'修改后密码为:',pwdnew)
感悟:
常见的密码加密方式有三种:MD5、Base64、SHA1加密。这三种加密方式加密后的密码是无法反推得到原始密码的,较为安全,而本文所写代码不属于上述任何一种属于是通过字符的多次转换实现的加密,一般也是无法破解的。
下面开始讲代码:
if __name__ == '__main__':while True: pwd=input('Enter your password: ')if pwd=='q': print('Thank you!') breakelse: pwdnew=change_password(pwd) print('Your password is: ',pwd,'修改后密码为:',pwdnew)
1.
if __name__ == '__main__':
程序开始的标志
2.
while True: pwd=input('Enter your password: ')if pwd=='q':print('Thank you!')break常规做法,输入密码,输入q则代表退出程序,直接终止全部循环。
3. pwdnew=change_password(pwd)
这句代码的信息量很大,也是本案例的本质,涉及到了函数的嵌套,我们一步步来看,
调用函数change_password(pwd),引入变量pwd,也就是上面要输入的pwd,
vret=''
初始化字符串vret,为一个空的字符串变量
vpre=passwd_pre(pwd)
用passwd_pre函数取得密码的前缀,这个函数首先将vret定义成为了一个空的列表,这里实际不用vret这个变量也是可以的
vret.append(char)return ''.join(vret)
这两行代码涉及到了在列表vret中添加元素,然后再次将vret转化变回了字符串,现在的vret是一个有内容的变量字符串,取得了密码的前缀
vstr = change_txt(pwd, "1234567890abcdefghijklmnopqrstuvwxyz","abcdefghijklmnopqrstuvwxyz1234567890")
这里开始调用change_txt函数得到密码的后半段命名为vstr,在这个函数中再次将vret命名为了空的字符串,我其实感觉这个很奇怪,就不能重新弄个变量吗,这样读起来其实不是很好理解,不过不影响代码想说的东西,后续就是遍历字符进行替换,这里用到一个代码:
j=str1.find(char)
取得字符串的索引,这里需要补充一点知识:
字符串(str)和列表(list)一样,都是“序列类型”,都支持索引访问。
区别在于:
s = "abcde"
s[0] # 'a'
s[3] # 'd'
lst = ['a', 'b', 'c', 'd', 'e']
lst[3] # 'd'
区别:
字符串不可以进行赋值的操作
s[0] = 'x' # ❌
但是列表可以
后续的代码实际上就是不断的进行多次的替换来实现多重加密的效果,最后返回vretreturn vret
这里就不进行讲解了,只说明一下简单的逻辑可以读懂这个代码在干什么,毕竟现在很多代码都是ai写的,我们能够读懂它在干什么,提出自己的修改意见就可以了。