zoukankan      html  css  js  c++  java
  • 群签名,环签名,盲签名,数字签名

    数字签名

    类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。

    实际应用中,由于直接对原消息进行签名有安全性问题,而且原消息往往比较大,直接使用RSA算法进行签名速度会比较慢,所以我们一般对消息计算其摘要(使用SHA-256等安全的摘要算法),然后对摘要进行签名。只要使用的摘要算法是安全的(MD5、SHA-1已经不安全了),那么这种方式的数字签名就是安全的。

    数字摘要

    顾名思义,数字摘要是对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始数字内容。 数字摘要是解决确保内容没被篡改过的问题(利用 Hash 函数的抗碰撞性特点)。数字摘要是 Hash 算法最重要的一个用途。在网络上下载软件或文件时,往往同时会提供一个 数字摘要值,用户下载下来原始文件可以自行进行计算,并同提供的摘要值进行比对,以确 保内容没有被修改过。

    看一个具体场景:

    1,小明对外发布公钥,并声称对应的私钥在自己手上

    2,小明对消息M计算摘要,得到摘要D(digest)

    3,小明使用私钥对D进行签名,得到签名S(signature)

    4,小明将M和S一起发送出去

    接收方,验证过程如下:

    1,接收者先对消息M使用跟小明一样的摘要计算方法,得到摘要D‘

    2,使用小明的公钥对S进行解签,得到摘要D

    3,如果D和D’相同,那么证明M确实是小明发出的,并且没有被篡改过

    数字证书

    数字证书用来证明某个公钥是谁的,并且内容是正确的。

    对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。

    怎么确保一个公钥确实是某个人的原始公钥?

    这就需要数字证书机制。

    顾名思义,数字证书就是像一个证书一样,证明信息的合法性。由证书认证机构(Certification Authority,CA)来签发,权威的 CA 包括 verisign 等。

    数字证书内容可能包括版本、序列号、签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥、CA 数字签名、其它信息等等,一般使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 规范。

    其中,最重要的包括 签发的公开密钥、CA 数字签名 两个信息。因此,只要通过这个证书就能证明某个公钥是合法的,因为带有 CA 的数字签名。

    接着上次的应用场景做假设:

    1,现在有第三者小红,小红想欺骗接收者,她偷偷使用了接收者的电脑,用自己的公钥换走了小明的公钥

    2,此时接收者实际拥有的是小红的公钥,但是还以为是小明的公钥,因此,小红就可以冒充小明,用自己的 私钥做成“数字签名”,发消息给接收者,让接收者用假的小明公钥进行解密

    3,后来,接收者感觉不对劲,发现自己无法确定公钥是否真的属于小明。他想到了一个办法,要求小明去“证书中心”(Certification authority, CA),为公钥做认证。

    4,证书中心用自己的私钥,对小明的公钥和一些相关信息一起加密,生成数字证书(Digital Certificate),小明再发消息,只要在签名的同事,再附上数字证书就可以了

    5,接收者收到消息后,用CA的公钥解开数字证书,拿到小明的真实公钥,然后就能证明“数字签名”是否真的是小明的。

    下面看一个应用“数字证书”的实例:https协议,这个协议主要用于网页加密。

    1.首先,客户端向服务器发出加密请求。

    2.服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

    3. 客户端(浏览器)的”证书管理器”,有”受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

    4.如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

    5. 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

    6. 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

    多重签名

    n 个持有人中,收集到至少 m 个(n≥1)的签名,即认为合法,这种签名被称为多重签名。

    其中,n 是提供的公钥个数,m 是需要匹配公钥的最少的签名个数。

    群签名

    1991 年由 Chaum 和 van Heyst 提出。群签名属于群体密码学的一个课题。

    群签名有如下几个特点:只有群中成员能够代表群体签名(群特性);接收者可以用公钥验证群签名(验证简单性);接收者不能知道由群体中哪个成员所签(无条件匿名保护);发生争议时,群体中的成员或可信赖机构可以识别签名者(可追查性)。

    Desmedt 和 Frankel 在 1991 年提出了基于门限的群签名实现方案。在签名时,一个具有 n 个成员的群体共用同一个公钥,签名时必须有 t 个成员参与才能产生一个合法的签名,t 称为门限或阈值。这样一个签名称为(n, t)不可抵赖群签名。

    环签名

    环签名由 Rivest,shamir 和 Tauman 三位密码学家在 2001 年首次提出。环签名属于一种简化的群签名。

    签名者首先选定一个临时的签名者集合,集合中包括签名者自身。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在其中。

    盲签名

    1983 年由 David Chaum 提出。签名者在无法看到原始内容的前提下对信息进行签名。

    盲签名主要是为了实现防止追踪(unlinkability),签名者无法将签名内容和结果进行对应。典型的实现包括 RSA 盲签名)。

    HMAC

    全称是 Hash-based Message Authentication Code,即“基于 Hash 的消息认证码”。基本过程为对某个消息,利用提前共享的对称密钥和 Hash 算法进行加密处理,得到 HMAC 值。该 HMAC 值提供方可以证明自己拥有共享的对称密钥,并且消息自身可以利用 HMAC 确保未经篡改。

    HMAC(K, H, Message)

    其中,K 为提前共享的对称密钥,H 为提前商定的 Hash 算法(一般为公认的经典算法),Message 为要处理的消息内容。如果不知道 K 和 H,则无法根据 Message 得到准确的 HMAC 值。

    HMAC 一般用于证明身份的场景,如 A、B 提前共享密钥,A 发送随机串给 B,B 对称加密处理后把 HMAC 值发给 A,A 收到了自己再重新算一遍,只要相同说明对方确实是 B。

    HMAC 主要问题是需要共享密钥。当密钥可能被多方拥有的场景下,无法证明消息确实来自某人(Non-repudiation)。反之,如果采用非对称加密方式,则可以证明。

  • 相关阅读:
    算法提高 12-1三角形
    poj3723_Conscription
    算法提高 8-1因式分解
    算法提高 道路和航路
    算法训练 安慰奶牛
    最短路问题(Bellman/Dijkstra/Floyd)
    最小生成树 prime+heap
    算法训练 最短路
    算法训练 最大的算式
    poj3255 Roadblocks
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13312739.html
Copyright © 2011-2022 走看看