.jpg)
一、nonce 避免重放攻击
一:什么是nonce
维基百科:安全工程中,Nonce是一个在加密通信只能使用一次的数字。在认证协议中,它往往是一个随机或伪随机数,以避免重放攻击。
二:举例说明
一个典型的基于 nonce的验证协议如下:
这里的 cnonce为 client nonce(后面将讨论为什么需要 cnonce)。Client并不直接发送密码(或者密码直接加密后的密文)用以避免攻击者直接窃取密码(或者密码直接加密后的密文)并冒充用户进行身份验证。
先不考虑 Client nonce。Server首先发送 nonce到 Client,Client将密码和 nonce通过 hash运算再提交到 Server进行身份验证,这样我们可以认为(而非绝对)每次用于身份验证的 hash值都不相同,即使攻击者窃取了前一次用于身份验证的 hash值也无法冒充用户进行登录。公式如下:
A= Hash(nonce, password)
在不安全的网络环境中,A、nonce、Hash算法都可以被攻击者获取,如果能够满足以下条件:
nonce仅仅被使用一次
Hash运算不出现冲突
攻击者则在理论上无法实施 Replay attack。因此 nonce在特定上下文中仅仅被使用一次以及 Hash算法尽量避免冲突是安全的关键。为了确保 nonce在特定上下文中仅仅被使用一次,可以使用以下策略生成 nonce:
nonce可以是一个时间相关变量
nonce可以是一个通过足够随机算法生成的足够长的 bits
以上算法难以避免攻击者使用字典进行密码破解。其中一个可行的方法为:攻击者可以截取 A= Hash(nonce, password)中的 A、nonce,然后通过字典破解用户的密码 password。不过破解的过程是很耗时的,使用一个中等规模的集群(medium-scale cluster)可能需要数周),如果期望破解成千上万用户的密码,那么将消耗极大量的时间。
如果攻击者能够构建一个预计算的表(例如 Rainbow tables)那么破解大量用户密码的时间将大大缩短。nonce阻止了预计算表的生成(因为 Server nonce每次都不相同),但是如果网络中传输的数据能被篡改,情况就不一样了。假定攻击者伪造一个固定的 nonce发送给网络中的 Clients并且记录 nonce和 Clients的回应(Hash(nonce, password)),由于 nonce为一个固定值,那么攻击者就可以构造一个预计算的表,此表使用此固定的 nonce。通过此表即可大大缩短破解用户密码的时间了。
为了避免攻击者通过以上手段构建预计算的表。在 Client也引入了一个 nonce。这样,每次都不同的 cnonce防止了预计算表的生成。
二、网络安全***重放攻击及其防御
网络安全-重放攻击及其防御
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通信过程中都可能发生,是计算机世界黑客常用的攻击方式之一。
根据重放消息的接收方与消息的原定接收方的关系。
该方法优点是认证双方不需要时间同步,双方记住使用过的随机数,如发现报文中有以前使用过的随机数,就认为是重放攻击。缺点是需要额外保存使用过的随机数,若记录的时间段较长,则保存和查询的开销较大。
该方法优点是不用额外保存其他信息。缺点是认证双方需要准确的时间同步,同步越好,受攻击的可能性就越小。但当系统很庞大,跨越的区域较广时,要做到精确的时间同步并不是很容易。(受限于网络情况和客户机)
就是双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。该方法优点是不需要时间同步,保存的信息量比随机数方式小。缺点是一旦攻击者对报文解密成功,就可以获得流水号,从而每次将流水号递增欺骗认证端。
nonce是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,我们这里为了方便起见,直接使用时间戳作为种子,随机生成16位的字符串,作为nonce参数。
每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。
我们常用的防止重放的机制是使用timestamp和nonce来做的重放机制。
每个请求带的时间戳不能和当前时间超过一定规定的时间(60s)。这样请求即使被截取了,你也只能在60s内进行重放攻击,过期失效。
但是攻击者还有60s的时间攻击。所以我们就需要加上一个nonce随机数,防止60s内出现重复请求。
Chrome现已支持DNS OVER HTTPS加密服务
在谷歌浏览器最新推出的Google Chrome V83稳定版中,正式推出基于HTTPS的DNS(DNS-over-HTTPS)。
HTTPS上的DNS是一种有争议的互联网隐私技术,可对DNS连接进行加密并将其隐藏在常见的HTTPS流量中,从而使第三方(例如 ISP)无法知晓您正在浏览的网站。
涉及身份认证的功能中猜解的防范措施有哪些
涉及身份认证的功能中拆解的防范措施有:
1、抵抗重放攻击。重放攻击是一种相当普遍的攻击方式,如果身份认证系统不能抵抗重放攻击,则系统基本无法投入实际应用。防止重放攻击主要是保证认证信息的可信性,其基本方法包括:为认证消息增加一个时间戳,为认证消息增加实时信息,动态实施认证消息等。
2、抵抗密码分析攻击。身份认证系统的认证过程应具有密码安全性。这种安全性可通过对称密码体制的保护、非对称密码体制的保护或者Hash函数的单向性来实现。
3、双向身份认证功能。如果在设计身份认证系统时仅实现服务器对客户端的身份认证,则说明系统是不完善的,特别是客户端具有敏感信息上传的时候,因此也应该实现客户端对服务器的身份认证。以自动取款机(ATM)为例,客户必须防止来自服务端的欺骗,因为如果存在欺骗,那么客户将会泄露自己的帐户信息。
4、多因子身份认证。为了提高身份认证服务的安全强度,一种身份认证机制最好不要仅仅依赖于某一项秘密或者持有物。如果身份认证系统仅仅依赖于用户所有,则拥有物一旦丢失,身份冒充将成为可能。如果身份认证系统仅仅依赖于用户生物特征,则一旦这个特征被模仿,身份冒充将成为可能。如果系统仅仅依赖用户所知实现对用户身份的认证,则用户所知一旦泄露,身份冒充将成为可能。
5、良好的认证同步机制。如果身份认证信息是动态推进的,则存在认证的同步问题。有许多因素可能会导致认证的不同步:确认消息的丢失、重复收到某个认证消息、中间人攻击等。身份认证系统应该具有良好的同步机制,以保证在认证不同步的情况下,能自动恢复认证同步。
6、保护身份认证者的身份信息。在身份认证过程中保护身份信息具有十分重要的意义。身份信息保护分为以下几个层次:身份信息在认证过程中不被泄露给第三方,可以通过加密进行传输。甚至连身份认证服务器也不知道认证者的身份,可以通过匿名服务进行传输。
7、提高身份认证协议的效率。一个安全的认证协议可以减少认证通信的次数,保证可靠性,降低被攻击的可能性,这是身份认证系统设计所追求的目标。
8、减少认证服务器的敏感信息。一个良好的身份认证系统应该在服务器中存放尽可能少的认证敏感信息,这样,服务器即使被攻破,也可以将损失降到最低。
Web怎样防止重放攻击
单独的随机数不能避免重放攻击,随机数一般会和签名加密技术,后台验证技术混合以提高破解和重放难度。
重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(Freshness Attacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。
从重放攻击的定义上我们可以看到,重放攻击提交给服务器的数据是曾经有效的,如何防止这种数据,对特定信息给与一个特定的随机数,并且这个随机数保存在服务器内,在验证了用户信息前,首先会对随机数进行验证,如果发现提交的随机数和服务器保存的不同则,该条信息无效通过这种方法来防止重放攻击。
常用的防御重放攻击,不会直接暴露随机数,一般随机数会用在MD5,HASH(数字签名)上,比如在对有效值进行MD5加密时添加随机数,如用户名为test,密码为test的MD5加密过程可能为MD5("test","test",随机数),这样在直接传输时不会暴露出随机值,黑客在提交重放攻击时系统发现MD5签名和系统签名计算后不同则,可被认定为重放攻击。
当然矛和盾是一种存在的,有可能该值刚好又一次的分配给了该用户,可能会重放攻击成功,但这个概率在科学计算上可以被视为0,而且随着随机数的位数的提高,概率会不断降低。
nonce避免重放攻击
一:什么是nonce
: 安全工程中,Nonce是一个在加密通信只能使用一次的数字。在认证协议中,它往往是一个随机或伪随机数,以避免重放攻击。
二:举例说明
一个典型的基于 nonce的验证协议如下:
这里的 cnonce为 client nonce(后面将讨论为什么需要 cnonce)。Client并不直接发送密码(或者密码直接加密后的密文)用以避免攻击者直接窃取密码(或者密码直接加密后的密文)并冒充用户进行身份验证。
先不考虑 Client nonce。Server首先发送 nonce到 Client,Client将密码和 nonce通过 hash运算再提交到 Server进行身份验证,这样我们可以认为(而非绝对)每次用于身份验证的 hash值都不相同,即使攻击者窃取了前一次用于身份验证的 hash值也无法冒充用户进行登录。公式如下:
A= Hash(nonce, password)
在不安全的网络环境中,A、nonce、Hash算法都可以被攻击者获取,如果能够满足以下条件:
nonce仅仅被使用一次
Hash运算不出现冲突
攻击者则在理论上无法实施 Replay attack。因此 nonce在特定上下文中仅仅被使用一次以及 Hash算法尽量避免冲突是安全的关键。为了确保 nonce在特定上下文中仅仅被使用一次,可以使用以下策略生成 nonce:
nonce可以是一个时间相关变量
nonce可以是一个通过足够随机算法生成的足够长的 bits
以上算法难以避免攻击者使用字典进行密码破解。其中一个可行的方法为:攻击者可以截取 A= Hash(nonce, password)中的 A、nonce,然后通过字典破解用户的密码 password。不过破解的过程是很耗时的,使用一个中等规模的集群(medium-scale cluster)可能需要数周),如果期望破解成千上万用户的密码,那么将消耗极大量的时间。
如果攻击者能够构建一个预计算的表(例如 Rainbow tables)那么破解大量用户密码的时间将大大缩短。nonce阻止了预计算表的生成(因为 Server nonce每次都不相同),但是如果网络中传输的数据能被篡改,情况就不一样了。假定攻击者伪造一个固定的 nonce发送给网络中的 Clients并且记录 nonce和 Clients的回应(Hash(nonce, password)),由于 nonce为一个固定值,那么攻击者就可以构造一个预计算的表,此表使用此固定的 nonce。通过此表即可大大缩短破解用户密码的时间了。
为了避免攻击者通过以上手段构建预计算的表。在 Client也引入了一个 nonce。这样,每次都不同的 cnonce防止了预计算表的生成。
C#如何防止重放攻击
重播攻击,指的是原样请求的方式再次进行请求。
其实严格情况下,重播并不能当即被绝对防止,一般情况下使用的是指定时间外的重播攻击。
操作办法是,MD5摘要中对时间戳同时进行了摘要,在验证时同时验证时间戳——在指定的时间内可以处理,否则直接抛出例外就行。当然这里有一个前提条件,如果你本机请求时间与服务器时间差别大于验证时间时,无确验证。
也就是说假定了两者相同的时间,这样在规定的时间内无法到达的信息都是被认为是重播。除非别有用心的人在指定的时间内拿到你所有请求进行重播。
绝对意义上是否可以防止重播?可以的,假定我们存在一个redis之类的缓存,存储一些特定时间内的值(超出这个时间则失效),所有的请求都是被记录到该库中(超时的会删除),然后时间戳进行对比,如果在指定时间内的信息则对缓存进行请求若查询到值,则认为是重播。否则正常处理。超时的则直接认为是超时,不再进行处理。
但这种方案成本还是非常高的!即便是特别注意安全的地方,也未必使用该种方式。当然另一种防止重播机制是握手机制——请求方先请求处理序列,服务器存在这个序列,然后在MD5中针对该序列进行摘要。服务器在第一次请求时,序列会保存到缓存中,请求到达时读缓存,并同时将该序列配对处理。重播时因不存在对应的序列,所以可判定为重播。当然这种成本也是比较高的。
因为成本问题,所以在业务执行时,索性使用驼鸟策略,不再进行重播的任何处理——但用户数据处理有回复机制,只要可以恢复或撤回其中一笔交易即可。绝对保证安全有时并不是十分的需要的。
计算机网络安全技术试题
1.最有效的保护E-mail的方法是使用加密签字,如( B),来验证E-mail信息。通过验证E-mail信息,可以保证信息确实来自发信人,并保证在传输过程没有被修改。
A. Diffie-Hellman
B. Pretty Good Privacy(PGP)
C. Key Distribution Center(KDC)
D. IDEA
2.黑客要想控制某些用户,需要把木马程序安装到用户的机器中,实际上安装的是(B)
A.木马的控制端程序
B.木马的服务器端程序
C.不用安装
D.控制端、服务端程序都必需安装
3.下列不属于包过滤检查的是(D)
A.源地址和目标地址
B.源端口和目标端口
C.协议
D.数据包的内容
4.代理服务作为防火墙技术主要在OSI的哪一层实现(A)
A.数据链路层
B.网络层
C.表示层
D.应用层
5.加密在网络上的作用就是防止有价值的信息在网上被( D本题答案说法不一个人认为是D)。
A.拦截和破坏
B.拦截和窃取
C.篡改和损坏
D.篡改和窃取
6.按照可信计算机评估标准,安全等级满足C2级要求的操作系统是(D)
A. DOS
B. Windows XP
C. Windows NT
D. Unix
7.下面关于口令的安全描述中错误的是(B和D说的都不是很正确。。)`
A.口令要定期更换
B.口令越长越安全
C.容易记忆的口令不安全
D.口令中使用的字符越多越不容易被猜中
8.不对称加密通信中的用户认证是通过(B)确定的
A.数字签名
B.数字证书
C.消息文摘
D.公私钥关系
9.对于IP欺骗攻击,过滤路由器不能防范的是( D)。
A.伪装成内部主机的外部IP欺骗
B.外部主机的IP欺骗
C.伪装成外部可信任主机的IP欺骗
D.内部主机对外部网络的IP地址欺骗
10.RSA加密算法不具有的优点是(D)
A.可借助CA中心发放密钥,确保密钥发放的安全方便
B.可进行用户认证
C.可进行信息认证
D.运行速度快,可用于大批量数据加密
11.PGP加密软件采用的加密算法(C)
A.DES
B.RSA
C.背包算法
D.IDEA
12.以下说确的是(D)
A.木马不像病毒那样有破坏性
B.木马不像病毒那样能够自我
C.木马不像病毒那样是独立运行的程序
D.木马与病毒都是独立运行的程序
13.使用防病毒软件时,一般要求用户每隔2周进行升级,这样做的目的是(C)
A.对付最新的病毒,因此需要下载最新的程序
B.程序中有错误,所以要不断升级,消除程序中的BUG
C.新的病毒在不断出现,因此需要用及时更新病毒的特征码资料库
D.以上说法的都不对
14.防火墙的安全性角度,最好的防火墙结构类型是(D)
A.路由器型
B.服务器型
C.屏蔽主机结构
D.屏蔽子网结构
剩下的由高人来补。
三、如何找到区块链的密码,区块链的密钥是什么
【深度知识】区块链之加密原理图示(加密,签名)
先放一张以太坊的架构图:
在学习的过程中主要是采用单个模块了学习了解的,包括P2P,密码学,网络,协议等。直接开始总结:
秘钥分配问题也就是秘钥的传输问题,如果对称秘钥,那么只能在线下进行秘钥的交换。如果在线上传输秘钥,那就有可能被拦截。所以采用非对称加密,两把钥匙,一把私钥自留,一把公钥公开。公钥可以在网上传输。不用线下交易。保证数据的安全性。
如上图,A节点发送数据到B节点,此时采用公钥加密。A节点从自己的公钥中获取到B节点的公钥对明文数据加密,得到密文发送给B节点。而B节点采用自己的私钥解密。
2、无法解决消息篡改。
如上图,A节点采用B的公钥进行加密,然后将密文传输给B节点。B节点拿A节点的公钥将密文解密。
1、由于A的公钥是公开的,一旦网上黑客拦截消息,密文形同虚设。说白了,这种加密方式,只要拦截消息,就都能解开。
2、同样存在无法确定消息来源的问题,和消息篡改的问题。
如上图,A节点在发送数据前,先用B的公钥加密,得到密文1,再用A的私钥对密文1加密得到密文2。而B节点得到密文后,先用A的公钥解密,得到密文1,之后用B的私钥解密得到明文。
1、当网络上拦截到数据密文2时,由于A的公钥是公开的,故可以用A的公钥对密文2解密,就得到了密文1。所以这样看起来是双重加密,其实最后一层的私钥签名是无效的。一般来讲,我们都希望签名是签在最原始的数据上。如果签名放在后面,由于公钥是公开的,签名就缺乏安全性。
2、存在性能问题,非对称加密本身效率就很低下,还进行了两次加密过程。
如上图,A节点先用A的私钥加密,之后用B的公钥加密。B节点收到消息后,先采用B的私钥解密,然后再利用A的公钥解密。
1、当密文数据2被黑客拦截后,由于密文2只能采用B的私钥解密,而B的私钥只有B节点有,其他人无法机密。故安全性最高。
2、当B节点解密得到密文1后,只能采用A的公钥来解密。而只有经过A的私钥加密的数据才能用A的公钥解密成功,A的私钥只有A节点有,所以可以确定数据是由A节点传输过来的。
经两次非对称加密,性能问题比较严重。
基于以上篡改数据的问题,我们引入了消息认证。经过消息认证后的加密流程如下:
当A节点发送消息前,先对明文数据做一次散列计算。得到一个摘要,之后将照耀与原始数据同时发送给B节点。当B节点接收到消息后,对消息解密。解析出其中的散列摘要和原始数据,然后再对原始数据进行一次同样的散列计算得到摘要1,比较摘要与摘要1。如果相同则未被篡改,如果不同则表示已经被篡改。
在传输过程中,密文2只要被篡改,最后导致的hash与hash1就会产生不同。
无法解决签名问题,也就是双方相互攻击。A对于自己发送的消息始终不承认。比如A对B发送了一条错误消息,导致B有损失。但A抵赖不是自己发送的。
在(三)的过程中,没有办法解决交互双方相互攻击。什么意思呢?有可能是因为A发送的消息,对A节点不利,后来A就抵赖这消息不是它发送的。
为了解决这个问题,故引入了签名。这里我们将(二)-4中的加密方式,与消息签名合并设计在一起。
在上图中,我们利用A节点的私钥对其发送的摘要信息进行签名,然后将签名+原文,再利用B的公钥进行加密。而B得到密文后,先用B的私钥解密,然后对摘要再用A的公钥解密,只有比较两次摘要的内容是否相同。这既避免了防篡改问题,有规避了双方攻击问题。因为A对信息进行了签名,故是无法抵赖的。
为了解决非对称加密数据时的性能问题,故往往采用混合加密。这里就需要引入对称加密,如下图:
在对数据加密时,我们采用了双方共享的对称秘钥来加密。而对称秘钥尽量不要在网络上传输,以免丢失。这里的共享对称秘钥是根据自己的私钥和对方的公钥计算出的,然后适用对称秘钥对数据加密。而对方接收到数据时,也计算出对称秘钥然后对密文解密。
以上这种对称秘钥是不安全的,因为A的私钥和B的公钥一般短期内固定,所以共享对称秘钥也是固定不变的。为了增强安全性,最好的方式是每次交互都生成一个临时的共享对称秘钥。那么如何才能在每次交互过程中生成一个随机的对称秘钥,且不需要传输呢?
那么如何生成随机的共享秘钥进行加密呢?
对于发送方A节点,在每次发送时,都生成一个临时非对称秘钥对,然后根据B节点的公钥和临时的非对称私钥可以计算出一个对称秘钥(KA算法-KeyAgreement)。然后利用该对称秘钥对数据进行加密,针对共享秘钥这里的流程如下:
对于B节点,当接收到传输过来的数据时,解析出其中A节点的随机公钥,之后利用A节点的随机公钥与B节点自身的私钥计算出对称秘钥(KA算法)。之后利用对称秘钥机密数据。
对于以上加密方式,其实仍然存在很多问题,比如如何避免重放攻击(在消息中加入Nonce),再比如彩虹表(参考KDF机制解决)之类的问题。由于时间及能力有限,故暂时忽略。
那么究竟应该采用何种加密呢?
主要还是基于要传输的数据的安全等级来考量。不重要的数据其实做好认证和签名就可以,但是很重要的数据就需要采用安全等级比较高的加密方案了。
密码套件是一个网络协议的概念。其中主要包括身份认证、加密、消息认证(MAC)、秘钥交换的算法组成。
在整个网络的传输过程中,根据密码套件主要分如下几大类算法:
秘钥交换算法:比如ECDHE、RSA。主要用于客户端和服务端握手时如何进行身份验证。
消息认证算法:比如SHA1、SHA2、SHA3。主要用于消息摘要。
批量加密算法:比如AES,主要用于加密信息流。
伪随机数算法:例如TLS1.2的伪随机函数使用MAC算法的散列函数来创建一个主密钥——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。
在网络中,一次消息的传输一般需要在如下4个阶段分别进行加密,才能保证消息安全、可靠的传输。
握手/网络协商阶段:
在双方进行握手阶段,需要进行链接的协商。主要的加密算法包括RSA、DH、ECDH等
身份认证阶段:
身份认证阶段,需要确定发送的消息的来源来源。主要采用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA签名)等。
消息加密阶段:
消息加密指对发送的信息流进行加密。主要采用的加密方式包括DES、RC4、AES等。
消息身份认证阶段/防篡改阶段:
主要是保证消息在传输过程中确保没有被篡改过。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC:EllipticCurvesCryptography,椭圆曲线密码编码学。是一种根据椭圆上点倍积生成公钥、私钥的算法。用于生成公私秘钥。
ECDSA:用于数字签名,是一种数字签名算法。一种有效的数字签名使接收者有理由相信消息是由已知的发送者创建的,从而发送者不能否认已经发送了消息(身份验证和不可否认),并且消息在运输过程中没有改变。ECDSA签名算法是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。主要用于身份认证阶段。
ECDH:也是基于ECC算法的霍夫曼树秘钥,通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,并且是这种共享秘钥是为当前的通信暂时性的随机生成的,通信一旦中断秘钥就消失。主要用于握手磋商阶段。
ECIES:是一种集成加密方案,也可称为一种混合加密方案,它提供了对所选择的明文和选择的密码文本攻击的语义安全性。ECIES可以使用不同类型的函数:秘钥协商函数(KA),秘钥推导函数(KDF),对称加密方案(ENC),哈希函数(HASH),H-MAC函数(MAC)。
ECC是椭圆加密算法,主要讲述了按照公私钥怎么在椭圆上产生,并且不可逆。ECDSA则主要是采用ECC算法怎么来做签名,ECDH则是采用ECC算法怎么生成对称秘钥。以上三者都是对ECC加密算法的应用。而现实场景中,我们往往会采用混合加密(对称加密,非对称加密结合使用,签名技术等一起使用)。ECIES就是底层利用ECC算法提供的一套集成(混合)加密方案。其中包括了非对称加密,对称加密和签名的功能。
metacharset="utf-8"
这个先订条件是为了保证曲线不包含奇点。
所以,随着曲线参数a和b的不断变化,曲线也呈现出了不同的形状。比如:
所有的非对称加密的基本原理基本都是基于一个公式K=kG。其中K代表公钥,k代表私钥,G代表某一个选取的基点。非对称加密的算法就是要保证该公式不可进行逆运算(也就是说G/K是无法计算的)。*
ECC是如何计算出公私钥呢?这里我按照我自己的理解来描述。
我理解,ECC的核心思想就是:选择曲线上的一个基点G,之后随机在ECC曲线上取一个点k(作为私钥),然后根据kG计算出我们的公钥K。并且保证公钥K也要在曲线上。*
那么kG怎么计算呢?如何计算kG才能保证最后的结果不可逆呢?这就是ECC算法要解决的。
首先,我们先随便选择一条ECC曲线,a=-3,b=7得到如下曲线:
在这个曲线上,我随机选取两个点,这两个点的乘法怎么算呢?我们可以简化下问题,乘法是都可以用加法表示的,比如22=2+2,35=5+5+5。那么我们只要能在曲线上计算出加法,理论上就能算乘法。所以,只要能在这个曲线上进行加法计算,理论上就可以来计算乘法,理论上也就可以计算k*G这种表达式的值。
曲线上两点的加法又怎么算呢?这里ECC为了保证不可逆性,在曲线上自定义了加法体系。
现实中,1+1=2,2+2=4,但在ECC算法里,我们理解的这种加法体系是不可能。故需要自定义一套适用于该曲线的加法体系。
ECC定义,在图形中随机找一条直线,与ECC曲线相交于三个点(也有可能是两个点),这三点分别是P、Q、R。
那么P+Q+R=0。其中0不是坐标轴上的0点,而是ECC中的无穷远点。也就是说定义了无穷远点为0点。
同样,我们就能得出P+Q=-R。由于R与-R是关于X轴对称的,所以我们就能在曲线上找到其坐标。
P+R+Q=0,故P+R=-Q,如上图。
以上就描述了ECC曲线的世界里是如何进行加法运算的。
从上图可看出,直线与曲线只有两个交点,也就是说直线是曲线的切线。此时P,R重合了。
也就是P=R,根据上述ECC的加法体系,P+R+Q=0,就可以得出P+R+Q=2P+Q=2R+Q=0
于是乎得到2P=-Q(是不是与我们非对称算法的公式K=kG越来越近了)。
于是我们得出一个结论,可以算乘法,不过只有在切点的时候才能算乘法,而且只能算2的乘法。
假若2可以变成任意个数进行想乘,那么就能代表在ECC曲线里可以进行乘法运算,那么ECC算法就能满足非对称加密算法的要求了。
那么我们是不是可以随机任何一个数的乘法都可以算呢?答案是肯定的。也就是点倍积计算方式。
选一个随机数k,那么k*P等于多少呢?
我们知道在计算机的世界里,所有的都是二进制的,ECC既然能算2的乘法,那么我们可以将随机数k描述成二进制然后计算。假若k=151=10010111
由于2P=-Q所以这样就计算出了kP。这就是点倍积算法。所以在ECC的曲线体系下是可以来计算乘法,那么以为这非对称加密的方式是可行的。
至于为什么这样计算是不可逆的。这需要大量的推演,我也不了解。但是我觉得可以这样理解:
我们的手表上,一般都有时间刻度。现在如果把1990年01月01日0点0分0秒作为起始点,如果告诉你至起始点为止时间流逝了整1年,那么我们是可以计算出现在的时间的,也就是能在手表上将时分秒指针应该指向00:00:00。但是反过来,我说现在手表上的时分秒指针指向了00:00:00,你能告诉我至起始点算过了有几年了么?
ECDSA签名算法和其他DSA、RSA基本相似,都是采用私钥签名,公钥验证。只不过算法体系采用的是ECC的算法。交互的双方要采用同一套参数体系。签名原理如下:
在曲线上选取一个无穷远点为基点G=(x,y)。随机在曲线上取一点k作为私钥,K=k*G计算出公钥。
签名过程:
生成随机数R,计算出RG.
根据随机数R,消息M的HASH值H,以及私钥k,计算出签名S=(H+kx)/R.
将消息M,RG,S发送给接收方。
签名验证过程:
接收到消息M,RG,S
根据消息计算出HASH值H
根据发送方的公钥K,计算HG/S+xK/S,将计算的结果与RG比较。如果相等则验证成功。
公式推论:
HG/S+xK/S=HG/S+x(kG)/S=(H+xk)/GS=RG
在介绍原理前,说明一下ECC是满足结合律和交换律的,也就是说A+B+C=A+C+B=(A+C)+B。
这里举一个WIKI上的例子说明如何生成共享秘钥,也可以参考AliceAndBob的例子。
Alice与Bob要进行通信,双方前提都是基于同一参数体系的ECC生成的公钥和私钥。所以有ECC有共同的基点G。
生成秘钥阶段:
Alice采用公钥算法KA=ka*G,生成了公钥KA和私钥ka,并公开公钥KA。
Bob采用公钥算法KB=kb*G,生成了公钥KB和私钥kb,并公开公钥KB。
计算ECDH阶段:
Alice利用计算公式Q=ka*KB计算出一个秘钥Q。
Bob利用计算公式Q'=kb*KA计算出一个秘钥Q'。
共享秘钥验证:
Q=kaKB=ka*kb*G=ka*G*kb=KA*kb=kb*KA=Q'
故双方分别计算出的共享秘钥不需要进行公开就可采用Q进行加密。我们将Q称为共享秘钥。
在以太坊中,采用的ECIEC的加密套件中的其他内容:
1、其中HASH算法采用的是最安全的SHA3算法Keccak。
2、签名算法采用的是ECDSA
3、认证方式采用的是H-MAC
4、ECC的参数体系采用了secp256k1,其他参数体系参考这里
H-MAC全程叫做Hash-basedMessageAuthenticationCode.其模型如下:
在以太坊的UDP通信时(RPC通信加密方式不同),则采用了以上的实现方式,并扩展化了。
首先,以太坊的UDP通信的结构如下:
其中,sig是经过私钥加密的签名信息。mac是可以理解为整个消息的摘要,ptype是消息的事件类型,data则是经过RLP编码后的传输数据。
其UDP的整个的加密,认证,签名模型如下:
区块链密码算法是怎样的?
区块链作为新兴技术受到越来越广泛的关注,是一种传统技术在互联网时代下的新的应用,这其中包括分布式数据存储技术、共识机制和密码学等。随着各种区块链研究联盟的创建,相关研究得到了越来越多的资金和人员支持。区块链使用的Hash算法、零知识证明、环签名等密码算法:
Hash算法
哈希算法作为区块链基础技术,Hash函数的本质是将任意长度(有限)的一组数据映射到一组已定义长度的数据流中。若此函数同时满足:
(1)对任意输入的一组数据Hash值的计算都特别简单;
(2)想要找到2个不同的拥有相同Hash值的数据是计算困难的。
满足上述两条性质的Hash函数也被称为加密Hash函数,不引起矛盾的情况下,Hash函数通常指的是加密Hash函数。对于Hash函数,找到使得被称为一次碰撞。当前流行的Hash函数有MD5,SHA1,SHA2,SHA3。
比特币使用的是SHA256,大多区块链系统使用的都是SHA256算法。所以这里先介绍一下SHA256。
1、SHA256算法步骤
STEP1:附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448mod512),填充的比特数范围是1到512,填充比特串的最高位为1,其余位为0。
STEP2:附加长度值。将用64-bit表示的初始报文(填充前)的位长度附加在步骤1的结果后(低位字节优先)。
STEP3:初始化缓存。使用一个256-bit的缓存来存放该散列函数的中间及最终结果。
STEP4:处理512-bit(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64步迭代运算组成。每步都以256-bit缓存值为输入,然后更新缓存内容。每步使用一个32-bit常数值Kt和一个32-bitWt。其中Wt是分组之后的报文,t=1,2,...,16。
STEP5:所有的512-bit分组处理完毕后,对于SHA256算法最后一个分组产生的输出便是256-bit的报文。
作为加密及签名体系的核心算法,哈希函数的安全性事关整个区块链体系的底层安全性。所以关注哈希函数的研究现状是很有必要的。
2、Hash函的研究现状
2004年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了MD5算法的碰撞并给出了第一个实例(CollisionsforhashfunctionsMD4,MD5,HAVAL-128andRIPEMD,rumpsessionofCRYPTO2004,HowtoBreakMD5andOtherHashFunctions,EuroCrypt2005)。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。2005年王小云教授与其同事又提出了对SHA-1算法的碰撞算法,不过计算复杂度为2的63次方,在实际情况下难以实现。
2017年2月23日谷歌安全博客上发布了世界上第一例公开的SHA-1哈希碰撞实例,在经过两年的联合研究和花费了巨大的计算机时间之后,研究人员在他们的研究网站SHAttered上给出了两个内容不同,但是具有相同SHA-1消息摘要的PDF文件,这就意味着在理论研究长期以来警示SHA-1算法存在风险之后,SHA-1算法的实际攻击案例也浮出水面,同时也标志着SHA-1算法终于走向了生命的末期。
NIST于2007年正式宣布在全球范围内征集新的下一代密码Hash算法,举行SHA-3竞赛。新的Hash算法将被称为SHA-3,并且作为新的安全Hash标准,增强现有的FIPS180-2标准。算法提交已于2008年10月结束,NIST分别于2009年和2010年举行2轮会议,通过2轮的筛选选出进入最终轮的算法,最后将在2012年公布获胜算法。公开竞赛的整个进程仿照高级加密标准AES的征集过程。2012年10月2日,Keccak被选为NIST竞赛的胜利者,成为SHA-3。
Keccak算法是SHA-3的候选人在2008年10月提交。Keccak采用了创新的的“海绵引擎”散列消息文本。它设计简单,方便硬件实现。Keccak已可以抵御最小的复杂度为2n的攻击,其中N为散列的大小。它具有广泛的安全边际。目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。
KangarooTwelve算法是最近提出的Keccak变种,其计算轮次已经减少到了12,但与原算法比起来,其功能没有调整。
零知识证明
在密码学中零知识证明(zero-knowledgeproof,ZKP)是一种一方用于向另一方证明自己知晓某个消息x,而不透露其他任何和x有关的内容的策略,其中前者称为证明者(Prover),后者称为验证者(Verifier)。设想一种场景,在一个系统中,所有用户都拥有各自全部文件的备份,并利用各自的私钥进行加密后在系统内公开。假设在某个时刻,用户Alice希望提供给用户Bob她的一部分文件,这时候出现的问题是Alice如何让Bob相信她确实发送了正确的文件。一个简单地处理办法是Alice将自己的私钥发给Bob,而这正是Alice不希望选择的策略,因为这样Bob可以轻易地获取到Alice的全部文件内容。零知识证明便是可以用于解决上述问题的一种方案。零知识证明主要基于复杂度理论,并且在密码学中有广泛的理论延伸。在复杂度理论中,我们主要讨论哪些语言可以进行零知识证明应用,而在密码学中,我们主要讨论如何构造各种类型的零知识证明方案,并使得其足够优秀和高效。
环签名群签名
1、群签名
在一个群签名方案中,一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名。与其他数字签名一样,群签名是可以公开验证的,且可以只用单个群公钥来验证。群签名一般流程:
(1)初始化,群管理者建立群资源,生成对应的群公钥(GroupPublicKey)和群私钥(GroupPrivateKey)群公钥对整个系统中的所有用户公开,比如群成员、验证者等。
(2)成员加入,在用户加入群的时候,群管理者颁发群证书(GroupCertificate)给群成员。
(3)签名,群成员利用获得的群证书签署文件,生成群签名。
(4)验证,同时验证者利用群公钥仅可以验证所得群签名的正确性,但不能确定群中的正式签署者。
(5)公开,群管理者利用群私钥可以对群用户生成的群签名进行追踪,并暴露签署者身份。
2、环签名
2001年,Rivest,shamir和Tauman三位密码学家首次提出了环签名。是一种简化的群签名,只有环成员没有管理者,不需要环成员间的合作。环签名方案中签名者首先选定一个临时的签名者集合,集合中包括签名者。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的成员可能并不知道自己被包含在其中。
环签名方案由以下几部分构成:
(1)密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。
(2)签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。
(3)签名验证。验证者根据环签名和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。
环签名满足的性质:
(1)无条件匿名性:攻击者无法确定签名是由环中哪个成员生成,即使在获得环成员私钥的情况下,概率也不超过1/n。
(2)正确性:签名必需能被所有其他人验证。
(3)不可伪造性:环中其他成员不能伪造真实签名者签名,外部攻击者即使在获得某个有效环签名的基础上,也不能为消息m伪造一个签名。
3、环签名和群签名的比较
(1)匿名性。都是一种个体代表群体签名的体制,验证者能验证签名为群体中某个成员所签,但并不能知道为哪个成员,以达到签名者匿名的作用。
(2)可追踪性。群签名中,群管理员的存在保证了签名的可追
本文来自用户投稿,不代表币大大立场,如若转载,请注明出处:https://czxurui.com/jys/175932.html


发表回复
评论列表(0条)