密码学原理简述(1):从一个简单的例子,理解加解密

密码学是研究如何隐密地传递信息的学科。

一、几个基本概念: 原文、密文、加密、解密、算法、密钥

举一个简单的例子,比如:

我们要传递一串信息 “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

猜你喜欢

转载自blog.csdn.net/c80486/article/details/131819713