密码是经过加密过后的口令,是指用特定的变换对数据信息进行加密保护或者安全身份认证的物质和技术,密码学是对安全通信技术的研究,要能够有效的防范潜在攻击,也就是对信息加密解密的过程。
古典密码到近代密码再到我们现在现在使用的公钥密码,密码学经历了四个阶段,每个阶段都以新技术的出现做为分界点。
加密:由明文转换为密文的过程。
解密:由密文恢复出明文的过程。
这里以古典密码为例:受算法保密性限制,如著名的凯撒密码就是古典密码一种,通过密码的位移进行加密,但是一旦公开算法,这种密码很容易被人破解。
凯撒密码:加密admin
from random import randintimport string
#凯撒加密
#加密
def kaisa(s, k): # 定义函数 接受一个字符串s 和 一个偏移量klower = string.ascii_lowercase # 小写字母upper = string.ascii_uppercase # 大写字母before = string.ascii_letters # 无偏移的字母顺序 小写+大写after = lower[k:] + lower[:k] + upper[k:] + upper[:k] # 偏移后的字母顺序 还是小写+大写# 分别把小写字母和大写字母偏移后再加到一起table = ''.maketrans(before, after) # 创建映射表return s.translate(table) # 对s进行偏移 即加密s = input('请输入一个字符串:')k = randint(0,26) #从0-25中挑选随机一个数字当做偏移量
print(kaisa(s, k))
解密脚本
LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
LETTERS1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LETTERS2="abcdefghijklmnopqrstuvwxyz"text=input("请输入密文:")
for key in range(len(LETTERS)):str=""for i in text:if i in LETTERS:if i.isupper(): #密文字母为大写num = LETTERS1.find(i) #在字母里搜索到密文字符的位置num = num - keyif num<0:num = num + len(LETTERS1)str = str + LETTERS1[num] #将解密后字符追加到字符串末尾elif i.islower(): #密文字母为小写num = LETTERS2.find(i) #在字母里搜索到密文字符的位置num = num - keyif num<0:num = num + len(LETTERS2)str = str + LETTERS2[num] #将解密后字符追加到字符串末尾else:str = str + i #如果密文中内容不在字母里则不解密,直接追加print('第%d把钥匙的结果是%s' %(key, str)) #显示每一个可能的值
这里通过穷举的方式得到明文admin
对称密码算法(也称单钥或私钥密码算法):加密密钥和解密密钥相或实质上等同,即从一个易于推出另一个。
特点:
非对称密码算法:加密密钥和解密密钥不同,从一个很难推出另一个。其中,对外公开的密钥,称为公开密钥(public key),简称公钥;必须保密的密钥,称为私有密钥( private key) ,简称私钥。又叫公钥密码算法( Public-keycipher)。
特点
优点:
混合加密结合对称和非对称算法的特点进行组合而成,先是接收方将生成的公钥共享给发送方一份,发送方使用此公钥将生成的会话秘钥进行加密,同时发送方使用会话秘钥对明文内容进行加密,完成加密后,将两份加密过的内容一起发送给接收方,接收方接收到消息,先通过配对的私钥解密出会话秘钥,然后使用会话秘钥对密文进行解密,得到明文内容。
哈希函数比较常用与下载的文件校验,通过文件算出哈希值进行比对文件是否被篡改。
创建一个index.html文件计算哈希值,对比修改后的哈希值,是否有变化。
修改前
修改后发现有明显改变
MD: Message Digest
消息摘要
SHA ( Secure Hash Algorithm ,安全哈希算法)由美国国家标准技术研究所开发,1993年作为联邦信息处理标准发布,2008 年又有更新。
除了保护信息的机密性和完整性,密码学技术也可以解决信息的可鉴别性(真实性或认证性)和不可否认性。
注意:数字签名是对文件的哈希值进行签名而不是对文件本身。
传统签名的基本特点: