密码学基础
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
一.密码学发展阶段
1.古典密码学( 1949年之前)主要特点:数据的安全基于算法的保密
2.近代密码学(1949~1975年)主要特点:数据的安全基于密钥而不是算法的保密,密码学从此开始成为一门科学
3.现代密码学(1976年以后)密码学新方向一公钥密码学,主要特点:解决了密钥分发和管理的问题,密码学真正广泛在商业中应用
二.暴力破解密码难度
破解密码分为两种
1.拿字母数字标点去试,暴力破解,把常用的密码收集起来,保存到文档里就是密码字典,用户名字典
2.根据加密的规律尝试反推出原文,技术要求特别高
三.摩斯密码
四.密码本
A—>9 B---->5 C---->1
依靠密码对照表
不同的中文编码,字节长度是不一样的,UTF-8的编码中文占3个字节,GBK编码中文占2个字节
UTF-8对照表https://blog.csdn.net/u012153439/article/details/51896846
# UTF-8/BGK转码
s = '你'
print(len(s.encode('UTF-8')))
print(len(s.encode('GBK')))
s1 = '一'
print(s1.encode('UTF-8'))
print(s1.encode('GBK'))
# 把ascii字符转成十进制
s = 'a'
print(ord(s))
# 把十进制转二进制
print(bin(ord(s)))
# 把十进制转成ASCII表字符
num = 120
print(chr(num))
binary = 0b1010 # 二进制
octal = 0o123 # 八进制
decimal = 123 # 十进制
hexadecimal = 0x2f # 十六进制
五.凯撒密码
凯撒大帝发明,核心思想:让原文通过轮盘位移多少次,到密文
称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
# 使用一个字符进行可行性研究
s = 'C'
num = ord(s)
num += 9
des = chr(num)
print(des)
# 利用循环结合上面的思路,对字符串进行凯撒加密
def encrypt_str(source, count):
destination = ''
for s in source:
num = ord(s)
num += count
des = chr(num)
destination += des
return destination
if __name__ == '__main__':
print(encrypt_str('helloworld', 6))
# 解密略
六.栅栏密码
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。
明文:THE LONGEST DAY MUST HAVE AN END
加密 TELNETDYMS AEA N # 13579
过程 H OGS A UTHV NED # 246810
密文: TELNETDYMS AEA NH OGS A UTHV NED
# 栅栏密码
# 加密过程
def encrypt_str1(source):
s1 = ''
s2 = ''
for i in range(0, len(source)):
if i % 2 == 0:
s1 += source[i]
else:
s2 += source[i]
return s1 + s2
if __name__ == '__main__':
# print(encrypt_str('helloworld', 6))
print(encrypt_str1('THE LONGEST DAY MUST HAVE AN END'))
解密略
明文:THE LONGEST DAY MUST HAVE AN END
加密 THE LONGEST DAY # 前半部分
过程 MUST HAVE AN END # 后半部分
密文:TMHUES TL OHNAGVEES TA ND AE YN D # 上一个下一个
THE LONGEST DAY MUST HAVE AN END! # 17 16
THE LONGEST DAY M
UST HAVE AN END!
TUHSET LHOANVGEE SATN DEANYD !M
def decrypt_str2(source):
s = ''
if len(source) % 2 == 0:
s1 = source[:len(source) // 2]
s2 = source[len(source) // 2:]
for i in range(len(s1)):
s = s + (s1[i] + s2[i])
else:
s1 = source[:len(source) // 2 + 1]
s2 = source[len(source) // 2 + 1:]
for i in range(len(s2)):
s = s + (s1[i] + s2[i])
s += s1[-1]
return s
if __name__ == '__main__':
# print(encrypt_str('helloworld', 6))
# print(encrypt_str1('THE LONGEST DAY MUST HAVE AN END'))
print(decrypt_str2(source='THE LONGEST DAY MUST HAVE AN END!'))
七.维吉尼亚密码
引入了密钥的概念,利用原文+密钥进行加密
加密
解密
其他古典密码学参考:https://blog.csdn.net/weixin_54977781/article/details/130530410