zoukankan      html  css  js  c++  java
  • 从数学到密码学(十六)

    数字签名(二)

    上一节留下两个问题:
    一、验证Trent签名真伪性的算法V是否存在
    二、Trent的公开信息PT从何而来

    再一次把目光停留在公式V(M,Sig(M,ST),PT)=True上,在等式中出现了两个关于Trent的参数:ST和PT。根据上节的描述,ST和PT分别是与Trent身份有关的秘密和公开的参数,而且它们是成对出现,这给我们什么启示呢?

    仔细回想前面讲过的内容,你会突然发现,这恰好和公钥密码学中公私钥对的概念类似:一个是公开的,另一个是秘密保存的。只不过在前面的叙述中,公钥公开是用于加密,秘密持有的私钥则用于解密。

    一个自然而然的猜测就是:Trent的公私钥对,是否真的能应用于上述公式,能够证明某一消息的真伪性。

    为什么会这样猜测,这是因为,如果PT/ST分别是Trent的公私钥对,则第二个遗留问题迎刃而解(PT是公开的公钥,自然为Bob所知--请注意,这里留了个尾巴,本节最后将提到)。

    唯一剩下的问题是:算法V--或者通俗地说,判断签名真伪性的方法V--到底存不存在?

    幸运的是,V是存在的。为了让读者先有个感性认识,下面给出一个实例--基于RSA算法的签名与验证,毕竟我们在理论方面逗留久了点^_^。

    回顾一下,RSA算法中的公钥是(e,n),私钥是(d,n),如果p是明文,则密文c=pe(mod n),我们假设e/d就是Trent的公私钥对--当然严格来说,还要加上n。

    现在已知消息m,要求Trent给出关于m的签名s,并且s还要能满足验证算法V,该算法以Trent的公钥e为参数。

    算法V是我们要求解的,不知道,怎么办?暂时绕过,先从私钥d入手,RSA算法的数学基础是基于模幂运算,在加解密中,公私钥对e/d都是作为指数参与运算的。现在根据要求,d需要参与签名运算,以我们目前的知识,d仍然只能起指数的作用。这样一来,另一个参与运算的消息m,自然作为幂运算的底数----其实确定好d的运算位置后,m的运算位置也没有更好的选择。幂运算的结果md(mod n)权且就当作签名s吧。那么,用私钥参与运算生成的签名s有什么特点,换句话说,签名s能满足哪些验证算法V呢?

    熟悉RSA加解密过程的读者,马上可以看出,s满足se=m(mod n)。

    将上面这个等式变换一下形式,对于Trent的公钥(e,n),给定消息m,如果s满足se=m(mod n),则记为V(m,s,e,n)=TRUE

    问题是,上面的判定条件V--实质是等式se=m(mod n)--能够作为判断m真伪性的准则吗。

    该等式中出现了代表Trent身份的公钥(e,n)、消息m和签名s,V在形式上满足。现在到了最后的关键:s是否只能由Trent生成?

    稍加注意,可以看出,相当于如下问题:

    给定Trent的公钥(e,n)和密文m,除Trent外的第3人能否得到对应的明文s。

    答案是肯定的:不能,因为这是RSA体制不被破解的数学基础,即给定密文,无法解出明文。

    到了这里,终于可以确认:签名s只能由Trent本人生成(其实Trent对m做了个解密运算),其他人无法给出满足V(m,s,e,n)=TRUE的s,s是Trent对消息m的真正签名(即数字签名)

    在上例中,我们还发现,V(m,s,e,n)=TRUE--即等式se=m(mod n)--具有以下特性:
    1. 给定消息m和公钥(e,n),只有私钥d的拥有人(此例中的Trent)才能计算出签名s满足V(m,s,e,n)=TRUE
    推论:任何第三方不能伪造满足条件V的签名s; 如果存在s满足条件V,则s只能由私钥拥有人生成,他无法否认,即签名具有不可伪造/不可否认的特性

    2. 给定消息m和签名s,任何人都可以用公钥(e,n)来计算V(m,s,e,n)是否为真,这说明签名可以公开可验证
    说明:只要拿到公钥,任何人都可以验证s是否为m的签名。这一点比日常生活中的实际签名要方便得多(可能需要身边的亲人或笔迹专家来判断)

    3. 对于同一消息m,如果不同人的公钥(e,n)不同,则生成的签名s也不同。我们称之为签名的唯一性。

    需要说明的是,公开可验证、不可伪造/不可否认、签名唯一性,这三者是合格的数字签名体制必须具有的基本特性

    让我们停下来想一下,我们是怎样走到这一步的?

    最初我们要解决是的如何让Bob相信Carol的公钥是Y,Carol找到了Bob信任的可信第3方Trent,让Trent给Bob发送一份证明,待证明的消息是"Carol的公钥是Y",Trent用自己的私钥对该消息进行运算,得到签名s,Bob收到m和s后,再加上Trent的公钥PT,验证V(m,s,PT)是否为真。

    为了解决公钥的可靠分发,我们最终利用公钥密码学的新特性--签名和验证--将其圆满地解决

    正是众里寻她千百度,蓦然回首,那人却在灯火阑珊处

    且慢,真的圆满吗?让我们慢慢地思考,对于Bob,Trent的公钥PT从何而来,如果PT(象Carol的公钥一样)来自网络,又如何令Bob相信它呢?如果Bob不相信PT的真假,又怎么能让Bob用PT去验证Carol的公钥真实性呢?

    这正是,按下葫芦又起瓢

    欲知后事如何,请看数字签名(三)

  • 相关阅读:
    【转】大型高性能ASP.NET系统架构设计
    【原创】构建高性能ASP.NET站点 第五章—性能调优综述(后篇)
    表关联键上创建索引的重要性
    NorthScale Memcached Server尝试总结
    转:80后的80条幽默有哲理的语录
    利用AOP重构代码
    Sandcastle Help File Builder
    酒店项目OO设计
    泛型委托在项目中的应用
    SQL CTE能帮助我做什么
  • 原文地址:https://www.cnblogs.com/efzju/p/2278685.html
Copyright © 2011-2022 走看看