zoukankan      html  css  js  c++  java
  • 转载一篇密码学基本介绍

    【密码学02】密码系统原理及数学背景


    上一篇文章【密码学】四大主题简单介绍 一文提到要实现信息传输的保密性、完整性,以及身份鉴别和抗抵赖,使用的技术手段有:

    1)       密码技术(加密与解密)。

    2)      哈希技术,即散列技术。

    3)      随机数。

    4)      时间戳。

    下面先讨论密码技术。

    下图是一个典型的密码系统,展示了密码技术的应用场景:

     

    明文:P   密文:C  加密密钥:K1   解密密钥:K2   加密方法:E   解密方法:D

    加密与解密的关系可以用公式简洁地表示:

    C = EK1(P) 表示用加密密钥K1通过加密方法E对明文P进行加密得到密文C。

    P = DK2(C) 表示用解密密钥K2通过解密方法D对密文C进行解密得到明文P。

    DK2(EK1(P))= P  由上面两个式子可以得到这个式子。

    由此可见,实际上,密码算法E和D都是数学函数。

           关于密码学,有两个基本原则:

    1)       消息必须包含一定的冗余度。

    2)       必须采取措施对抗重放攻击。

    另外,关于密码系统的设计,还有一个原则叫做Kerckhoff原则:

    “密码算法必须公开,只有密钥需要保密。”

    这个原则体现了一个思想:让入侵者知道密码算法没有关系,所有的秘密都隐藏在密钥中。对密码算法保密是不明智的,因为密码算法的设计很困难,一旦算法原理泄露了,必须得花费大量精力重新设计。但密钥可以随时更换。

    每个密码算法,都有其数学背景,依赖某一种数学理论。下面是一些常见密码算法的数学理论依据:

    1)    信息论

    由香农(Claude Elmwood Shannon)于1948年创立的现代信息论为安全的密码系统定义了一个精确的数学模型。

    2)    复杂性理论

    复杂性理论提供了分析密码算法的“计算复杂性”的方法。它通过对密码算法进行比较,来确定一个密码算法的安全性。密码算法的“计算复杂性”通常用时间复杂度和空间复杂度两个变量来度量。

    3)    数论

    数论中的模运算、素数、最大公因子、求模逆元、费尔马定理、中国剩余定理、迦罗瓦域理论等等,是很多密码学算法的数学基础。

    4)    因子分解

    对一个数进行因子分解就是找出它的素数因子。因子分解是数论中最古老的问题,分解一个数很简单,却是一个耗时的过程。一些经典的因子分解算法有:数域筛选法、二次筛选法、椭圆曲线法等。

    5)    计算有限域中的离散对数

    计算离散对数是数学中公认的难题。计算离散对数与因子分解有紧密关系,如果能解决离散对数问题,就能解决因子分解问题。


    【密码学03】对称密码算法

    前一篇文章【密码学02】密码系统原理及数学背景 提到了密码算法。每个密码算法都基于相应的数学理论。密码学发展至今,已经产生了大量优秀的密码算法,通常分为两类:对称密码算法和非对称密码算法。

    对称密码算法是指有了加密密钥就可以推算出解密密钥,有了解密密钥就可以推算出加密密钥的的算法。还是用公式表示比较简洁:

           EK1(P)= C

           DK2(C)= P

    其中E为加密算法,D为解密算法,P为明文,C为密文,K1为加密密钥,K2为解密密钥。在对称密码算法中,有了K1,就可以推算出K2,而有了K2,也可以推算出K1。实际应用的大多数对称密码算法中,K1与K2相同。因此对称密码算法的加密与解密关系如下:

           EK(P)= C

           DK(C)= P

    加密与解密都使用密钥K。

    之所以叫对称加密算法,就是加密与解密的密钥相同。

    常见的对称密码算法有以下这些:

    1) DES,数据加密标准。由IBM于1970年代开发。DES算法使用的密钥长度表示为64位(bit),但每个第8为都用作奇偶校验,所以对于使用者而言,密钥长度是56位。DES将消息分成64位长的分组,一次加密一个分组,最后一个分组如果不满64位,需要按照某种策略填满64位,如下图所示。

     

    DES由于密钥太短,而且密钥空间中存在弱密钥,因此现在已经不再安全了。1977年斯坦福大学的两位密码学大师Diffie和Helman设计了一台机器,只要给定一小段明文和匹配的密文,一天之内即可推算出密钥。

    2) 三重DES,DES的增强版本。如下图所示,还是利用DES密码算法,但是利用三次,加密过程为“加密-解密-加密”,解密过程为“解密-加密-解密”。

     

         用公式可以表示为:

           EK1(DK2(EK3(P))) = C    //加密

           DK1(EK2(DK3(C))) = P    //解密

    由于三次过程使用的密钥不一样,所以相当于增加了密钥长度。实际应用中,K1和K3是相同的,也就是外层的两次加密和两次解密使用相同的密钥。这样,三重DES的密钥长度就相当于K1+K2的长度,即112位(DES的密钥长度为56位)。采用“加密-解密-加密”模式的理由是为了与DES保持兼容,只要设置K1=K2=K3,三重DES不就和DES一样了吗?只是多了两道运算步骤而已。

    三重DES只是DES的一个变种,还有其它变种,例如DESX、CRYPT(3)、GDES、RDES、snDES等等。

    3) AES,高级加密标准。也叫Rijndael算法,由两位比利时密码学家发明,参与了NIST(美国标准和技术委员会)1997年组织的公开密码学竞赛,最终以优异的技术特性胜出成为加密标准。AES以前一篇文章提到的迦罗瓦域理论为数学基础。AES也是分块对数据加密,只是块的长度并不像DES那样定死为64位。Rijndael的密钥长度可以从128位起以32位为间隔递增到256位。

    Rijndael算法完全公开、安全性好、运算速度极快。如果取密钥长度为128位,想用穷举法破解密钥,就算有一台内含1000亿个处理器的计算机,并且每个处理器每秒处理100亿个密钥,也要运行100亿年才能搜索完整个密钥空间。

    4) 其它对称密码算法,有IDEA、Lucifer、Madryga、NewDES、FEAL、REDOC、LOKI、RC2、MMB、GOST、CAST、Blowfish、SAFER、3-WAY、RC5、等等,现在的密码算法真是太多了。IDEA是International Data Encryption Algorithm(国际数据加密算法)的缩写,该算法设计者是James Massey和Xuejia Lai(来学嘉)博士。来学嘉是瑞士籍华人,1954年出生,西安电子科大的硕士毕业生。James Massey是来学嘉的导师。

    IDEA算法安全性比DES好(和AES差不多),能抵抗差分密码分析的攻击,而DES不行。IDEA的加密速度比DES快,加密数据速率可达到177MB/秒,也和AES差不多。


    【密码学04】非对称密码算法

    上一篇【密码学03】对称密码算法 介绍了对称密码算法,其主要特性就是加密解密密钥能互相推算,而实际应用中绝大多数对称加密算法的加密密钥和解密密钥是相同的。正因为如此,加密者指定一个密钥后,必须得想方设法把密钥分发出去给解密者,同时还得小心翼翼确保密钥不被泄露。这是对称密码算法固有的一个矛盾,如何解决呢?

    还是前面提到的斯坦福两位密码学大师Diffie 和Helman,1976年提出了一种全新的密码系统概念:非对称密码算法。下面看看非对称密码算法的特性。

    与对称密码算法相反,非对称密码算法的加密密钥和解密密钥不相同,而且从加密密钥推算出解密密钥极其困难。简单来说,非对称密码算法的特性如下:

    1)       EK1(P) =C   //E:加密算法,K1:加密密钥,P:明文,C:密文,下同。

    DK2(C) = P   //D:解密算法,K2:解密密钥。

    综合上面两个式子,可得:

    DK2(EK1(P)) = P

    2)       从K1 推断出K2极其困难。如果密钥长度足够长,银河系中的任何一种生物都应该不可能轻易从K1推出K2,或者从K2推算K1。

    3)  某些优秀的非对称密码算法还具有如下特性,但不是所有的算法都具备:

    EK1(DK2(P)) = P

    也就是加密函数E与解密函数D互为反函数,解密函数可以当成加密函数来用,加密函数也可以当成解密函数来用。这个特性非常迷人。

    具备前面两个特性以后,加密密钥就可以放心地公之于众了。 Alice要用非对称密码算法秘密地传送消息给Bob,过程是怎么样的呢?首先Bob自己要生成一对密钥BK1和BK2,他可以任意选择一个密钥比如BK1公布给所有人包括Alice,他自己保留BK2不让任何人知道。Alice知道Bob 公开的密钥BK1后,就可以用BK1加密明文P得到密文C,然后传送给Bob。她不用担心别人能解密消息,因为BK1加密的消息只有BK2才能解密,而BK2只有Bob才知道,想从BK1推算出BK2几乎不可能。Bob收到消息,用私密的BK2解密即可得到明文。反过来,Bob要传送消息给Alice,Alice也要先生成一对密钥AK1和AK2,并按照同样的过程进行。

    由于非对称密码算法可以把加密密钥公开,因此也叫做公开密钥密码算法,简称公钥密码算法,或公钥算法。公钥算法的确是非常优雅地解决了密钥既要保密又要公开的矛盾。下面是一些常见的公钥密码算法。

    1) RSA,是MIT(麻省理工学院)三个密码学大师Rivest、Shamir、Adleman于1978年共同发表,因此名字就是三个人名的首字母。RSA是最优秀的公钥算法,它满足上面提到的全部三个特性。RSA算法的数学基础是【密码学02】密码系统原理及数学背景 一文提到的因子分解。RSA算法经受住了密码分析学家们三十年来的大量攻击,虽然密码分析学家们不能证明RSA是安全的,但也不能证明RSA是不安全的。RSA已经被广泛使用,为整个地球村的信息安全尤其是电子商务的安全做出了极大贡献。

    2) El Gamal,该算法的数学基础是【密码学02】密码系统原理及数学背景 一文中提到的计算有限域中的离散对数”的难题。El Gamal算法也是非常优秀的公钥密码算法。

    3) 其它公钥密码算法还有很多,例如背包算法、Rabin算法、Pohlig-Hellman算法、McEliece算法、基于椭圆曲线的算法、LUC算法等等。

    关于背包算法,Tanenbaum的《Computer Networks》(4th)中讲述了一个有趣的故事:背包算法设计这Merkle曾悬赏100美金破解该算法,RSA组合中的S,即Shamir迅速破解算法并领走奖金。Merkle于是增强了算法,再次悬赏破解,奖金加到1000美金。RSA组合中的R,即Rivest又迅速破解领走奖金。此后Merkle就没再悬赏了,因此RSA组合中的另外一个人A,即Adleman也就没能拿到预期的10000美金了。从这个故事可以看出RSA这个信息安全领域的黄金组合的确超级牛叉!

    公钥密码算法非常优雅,但是几乎所有的公钥算法都有一个问题:速度太慢。RSA算法的速度是DES的1000分之一,并且密钥越长,速度会急剧变慢。因此实际应用中密码系统都是把公钥密码算法与对称密码算法结合在一起使用。


    【密码学05】加密模式

    大多数密码算法都是将明文切成固定长度的多个块,以块为单位进行加密,而不是逐个字节地加密数据。不管什么样的密码算法,任何时候当同样的明文块从算法前端输入,同样的密文块就从后端输出。入侵者可以充分发掘这种特性来协助攻破密码系统。下面举个例子来说明。

    下面这个表描述的是三个人的年终奖金额度。

    Alice

    8000

    Bob

    12000

    Trudy

    3000

    老板授权秘书MM整理好这张表后,秘书MM将其加密,然后提交给财务部门。为了清楚地描述问题,这里假设这张表的每个字段都是64位,而且刚好秘书MM用的加密算法的加密块长度也是64位,那么加密结果可能就是像下面这个样子:

    As9d8912h3a98q 9SDJKVNI

    9d89821as89982mHSLkp[anm

    09djhASDFQWER78sdfHD,zx

    0812UtWEQ23][;[]X/;;\DSKg5p

    78723G/CC;D;LFSDF/;LXPASh

    /.,;ISOFIWERIIOC7kjJKJDFNSAn

    假设在秘书MM发送这段密文之前,不巧让Trudy看到了。尽管Trudy看不懂这个表的内容,但是当秘书MM抱怨就两个字段的表为什么么要定死每个字段长度为64位的时候,Trudy获得了足够的信息。她知道由于自己刚和老板吵过嘴,奖金肯定没有其它人高,于是她尝试将这些密文块的顺序调整了一下,变成下面这个样子:

    As9d8912h3a98q 9SDJKVNI

    0812UtWEQ23][;[]X/;;\DSKg5p

    09djhASDFQWER78sdfHD,zx

    /.,;ISOFIWERIIOC7kjJKJDFNSAn

    78723G/CC;D;LFSDF/;LXPASh

    9d89821as89982mHSLkp[anm

    仅仅是调整一下密文块的顺序,财务部解密消息的时候完全察觉不到有任何异常。尽管Trudy还是不知道奖金是多少,但是可以很有把握地相信自己的奖金会比原来高。

    为了对抗这种问题,需要采取某种加密模式,需要把各个密文块关联起来,使得密文任何一处有异常更改,都会导致整个密文作废。常见的加密模式有以下这。

    1) 电子密码本模式:ECB。这个不用再介绍了,就上面讲的有问题的这种模式,每块明文都对应自己的密文块,互不相干。虽然有问题,但它也是一种模式,呵呵。

    2) 密码块链模式:CBC。每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。在加密块之前,初始化向量通过按位“异或”操作与第一个纯文本块结合。如果密码文本块中有一个位出错,相应的纯文本块也将出错。此外,后面的块中与原出错位的位置相同的位也将出错。下图是CBC加密模式示意图。


    3) 密码反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。该模式使用在长度上为一个块且被分为几部分的移位寄存器。例如,如果块大小为 8 个字节,并且每次处理一个字节,则移位寄存器被分为 8 个部分。如果密码文本中有一个位出错,则一个纯文本位出错,并且移位寄存器损坏。这将导致接下来若干次递增的纯文本出错,直到出错位从移位寄存器中移出为止。CFB加密模式示意图如下。

     

    4) 输出反馈模式。将少量递增的纯文本处理成密码文本,而不是一次处理整个块。此模式与 CFB 相似;这两种模式的唯一差别是移位寄存器的填充方式不同。如果密码文本中有一个位出错,纯文本中相应的位也将出错。但是,如果密码文本中有多余或者缺少的位,则那个位之后的纯文本都将出错。

    5) 流密码模式。用一个密钥加密一个初始向量生成一个输出块,然后用同样的密钥对这个输出块进行加密以得到第二个输出块,再用同样的密钥对这个输出块进行加密得到第三个输出块,以此类推。所有这些块的序列叫做密钥流。逐块输出密钥流时,就逐块与明文异或,输出的就是密文。

    6) 计数器模式。用一个密钥加密一个初始向量生成输出块,然后将初始向量加1再用同样的密钥加密输出第二个输出块,以此类推。输出的块序列也是密钥流,逐块输出密钥流时,就逐块与明文异或,输出的就是密文。

    7) CTS(密码文本窃用模式)。处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与CBC 模式的行为相同。


    【密码学06】数据块填充模式

    大多数密码算法都是块密码算法,需要将明文消息切成固定大小的块,一块一块地进行加密。例如DES就需要将消息切割成一个个64位的块。如果消息长度不是64的整数倍,最后一个消息块就不够64位,这时就要对最后一个消息块进行填充。填充本身是很简单的事情,问题在于有很多种可行的填充方式,如果加密时以某种方式填充,解密时就得理解这种填充方式并去除填充内容,否则很可能解密出来得到的数据就是脏数据。

    某些加密标准指定了特定的填充方案。下面简单描述一下这些模式的工作原理。

    假定块长度为8字节,要加密的明文数据长度为9字节。那么消息被切成两个块,第二块只有1个字节,需要填充7个字节。假定9字节的明文数据如下:

    F1 F2 F3 F4 F5 F6 F7 F8 F9

    以下是常见的四种填充方式:

    1) Zeros填充:全部填充为0的字节,结果如下:

           F1 F2 F3 F4 F5 F6 F7 F8   //第一块
           F9 00 00 00 00 00 00 00  //第二块

    2) X923 填充: 填充为0的字节序列,最后一个字节记录填充的总字节数,结果如下:

           F1 F2 F3 F4 F5 F6 F7 F8   //第一块
           F9 00 00 00 00 00 00 07  //第二块

    2) PKCS7 填充: 每个填充的字节都记录了填充的总字节数,结果如下:

        F1 F2 F3 F4 F5 F6 F7 F8   //第一块
        F9 07 07 07 07 07 07 07  //第二块

    3) ISO10126 填充: 填充随机字节序列,最后一个字节记录填充的总字节数,结果如下:
         F1 F2 F3 F4 F5 F6 F7 F8   //第一块
         F9 7D 2A 75 EF F8 EF 07  //第二块




  • 相关阅读:
    android 75 新闻列表页面
    android 74 下载文本
    android 73 下载图片
    android 72 确定取消对话框,单选对话框,多选对话框
    android 71 ArrayAdapter和SimpleAdapter
    android 70 使用ListView把数据显示至屏幕
    maven如何将本地jar安装到本地仓库
    Centos6.7搭建ISCSI存储服务器
    解决maven打包编译出现File encoding has not been set问题
    MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423344.html
Copyright © 2011-2022 走看看