密码学是研究如何隐密地传递信息的学科。
一、几个基本概念: 原文、密文、加密、解密、算法、密钥
举一个简单的例子,比如:
我们要传递一串信息 “i love you", 为了不让别人偷听,可以把这串信息加密为 " j mpwf zpv".
则: “i love you"称为原文, " j mpwf zpv"称为密文。
加密的方法是: 字符只能是小写英文字母,每个字符值加1 (就是变为下一个字符),空格符不变,即:i + 1 = j , v + 1 = w ...
这个加密方法用数学表达为一个函数: f(x) = x + k ( x是原文字符,当前的 k = 1 )
加密函数称为加密算法。
k值称为密钥(key)。 当前k值为1。为了适应于不同场合,k值可变,可以是任何数字。
接收到信息的人,如果知道加密算法,且知道密钥。则可以解密这一串字符。
解密函数是加密函数的反函数: f2(y) = y - k (y是密文字符,当前的 k = 1 )
则: j - 1 = i, w - 1 = v, 则密文 " j mpwf zpv" 将翻译为 “i love you"
如果把这串信息 “i love you"传递给第二个人,加密算法不变,密钥变更为2, 则密文变为 "k nqxg aqw".
通常情况下,加解密算法不变,密钥经常变。
上述例子中,加密过程用的密钥 key值,与解密的密钥 key值是相等的。这种加密算法,称为对称算法。 当然,也有 加密密钥 与 解密密钥不同的算法(称为,不对称算法)。
如果一个加密算法,没有相应的解密算法,则这种算法是不可逆加密算法,称为单向加密,即只能把原文变成密文,但密文无法变成原文。 最常用的不可逆加密算法是MD5.
单向加密算法主要用于验证和签名。比如说:linux系统中的登录密码就采用单向加密保存, 如果用户输入的登录密码正确,则加密后将与存储中的密文相同,用户验证成功、登录成功。即使偷听人把系统中的登录密码密文偷去,也无法得到密码原文。如果有人把密文改变,由于验证不通过则可以知道密文被人修改了。
在信息系统设计中,密码必须采用单向加密保存入数据库,否则非常容易泄密。但是,可悲的是,市场上有大量的系统把密码原文写入数据库,如果系统管理员打开数据库,就可以看到所有人的密码。由于很多人经常用相同的密码登录不同的系统。知道他人的常用密码,往往就知道他人其它系统的密码。所以说,在互联网上,注册一个系统,千万不能用自己常用的密码。
二、破解密文、安全算法、安全的概念
看这个公式: secret = f ( raw, key)
secret是密文, f 是加密函数, raw 是原文, key 是密钥。
偷听人,往往可以听到密文。
如果偷听人不知道加密算法、而且不知道密钥,往往难以解密得到原文。
如果偷听人知道加密算法, 但不知道密钥,能不能获取原文呢(破解)?
这个取决于加密算法的安全性 和 密钥的长度。
上面的简单加密算法 f(x) = x + k,破解方法也简单。
因为我们知道加密算法,我们可以假设 k 值为 0, 1, 2, 3, .... ,把各种可能的密钥值都计算一遍,看输出的结果是否是有意义的单词,如果是,则我们将得到 k 值(上例为1),则密文被破解。
逐个尝试密码的破解方法,叫暴力破解法。
如果一个算法有缺陷,则往往可以有策略地尝试少量的密码,即可破解。
上面的简单加密算法 f(x) = x + k,采用暴力破解法,尝试几十个密码,就破解了。破解时间不到1毫秒,计算成本基本为零。这个加密算法不安全。
什么是安全算法呢? 安全算法的衡量标准是,把加解密算法都公开,在偷听人不知道密钥的情况下,偷听人花巨大的计算资源也无法破解的算法。
什么是安全的呢?安全是相对的。
从经济角度上讲,破解所支出的成本 大于 破解所获得的收益,就是安全的。
从数学上讲,几乎所有的数学函数构造的算法都是可以破解的,只不过是有的数学函数破解计算量太大,以当前的算力可能要花1亿年,时间上不可行,则算法就安全了。但是,如果计算机算力提升100亿倍 ,则破解只要3天,则这个算法又不安全了。
安全算法往往是高水平的数字家提出,通过国家级多年认证后,向全社会公开的算法。
1977年美国国家标准局公布 DES 安全算法。这是一种对称算法,当时是安全算法。随着算力进步,目前早就不是安全算法了。2001年美国公布AES安全算法, 取代DES。目前仍是最流行的对称算法之一。
1983年,麻省理工学院三位教授发明的RSA算法申请在美国了专利。 此后,RSA成为了互联网上使用最广泛、最出名的不对称算法。RSA算法被各大网站、浏览器使用。今天我们访问大量网站采用的 https 协议,大量采用的是RSA算法。
RSA512位的密钥被视为不安全的;768位密钥声称不用担心受到除了美国国家安全局(NSA)外的其他事物的危害;但是,即使RSA1024位密钥也不一定安全。RSA1024位已被我国安全密码部门弃用。
目前流行的加密算法大多是美国提出来的。
但是,加密算法关系到国家安全。
中国国家密码局近年来认定了一系列国产密码算法,公开的算法有SM2,SM3,SM4, SM9.
SM2是不对称算法,可取代RSA.
SM3是不可逆算法,可取代MD5.
SM4是对称算法,可取代AES.
SM9是2016年公布的不对称算法,可取代RSA.
既然数学方式的加密算法都是可逆的,其安全性取决于算力。在超级计算机、量子计算机面前,在算力提高几百亿倍时,就没有算法是安全的了。有没有不是数学方式的更高级的算法呢,目前探索中的方向之一是量子安全(不基于数学的算法,这个以后再介绍)。
三、用python编程演示最简单的加解密算法和破解过程
用python把上例中的简单加解密实现一下,玩一玩。
# 加解密原理: 简单的对称加密演示
def validate(n):
# 当n值超出字符'a'到'z'的范围,则修正它
while n < ord('a'):
n = n + 26
while n > ord('z'):
n = n - 26
return n
# 加密函数
def encrypt(raw, key):
""" 加密 """
secret = ''
for c in raw:
# 跳过空格
if c == ' ':
secret += c
continue
# 加密算法: 字符值 + key
n = ord(c) + key
n = validate(n) # 修正超出范围的字符
secret += chr(n)
return secret
# 解密函数
def decrypt(secret, key):
""" 解密 """
raw = ''
for c in secret:
# 跳过空格
if c == ' ':
raw += c
continue
# 解密算法: 字符值 - key
n = ord(c) - key
n = validate(n) # 修正超出范围的字符
raw += chr(n)
return raw
# 破解函数,在已知原文及对应密文的情况下,计算密钥
def crack(raw, secret):
""" 破解 """
r1 = raw[0] # 取原文第一个字符
s1 = secret[0] # 取密文的第一个字符
key = 0
while 0 <= key < 10000: # 逐个尝试密码:0到10000
n = ord(r1) + key # 加密字符 r1
n = validate(n) # 修正超出范围的字符
if chr(n) == s1: # 如果与密文相同
return key
key = key + 1
# 主程序如下:
key = 1 # 密钥
raw = 'i love you' # 原文
secret = encrypt(raw, key) # 使用加密函数、密钥,得到密文
restore = decrypt(secret, key) # 使用解密函数、密钥,得到原文
print('原文 = ', raw)
print('密文 = ', secret)
print('解密后原文= ', restore)
print('破解得到的密钥 = ', crack(raw, secret)) # 使用破解函数,得到密钥
源程序中注释很充分,学习python的同学自己玩一下。
程序运行结果
原文 = i love you
密文 = j mpwf zpv
解密后原文= i love you
破解得到的密钥 = 1