一种防重放攻击的加密方法转让专利

申请号 : CN201611140633.8

文献号 : CN106789997B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 杨成张楠吴晓雨朱亚平

申请人 : 中国传媒大学

摘要 :

本发明提供了一种防重放攻击的加密方法,包括:发送端设定当前时间戳及以时间戳为基准的有效时间段,在有效时间段内分别对明文及对应随机生成的第一随机数进行加密及发送,加密后的明文和第一随机数在以时间戳为基准的有效时间段内保持不变;接收端在时间段内接收并解密加密后的明文及与对应的第一随机数,其中,在以时间戳为基准的有效时间段内,将存储的仍在有效时间段内所有第一随机数与解密后的第一随机数一一比对,如果均不同则保存解密后的明文及对应的第一随机数并存储该解密后的第一随机数以及记录解密后的第一随机数的有效期;否则,删除解密后的第一随机数以及记录解密后的第一随机数的有效期。本发明可以防御重放攻击。

权利要求 :

1.一种防重放攻击的加密方法,包括:

发送端设定当前时间戳及以所述时间戳为基准的有效时间段,在所述有效时间段内分别对明文及对应随机生成的第一随机数进行加密及发送,加密后的明文和第一随机数在以所述时间戳为基准的有效时间段内保持不变;

接收端在所述时间段内接收并解密加密后的明文及与对应的第一随机数,其中,在以所述时间戳为基准的有效时间段内,将存储的仍在所述有效时间段内所有第一随机数与解密后的第一随机数一一比对,如果均不同则保存解密后的明文及对应的第一随机数并存储该解密后的第一随机数以及记录解密后的第一随机数的有效期;否则,删除解密后的第一随机数以及记录解密后的第一随机数的有效期;

其中,发送端对明文及对应随机生成的第一随机数进行加密进一步包括以下步骤:对初始密钥进行第一轮加密并取哈希值以获得第一密钥;

将当前时间戳和第一密钥组合后进行第二轮加密并取哈希值以获得第二密钥;

根据第二密钥生成第二随机数;

采用第一密钥对第二随机数进行加密以产生加密流;

采用所述加密流对明文及对应随机生成的第一随机数进行加密。

2.根据权利要求1所述的方法,其特征在于,将当前时间戳和第一密钥组合包括将当前时间戳附加于第一密钥后。

3.根据权利要求1或2所述的方法,其特征在于,所述发送端生成所述第一随机数进一步包括以下步骤:对第一随机量、当前时间戳和用户ID进行第一轮加密并取哈希值以获得第三密钥;

将第二随机量与第三密钥组合后进行第二轮加密并取哈希值以获得第四密钥;

根据第四密钥生成第三随机数;

采用第三密钥对第三随机数进行加密以产生所述第一随机数,所述第一随机数与明文一一对应并保持不变。

4.根据权利要求3所述的方法,其特征在于,将第二随机量与第三密钥组合包括将第二随机量附加在第三密钥后或第三密钥上。

5.根据权利要求1所述的方法,其特征在于,根据第二密钥生成第二机数进一步包括以下步骤:根据明文长度设定第一缓冲区长度和第二缓冲区长度,其中,所述第一缓冲区长度为四分之一明文长度,所述第二缓冲区长度为四分之一明文长度加上31字节;

基于所述第一缓冲区长度、PMMLCG算法和所述第二密钥生成第一中间随机数;

基于所述第二缓冲区长度、GFSRG算法和所述第二密钥生成第二中间随机数;

将所述第一中间随机数与所述第二中间随机数组合为新的随机数;

将所述新的随机数取整为整型数据,并与预设值循环进行按位与运算及移位后得到对应第二密钥的第二随机数。

6.根据权利要求5所述的方法,其特征在于,将所述第一中间随机数与所述第二中间随机数组合为新的随机数进一步包括以下步骤:将第二中间随机数的后四分之一明文长度个位置的值与第一中间随机数的四分之一明文长度个值分别取平均数相加或分别相加取平均数,以得到四分之一明文长度的新的随机数。

7.根据权利要求6所述的方法,其特征在于,将所述新的随机数取整为整型数据,并与预设值循环进行按位与运算及移位后得到第二随机数进一步包括以下步骤:将所述新的随机数取整为整型数据,并生成四分之一明文长度的缓冲区;

将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF000000做按位与,按位右移24比特,得到了对应所述四分之一明文长度的缓冲区的第1个值;

将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF0000做按位与,按位右移16比特,得到了对应所述四分之一明文长度的缓冲区的第2个值;

将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF00做按位与,按位右移8比特,得到了对应所述四分之一明文长度的缓冲区的第3个值;

将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF做按位与,得到了对应所述四分之一明文长度的缓冲区的第4个值;

将所述新的随机数取整后的整型数据的所有整型数据值分别循环与0xFF000000、

0xFF0000、0xFF00、0xFF做按位与并移位后赋值给四分之一明文长度的缓冲区以得到第二随机数。

8.根据权利要求1所述的方法,其特征在于,

发送端的当前时间戳设定为过去某一确定时刻至当前时刻经过的秒数;

所述有效时间段为当前时间戳为基准的一段时间,将所述当前时间戳以1为基准循环减小,直到减少的秒数为60m的整倍数,减少的秒数对应所述有效时间段,m为预设定的时间窗有效期。

9.根据权利要求1所述的方法,其特征在于,所述明文长度为16的整倍数。

说明书 :

一种防重放攻击的加密方法

技术领域

[0001] 本发明属于网络安全技术领域,具体地说,尤其涉及一种防重放攻击的加密方法。

背景技术

[0002] 1946年世界上出现了第一台电子计算机,互联网的雏形ARPANET也出现了几十年了,电子计算机和互联网经过了长足的发展,已经遍布全世界并具有数量众多的用户和网站以及其他应用。随着互联网的发展,网络安全问题也越来越严重。入侵与反入侵、网络攻击与防御措施愈演愈烈,互联网的安全时刻经受着考验。信息安全包含计算机安全与网络安全,而网络安全又包含很多方面:
[0003] 1、内容保护:主要是通过加密技术来实现,以防止非授权的访问;
[0004] 2、完整性保护:防止信息遭到篡改的技术;
[0005] 3、身份认证:能够认证用户的身份,防止未注册用户使用服务的技术;
[0006] 4、安全传输:如何建立安全传输通道的技术;
[0007] 5、权限管理:限制用户行为的技术,保障用户只在权限许可范围内申请服务。
[0008] 除此之外还有一些例如入侵检测和入侵防护等。安全是永无止境的,现在的网络安全现状对于安全技术提出了更高的要求。网络攻击有很多种形式,其中常见的有:
[0009] 1、中间人攻击:通过欺骗客户端与服务器,在客户端与服务器之间扮演一个“中间人”的角色而同时得到两方面的信息的攻击形式;
[0010] 2、重放攻击:通过使用其他方式得来的以前的消息伪装成正确的新鲜的消息来获取信息的攻击形式;
[0011] 3、密码猜测攻击:通过在线或离线的方式猜测用户的密码的攻击形式。
[0012] 重放攻击是最基本、最常用和危害性最大的一种攻击认证协议的形式。重放攻击也称为新鲜性攻击,即攻击者通过重放消息或消息片段达到对主体进行欺骗的攻击行为,其主要用于破坏认证正确性。在重放攻击的分析中我们假设认证协议使用的加密体制是安全的,即客户端与服务端之间使用密钥加密的消息是可靠的,攻击者无法解密出来。攻击者通过重放或者转发本回合中的消息或其它回合的消息进行攻击。重放攻击可以根据层次来分类:
[0013] 同一协议同一消息步同一消息块层次,攻击者可能使用相同的消息块(同一个协议或者不同的协议)伪装成正确的消息块来发起攻击。
[0014] 同一协议同一消息步不同消息块层次,攻击者可能利用同一消息步不同消息块间的相似性重用消息块来发起可能的攻击。
[0015] 同一协议不同消息步层次,攻击者可能利用不同消息步中消息块的相似性来发起重放攻击。这里的相似性包括消息内容的相似性和加密密钥的相似性。
[0016] 在协议间这个层次,攻击者可能会利用协议间的一些消息块的相似性来设计攻击协议,或者探寻协议本身的漏洞,从而实现重放攻击。
[0017] 上文的一些名词解释:
[0018] 协议:指的是通信协议,是客户端与服务端双方约定好的消息格式以及其他内容。
[0019] 消息步:指的是通信协议中的一步,也就是一条消息:从服务端发给客户端或者从客户端发给服务端的消息。
[0020] 消息块:指的是消息步中的具体分块,同一消息步中可能有明文、密文的消息块,也可能有加密密钥不同的消息块。
[0021] 攻击结果有下面的一些情况:
[0022] 1、攻击者冒充服务器用已知道会话密钥的旧消息发给申请密钥的实体,结果攻击者知道双方的会话密钥;
[0023] 2、攻击者冒充申请密钥实体的一方,用已知道会话密钥的旧消息去欺骗另一方,用冒充身份与另一方共享会话密钥;
[0024] 3、攻击者通过发起几个回合的申请密钥得到不同会话密钥的加密消息,然后重新组合不同会话密钥的加密消息发给申请会话密钥的实体,让申请密钥的双方得到的密钥不一致,达到攻击的效果;
[0025] 4、攻击者阻止一些消息,让申请密钥的一方认为他们的密钥申请成功,但另一方根本不知道,甚至完全没有参与,实现攻击。
[0026] 现有的对于重放攻击的防御方式主要有时间戳、随机数、消息计数几种。
[0027] 时间戳是一个代表当前时间的数字或者其他形式的数据,它的作用是标识这一条消息是什么时候发出的,而消息的接收端仅仅接收时间戳代表的时刻足够接近当前时刻的消息。它能够防御重放攻击的原理是重放的消息将远离当前时刻,通过时间戳的方式,就能够将正确的消息与重放消息区分出来。虽然这种方式要求通信的各方保持至少是相对宽松的时钟同步,但它仍然是广泛使用的防御重放攻击的手段。它简单有效,设置一个正确消息的时间窗口即可。但是如果重放的消息就在当前的时间窗口内,那么就要耗费比较大的代价去辨别正确与重放的消息了。
[0028] 随机数是使用随机数算法生成的,它的主要特点是无法预测、在较长时间内不会重复。它能够防御重放攻击的原理是由于它无法预测而且不会重复,那么重放的消息必定含有相同的随机数,利用这样的特性可以加以检测,就能够将正确的消息与重放消息区分出来。这种方式对于随机数算法的要求很高,而在实际应用的随机数算法中,无法预测、不会重复仅是理想情况,实际上仅能在一定程度上做到这一点。
[0029] 消息计数指的是对于同一协议中的每条消息/消息块都进行计数,通常是要求协议的另一方必须返回当前消息计数+1的消息计数,或者其他能够预测的有规律的消息计数。通过这种方式,与随机数类似,每条消息都是唯一的,就能够正确区分正确的消息与重放消息。这种方式的缺陷是很难在安全和维护代价之间找到平衡,安全则维护复杂,维护简单则安全性不足。
[0030] 目前的防重放攻击的方法与重放攻击有很多研究,但都有各自的缺陷,对于安全与运行、维护很难找到平衡,而且也不能完美地防御重放攻击。如果单独使用以上三种方法防御重放攻击,则它们都有各自的缺陷;联合使用虽然加强了安全性,却难以兼顾各方面的性能。虽然在一般环境下它们的安全性足够,但是对于安全要求严格的场合,它们就无法满足要求,这时候我们需要一种能够完美地防御重放攻击的系统。

发明内容

[0031] 为解决以上问题,本发明提供了一种防重放攻击的加密方法,用以防御重放攻击。
[0032] 根据本发明的一个实施例,提供了一种防重放攻击的加密方法,包括:
[0033] 发送端设定当前时间戳及以所述时间戳为基准的有效时间段,在所述有效时间段内分别对明文及对应随机生成的第一随机数进行加密及发送,加密后的明文和第一随机数在以所述时间戳为基准的有效时间段内保持不变;
[0034] 接收端在所述时间段内接收并解密加密后的明文及与对应的第一随机数,其中,在以所述时间戳为基准的有效时间段内,将存储的仍在所述有效时间段内所有第一随机数与解密后的第一随机数一一比对,如果均不同则保存解密后的明文及对应的第一随机数并存储该解密后的第一随机数以及记录解密后的第一随机数的有效期;否则,删除解密后的第一随机数以及记录解密后的第一随机数的有效期。
[0035] 根据本发明的一个实施例,所述发送端对明文及对应随机生成的第一随机数进行加密进一步包括以下步骤:
[0036] 对初始密钥进行第一轮加密并取哈希值以获得第一密钥;
[0037] 将当前时间戳和第一密钥组合后进行第二轮加密并取哈希值以获得第二密钥;
[0038] 根据第二密钥生成第二随机数;
[0039] 采用第一密钥对第二随机数进行加密以产生加密流;
[0040] 采用所述加密流对明文及对应随机生成的第一随机数进行加密。
[0041] 根据本发明的一个实施例,将当前时间戳和第一密钥组合包括将当前时间戳附加于第一秘钥后。
[0042] 根据本发明的一个实施例,所述发送端生成所述第一随机数进一步包括以下步骤:
[0043] 对第一随机量、当前时间戳和用户ID进行第一轮加密并取哈希值以获得第三密钥;
[0044] 将第二随机量与第三密钥组合后进行第二轮加密并取哈希值以获得第四密钥;
[0045] 根据第四密钥生成第三随机数;
[0046] 采用第三密钥对第三随机数进行加密以产生所述第一随机数,所述第一随机数与明文一一对应并保持不变。
[0047] 根据本发明的一个实施例,将第二随机量与第三密钥组合包括将第二随机量附加在第三秘钥后或第三秘钥上。
[0048] 根据本发明的一个实施例,根据第二密钥生成第二机数进一步包括以下步骤:
[0049] 根据明文长度设定第一缓冲区长度和第二缓冲区长度,其中,所述第一缓冲区长度为四分之一明文长度,所述第二缓冲区长度为四分之一明文长度加上31字节;
[0050] 基于所述第一缓冲区长度、PMMLCG算法和所述第二秘钥生成第一中间随机数;
[0051] 基于所述第二缓冲区长度、GFSRG算法和所述第二秘钥生成第二中间随机数;
[0052] 将所述第一中间随机数与所述第二中间数组合为新的随机数;
[0053] 将所述新的随机数取整为整型数据,并与预设值循环进行按位与运算及移位后得到对应第二密钥的第二随机数或对应第四密钥的第三随机数。
[0054] 根据本发明的一个实施例,将所述第一中间随机数与所述第二中间数组合为新的随机数进一步包括以下步骤:
[0055] 将第二中间随机数的后四分之一明文长度个位置的值与第一中间随机数的四分之一明文长度个值分别取平均数相加或分别相加取平均数,以得到四分之一明文长度的新的随机数。
[0056] 根据本发明的一个实施例,将所述新的随机数取整为整型数据,并与预设值循环进行按位与运算及移位后得到第二随机数进一步包括以下步骤:
[0057] 将所述新的随机数取整为整型数据,并生成四分之一明文长度的缓冲区;
[0058] 将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF000000做按位与,按位右移24比特,得到了对应所述四分之一明文长度的缓冲区的第1个值;
[0059] 将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF0000做按位与,按位右移16比特,得到了对应所述四分之一明文长度的缓冲区的第2个值;
[0060] 将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF00做按位与,按位右移8比特,得到了对应所述四分之一明文长度的缓冲区的第3个值;
[0061] 将所述新的随机数取整后的整型数据的第一个整型数据值与0xFF做按位与,得到了对应所述四分之一明文长度的缓冲区的第4个值;
[0062] 将所述新的随机数取整后的整型数据的所有整型数据值分别循环与0xFF000000、0xFF0000、0xFF00、0xFF做按位与并移位后赋值给四分之一明文长度的缓冲区以得到第二随机数。
[0063] 根据本发明的一个实施例,
[0064] 发送端的当前时间戳设定为过去某一确定时刻至当前时刻经过的秒数;
[0065] 所述有效时间段为当前时间戳为基准的一段时间,将所述当前时间戳以1为基准循环减小,直到减少的秒数为60m的整倍数,减少的秒数对应所述有效时间段,m为预设定的时间窗有效期。
[0066] 根据本发明的一个实施例,所述明文长度为16的整倍数。
[0067] 本发明的有益效果:
[0068] 本发明提出了一种简便快速的防重放攻击的加密方法,能够轻易内嵌到整个通信系统内部,在增加了防重放攻击功能的同时减少对于整个通信系统其他部分的负担,使防重放攻击系统透明化、简单化,整个通信系统仅需要付出少量代价就可以实现完美防重放攻击的安全性需求。
[0069] 本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

[0070] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要的附图做简单的介绍:
[0071] 图1是根据本发明的一个实施例的系统流程示意图;
[0072] 图2是根据本发明的一个实施例的防重放攻击的加密方法流程图;
[0073] 图3是根据本发明的一个实施例的发送端对明文进行加密的流程示意图;
[0074] 图4是根据本发明的一个实施例的发送端产生第一随机数进的流程示意图。

具体实施方式

[0075] 以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本发明中的各个实施例以及各实施例中的各个特征可以相互结合,所形成的技术方案均在本发明的保护范围之内。
[0076] 本发明基于AES加密系统的CTR加密模式,安全性在该加密系统的基础上得到保障。如图1所示为根据本发明的一个实施例的流程示意图,如图1所示,首先由要发送的明文消息和由随机值生成方法生成的随机值组成新的明文消息,再由加密方法加密新的明文消息以得到密文消息,最后将密文消息发送出去。随机值生成方法由加密方法衍生,步骤是类似的。在本发明中,在对明文和随机值加密时引入时间戳,会使重放消息的特征更容易辨认,从而提高防重放攻击的安全性。
[0077] 图2是根据本发明的一个实施例的防重放攻击的加密方法流程图,以下参考图2来对本发明进行详细说明。设定输入的密钥长度为n字节,可以容忍的消息时间窗为m,单位为分钟,明文长度为length,由于加密算法的特性,length必须是16的整数倍。
[0078] 首先,在步骤S110中,发送端设定时间戳及以该时间戳为基准的有效时间段,在该有效时间段内分别对明文及对应随机生成的第一随机数进行加密及发送,其中,加密后的明文和第一随机数在以该时间戳为基准的有效时间段内保持不变。
[0079] 具体的,时间戳为发送端主机当前的时间戳,为一数值,表示过去某一确定时刻开始至当前时刻经过的秒数。有效时间段是以当前时间戳为基准的一段时间。例如,当前时间戳可以表示为从1970年1月1日00:00到现在时刻经过的秒数。有效时间段以该时间戳起始,以1为基准循环减小,直到减少的秒数对应的时间段为60m的整倍数,m为预设定的时间窗有效期,单位为分钟。这样,每过60m秒,也就是m分钟,处理过的时间戳就会变化,称这个处理过的时间戳为timestamp。
[0080] 在该有效时间段内,发送端对明文及对应的第一随机数进行加密,其加密过程如图3所示,包括以下的几个步骤。
[0081] 首先,对初始密钥进行第一轮加密并取哈希值以获得第一密钥。具体的,输入初始秘钥进行第一轮加密,然后取第一轮加密后的哈希值,可以获得第一秘钥。该第一轮加密过程包括扩展、叠加和轮转三个步骤。第一轮的处理缓冲区长度建议至少为30n字节或以上,n表示秘钥字节长度。
[0082] 扩展步骤指的是将输入的n个字节复制、粘贴到整个缓冲区,直到刚好不溢出为止。
[0083] 叠加步骤指的是将每n个字节独立出来(即输入的n字节密钥),循环地,把每个字节都加到这个字节之后的第2、第3、第5、第7个字节上,如果第2、第3、第5或第7个字节超出了n字节的范围,那么就循环到n字节的开头。例如,n=30,第3个字节将会加到第5、第6、第8、第10个字节上,而第29个字节将会加到第1、第2、第4、第6个字节上。如果相加的结果超出了数据类型的范围,那么就改为相减。
[0084] 轮转步骤指的是将每n个字节独立出来,根据这n个字节在缓冲区的位置,如果它处于缓冲区第a位置,那么就将这n个字节内部的每个字节向右移动a个字节的位置。如果移动的结果超出了n个字节的范围,那么就将超出的字节转移到n个字节的开头。例如n=30,它是缓冲区第22个n=30的区域,那么就将第1个字节向右移动22个字节,变为第23个字节,第2个字节将变为第24个字节;而第10个字节将变为2个字节,第25个字节将变为第17个字节,余此类推。
[0085] 第一轮循环执行叠加和轮转步骤,直到每个n字节区域都处理过一遍为止。然后对整个缓冲区求hash_256,得到256比特的hash值,即32字节,正好作为aes_256的加密密钥,称其为hash_1(第一密钥)。
[0086] 接着,将当前时间戳和第一密钥组合后进行第二轮加密以获得第二密钥。具体的,将这个时间戳附加在hash_1的后面,形成第一中间密钥。将这个第一中间密钥重新经过与第一轮加密类似的第二轮加密处理,即也经过扩展、叠加、轮转之后,对整个缓冲区求hash_256,得到256比特的hash值,称其为hash_2(第二密钥)。需要注意的是第二轮加密后的哈希值需要有足够的长度。
[0087] 接着,根据第二密钥生成第二随机数。本发明采用PMMLCG随机数生成器与GFSRG随机数生成器来生成随机数,选择两个随机数生成器是因为这两个随机数生成器共需要32个种子来生成随机数序列,这恰好是hash_2的长度。其中,PMMLCG需要1个种子,GFSRG需要31个种子。在进行以下的步骤时,优选的,对于负值的hash_2选取对应的正值,以使其所有的值都是正的。
[0088] 具体的,首先根据明文长度设定第一缓冲区长度和第二缓冲区长度,其中,第一缓冲区长度为四分之一明文长度,第二缓冲区长度为四分之一明文长度加上31字节。
[0089] 然后,基于第一缓冲区长度、PMMLCCG算法和第二秘钥生成第一中间随机数。具体的,首先生成一个length/4长度的缓冲区,在经典的PMMLCG算法下,第一缓冲区的类型是double。将第一缓冲区第1个位置的值强制赋值为hash_2第一个字节。之后定义一个中间变量double类型的k,然后循环地,将第i个位置的值乘以16807并将结果赋值给k,而将其后的第i+1位置的值赋值为k对2147483647求余的结果。这里,i从第一个位置开始,循环到length/4-1的位置。这样,所有的length/4长度的缓冲区都有了赋值,将这个缓冲区命名为p[length/4],缓冲区中的数值为第一中间随机值。此处的位置对应Double类型位置,即第i个double类型值对应第i位置。
[0090] 然后,基于第二缓冲区长度、GFSRG算法和第二秘钥生成第二中间随机数。具体的,首先生成一个length/4+31长度的缓冲区,在经典的GFSRG算法下,第二缓冲区的类型是double。而后,将缓冲区的第1个位置的值赋值为:首先将中间变量double类型的k赋值为hash_2的第2个字节乘以16519104,再将第1个位置的值赋值为k对2147483647求余的结果。而第2个位置的值将被赋值为:首先将k赋值为hash_2第3个位置的值乘以16519104,再将第
2个位置的值赋值为k对2147483647求余的结果。余此类推,直到用完hash_2中的所有值。这样,缓冲区的前31个位置都被赋值过了。然后,循环地,将第32个位置的值赋值为第1个位置的值按位异或第16个位置的值,将第33个位置的值赋值为第2个位置的值按位异或第17个位置的值,余此类推,直到所有的缓冲区的值都被赋值过了。将这个缓冲区命名为g[length/4+31],缓冲区中的数值为第二中间随机值。
[0091] 然后,将第一中间随机数与第二中间数组合为新的随机数。具体的,将第二中间随机数的后四分之一明文长度个位置的值与第一中间随机数的四分之一明文长度个值分别取平均数,以得到四分之一明文长度的新的随机数。例如,将g[length/4+31]的后length/4个位置的值与p[length/4]的length/4个值分别取平均数相加或分别相加取平均就得到了一个长度是length/4的新缓冲区,命名为c[length/4]。
[0092] 然后,将新的随机数取整为int类型数据(即整型数据),并与预设值循环进行按位与运算及移位后得到第二随机数。如今绝大部分计算机的int类型都是4个字节的长度,所以将c[length/4]取整变为int类型之后,可以生成length长度的新缓冲区k[length]。将c[length/4]的第一个int类型值与0xFF000000做按位与,之后按位右移24比特,这样就得到了k[length]的第1个值;将c[length/4]的第1个int类型值与0xFF0000做按位与,之后按位右移16比特,这样就得到了k[length]的第2个值;将c[length/4]的第1个int类型值与0xFF00做按位与,之后按位右移8比特,这样就得到了k[length]的第3个值;将c[length/4]的第1个int类型值与0xFF做按位与,这样就得到了k[length]的第4个值;余此类推,每个c[length/4]的值都会赋值给4个k[length]的值,循环直到c[length/4]的值耗尽,这样每个k[length]都有了赋值。
[0093] 接着,采用第一密钥对第二随机数进行加密以产生加密流。具体的,以hash_1为aes_256的加密密钥,对k[length]做循环加密,直到所有的k[length]都被加密过了,这样就得到了真正用于明文加密的加密流。
[0094] 最后,采用加密流对明文及对应的第一随机数进行加密。具体的,使用length长度的加密流和length长度的明文和length长度的第一随机数,对它们做按位异或,就得到了length长度的明文密文和length长度的第一随机数密文。
[0095] 在该有效时间段内,发送端还需预先生成第一随机数,其生成过程如图4所示,具体包括以下几个步骤。
[0096] 首先,对第一随机量、当前时间戳和用户ID进行第一轮加密并取哈希值以获得第三密钥。其第一轮加密过程与对明文的第一轮加密相同,此处不加赘述。快速随机算法或者变化足够快的其他量这一部分可以取自系统本身生成的随机量,如linux系统中的/dev/random与/dev/urandom,或者clock函数,将该变量作为第一随机量。这一部分的输入要求是特异性,保证不同用户、同一用户不同时刻的输入不同。
[0097] 然后,将第二随机量与第三密钥组合后进行第二轮加密并取哈希值以获得第四密钥。第二随机量(其他随机因素)对随机性要求较低,使用C语言的rand函数体系即可。将生成的随机数或随机值附加在第三密钥后面或者加在第三密钥的值上。之后再进入第二轮。
[0098] 然后,根据第四密钥生成第三随机数,采用第三密钥对第三随机数进行AES加密以产生第一随机数。第三随机数生成过程与第二随机数相同,此处不加赘述。
[0099] 第二随机数在以时间戳为基准的有效时间段保持不变,如超出该时间段,第二随机数发生变化,导致加密后的明文和第一随机数发生变化。由第三随机数产生的第一随机数在发送端仅在消息发送前生成一次并固定不变,作为此条消息的唯一标识。第一随机数的有效时间段与第二随机数相同。
[0100] 在步骤S120中,接收端在有效时间段内接收并解密加密后的明文及对应的第一随机数,其中,在以时间戳为基准的有效时间段内,将存储的仍在有效时间段内所有第一随机数与解密后的第一随机数一一比对,如果均不同则保存解密后的明文及对应的第一随机数并存储该解密后的第一随机数以及记录解密后的第一随机数的有效期;否则,删除解密后的第一随机数以及记录解密后的第一随机数的有效期。
[0101] 具体的,首先在以时间戳为基准的有效时间段内(消息的有效时间段)取出数据库中存储的仍在有效时间段内(每个存储的第一随机数的有效时间段)的所有第一随机数,与解密后的第一随机数一一比对,如果均不同则保存解密后的明文及对应的第一随机数并存储该解密后的第一随机数以及记录解密后的第一随机数的有效期;否则,删除解密后的第一随机数以及记录解密后的第一随机数的有效期。
[0102] 接收端在有效时间段内接收并能够解密加密后的明文及对接的第一随机数,如超出该有效时间段,则加密的明文和对应的第一随机数均发生改变,接收端无法对超出有效时间段的密文进行解密。
[0103] 具体来说,本发明的工作流程是这样的:
[0104] 首先某用户输入用户id,使用随机数生成算法生成了一个高随机性的随机值,将其与明文消息连接,并使用加密算法对其进行加密,得到密文消息,发送给服务器;服务器收到之后,只要它在规定的时间窗m分钟内,就可以正确解密,否则解密将得不到正确结果;解密之后将用户发来的随机值存入数据库,并设置m分钟的有效期,数据库的守护程序会根据有效期删除随机值。服务器发给用户的流程也是类似的,使用发送消息的用户id生成随机值,之后加密发给用户。消息只有在有效期内才能够正确解密。
[0105] 本发明可以以较低的代价实现完美的防重放功能。在实现了防重放功能的基础上,还兼顾了速度与维护,在整体的安全和运行速度、维护上较好地实现了平衡。由于消息在时间窗之外就会失效(处理过的时间戳过了时间窗就会变化,而导致密文完全不同),无法解密,这样数据库只要存储仍在时间窗内的用户发来的随机数/随机值就可以了。当用户发来新消息时,服务器检测数据库中是否有重复的随机数/随机值,由于随机数生成算法的高随机性、特异性,生成的随机数/随机值重复的可能性极小,因此只要新消息中包含的随机数/随机值是数据库中已有的,就可以判定其为重放消息,而新鲜的消息包含的随机数/随机值总是不会重复的,即使能够重复,在同一时间窗内出现重复的可能性也是极小的。而之前超出了时间窗的消息,由于加密算法的时间因素,是完全失效的,不可能用来发起重放攻击。基于这样的原理,本发明利用加入时间因素的加密方法与衍生的随机值生成方法,完美地实现了防重放的同时,极大地降低了数据库需要维护的随机值数量,增强了整个系统的安全的同时较小地减慢了系统运行速度。本发明对于对通信速度要求不严格与能够实现大致时间同步、同时用户数量不是非常大的系统非常适用。
[0106] 虽然本发明所公开的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所公开的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。