python实例5 简单的密码加密

实例5 简单的密码加密

1. 编程背景

明文密码存在信息安全的隐患,特别是对于信息量较大的信息系统而言,故对密码加密很有必要。
常见的加密方式有:
MD5加密、Base64加密、SHA1加密
这些加密算法使用后,他人基本上无法通过计算还原出原始密码。

2. 实现编程

使用最简单、最直接的方式,对密码进行加密,目的是提供一种小技巧,实现可通过阅读其他相关代码扩展思路,达到举一反三的效果。

# -*- coding:utf-8 -*-
# author:wanglisha
"""实例5 简单的密码加密
"""
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 'jkn':
            char = '$'
        elif char in 'opq':
            char = '%'
        elif char in 'rst':
            char  = '^'
        elif char in 'uvw':
            char = '&'
        elif char in 'xyz':
            char = '*'
        elif char.isupper():
            # 对于大写字母,先通过char.lower()将其转换成小写字母,然后转成16位数值并加1
            # 也就是将大写字母转换成后一位的小写字母
            char = chr(ord(char.lower()) + 1)
        # 把转换后的字符加入到vret列表变量中
        vret.append(char)
        # 把列表中各项连接成字符串并返回
        return ''.join(vret)

# 该函数根据传入的密码和两个字符串,对密码中字符进行转换
# 主要功能是根据密码pwd中的每个字符,在字符串str1中找到对应的位置索引
# 通过这个索引值在字符串str2中找到一个字符替换密码中的字符
def change_txt(pwd, str1, str2):
    # 初始化返回值
    vret = ''
    # 将字符串小写
    pwd = pwd.lower()
    for char in pwd:
        # 取得在str1中的索引值
        j = str1.find(char)
        # 在str1中没有这个字符,然后就返回-1
        if j == -1:
            # 没有找到这个索引值,就保留字符原值
            vret = vret + char
        else:
            # 找到索引值,根据这个索引值在str2中取得一个字符替换原字符
            vret = vret + str2[j]
    return vret

def change_password(pwd):
    """加密程序

    """
    # 判空
    if pwd == None:
        return '-1'

    vret = ''

    # 取得一个字符串,作为转换后密码的前缀
    vpre = passwd_pre(pwd)
    vlen = len(pwd)

    # 调用函数对密码进行一次转换,函数后两个参数决定返回值的内容
    vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
                                "abcdefghijklmipopqrstuvwxyz1234567890")
    if vlen < 4:
        vret = vpre + vstr[0:vlen]
    else:
        vret = vpre + vstr[0:4]

    # 调用函数对密码进行一次转换
    vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
                           "qrstuvwxyzabcdefghijklmipop1234567890")
    if vlen < 4:
        vret = vret + vstr[0:vlen]
    else:
        vret = vret + vstr[0:4]

    # 调用函数对密码进行一次转换
    vstr = change_txt(pwd, "1234567890abcdefghijklmipopqrstuvwxyz",
                           "1qabcd2e3f4gh5i6j7k8l9m0ipopqrstuvwxyz")

    return vret

if __name__ == '__main__':
    while True:
        pwd = input('请输入密码:')
        if pwd == 'q':
            print('退出程序...')
        else:
            pwdnew = change_password(pwd)
            print('您录入的密码是:',pwd,'该密码加密后为:',pwdnew)

在这里插入图片描述

3. 知识拓展

3.1 使用md5实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha

import hashlib

def after_md5(pwd):
    """实现md5加密"""
    # 实例化md5
    vmd5 = hashlib.md5()
    # 对原文进行md5加密运算
    vmd5.update(pwd.encode('utf-8'))
    # 输出密文
    return vmd5.hexdigest()

if __name__ == '__main__':
    pwd = '123456'
    print('明文:%s, 密文:%s' % (pwd, after_md5(pwd)))

"""打印输出:
明文: 123456, 密文: e10adc3949ba59abbe56e057f20f883e
"""
3.2 使用Base64实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha
import base64

def encode_base64(pwd):
    """实现base64加密"""
    vret = base64.b64encode(pwd.encode('utf-8')).decode('utf-8')
    return vret

if __name__ == '__main__':
    # 明文
    pwd = '123456'
    # 使用base64加密
    vencode = encode_base64(pwd)

    # 打印明文和密文
    print("明文: %s, 密文: %s" % (pwd, vencode))

"""打印输出:
明文: 123456, 密文: MTIzNDU2
"""
3.3 使用sha1实现明文加密
# -*- coding:utf-8 -*-
# author:wanglisha
import hashlib

def encode_sha1(pwd):
    """实现sha1加密"""
    vret = hashlib.sha1(pwd.encode('utf-8')).hexdigest()
    return vret

if __name__ == '__main__':
    pwd = '123456'
    print('明文:{0}, 密文:{1}'.format(pwd, encode_sha1(pwd)))
"""打印输出:
明文:123456, 密文:7c4a8d09ca3762af61e59520943dc26494f8941b
"""
3.4 三者对比

在这里插入图片描述

4.文档参考

https://blog.csdn.net/u013541325/article/details/112973119?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166619723316800180647983%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166619723316800180647983&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-112973119-null-null.142^v59^control,201^v3^control&utm_term=python%20sha1%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187
https://blog.csdn.net/weixin_42162451/article/details/116336344?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166619658316782428622896%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166619658316782428622896&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-116336344-null-null.142^v59^control,201^v3^control&utm_term=python%20base64%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187
https://blog.csdn.net/Ghjkku/article/details/124825904?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166619571316800184161503%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166619571316800184161503&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-124825904-null-null.142^v59^control,201^v3^control&utm_term=python%20MD5%E5%8A%A0%E5%AF%86&spm=1018.2226.3001.4187
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值