热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

密码库LibTomCrypt学习记录——(2.29)分组密码算法的工作模式——KeyWrap密钥封装模式

密钥封装(KeyWrap)密钥封装是为了对密钥进行保护,比如密钥存储在不太安全的存储设备中,或者密钥需要在网络中传输。早在2001年,
  1. 密钥封装(Key Wrap)

密钥封装是为了对密钥进行保护,比如密钥存储在不太安全的存储设备中,或者密钥需要在网络中传输。

早在2001年,NIST就发布了AES Key Wrap Specification。2002年,IETF在RFC 3394中也描述了密钥封装算法AES-KeyWrap Algorithm,电信行业协会发布了使用TDES的密钥封装算法。2008年,美国标准认可委员会(Accredited Standards Committee X9, Inc.)发布了金融服务业的密钥封装算法。2009年,RFC 5649 描述了带填充的密钥封装算法。 2012年,NIST SP 800-38F描述了AES KW、AES KWP(带填充的密钥封装算法)和TDES的TKW。

NIST的这三个算法和RFC等的描述几乎完全一致。

     以下描述以NIST SP 800-38F为主,结合RFC 3394和RFC 5649。

     参考文献

  1. Key Wrap - Wikipedia, the free encyclopedia, http://en.wikipedia.org/wiki/Key_Wrap
  2. NIST Special Publication 800-38F: Recommendation for Block Cipher Modes of Operation Methods for Key Wrapping, December 2012.
  3. J. Schaad and R. Housley, Advanced Encryption Standard (AES) Key Wrap Algorithm, RFC 3394, September, 2002.
  4. R. Housley and M. Dworkin, Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm, RFC 5649, August, 2009.
  5. ANSI/TIA-102.AACA-1-2002: Project 25 – Digital Radio Over-the-Air-Rekeying (OTAR) Protocol: Addendum 1 – Key Management Security Requirements for Type 3 Block Encryption Algorithms, Telecommunications Industry Association, November, 2002.
  6. ANS X9.102-2008, Symmetric Key Cryptography For the Financial Services Industry—Wrapping of Keys and Associated Data, Accredited Standards Committee X9, Inc., June, 2008.

  1. 密钥封装有三种

  1. KW          基于AES的密钥封装,不使用填充。
  2. KWP   基于AES的密钥封装,使用填充。
  3. TKW   基于TDES的密钥封装,不使用填充。

算法

明文

密文

使用模块

KW

2—254-1个64bit长

3—254个64bit长

W和W-1

KWP

1—232-1个8bit长

2—232个8bit长

W和W-1

TKW

2—228-1个32bit长

3—228个32bit长

TW和TW-1


  1. W

C = W(S)模块

准备:

  1. K(即KEK)
  2. 128-bit 分组密码CIPH.

输入:

  1. S,长度为n×64bit,n ≥ 3.

输出

  1. C,与S等长(长度为n×64bit,n ≥ 3)。

步骤

1. 初始化

s = 6(n-1).

S=S1 || S2 ||… || Sn . Si都是64it

A0 = S1.

For i = 2, …, n

R0i = Si.

2. 迭代

For t = 1, …, s

          At = MSB64(CIPHK(At-1 || R2t-1)) ⊕ [t]64;

          For i = 2, …, n-1:

Rit = Ri+1t-1;

          Rnt = LSB64(CIPHK (At-1 || R2t-1)).

3. 输出结果

C1 = As.

For i = 2, …, n

Ci = Ris.

Return C1 || C2 || … || Cn.

W的示意图如下

W的示意图

W中迭代器的示意图如下:

W中迭代器的示意图

  1. W-1

S = W-1(C)模块

准备:

  1. K(即KEK)
  2. 128-bit 分组密码CIPH的逆函数CIPH-1

输入:

  1. C,长度为n×64bit,n ≥ 3.

输出

  1. S,与c等长(长度为n×64bit,n ≥ 3)。

步骤

1. 初始化

s = 6(n-1).

C = C1 || C2 ||… || Cn . Ci都是64bit

As = C1.

For i = 2, …, n

Rsi = Ci.

2. 迭代

For t = s, …, 1

          At-1 = MSB64((CIPH-1K(At ⊕[t]64)) || Rnt);

R2t-1 = LSB64(CIPH-1K ((At ⊕[t]64) || Rnt).

          For i = 2, …, n-1:

Ri+1t-1 = Rit ; 

3. 输出结果

S1 = A0.

For i = 2, …, n

Si = Ri0.

Return S1 || S2 || … || Sn.

 

  1. KW

KW的加密KW-AE(P)和解密KW-AD(C)。

加密C = KW-AE(P)

输入:明文P

输出:密文C

1. ICV1 = 0xA6A6A6A6A6A6A6A6.

2. S = ICV1 || P.

3. Return C = W(S).

解密P = KW-AD(C)

输入:密文C

输出:明文P或者失败

1. ICV1 = 0xA6A6A6A6A6A6A6A6.

2. S = W-1(C).

3. If MSB64(S) ≠ICV1, return FAIL and stop.

4. Return P = LSB64(n-1)(S).

RFC 3394KW采用一种便于软件实现的描述方式。

输入:

  1. 明文 P = P1||P2||...||Pn,n个64-bit
  2. 密钥 K (KEK).

输出:

  1. 密文 C = C0||C1||...||Cn,(n+1)个64-bit

步骤

1)  A = IV, IV = 0xA6A6A6A6A6A6A6A6

    For i = 1 to n, R[i] = P[i]

2)  For j = 0 to 5 {

        For i=1 to n {

            B = AES(K, A || R[i])

            A = MSB(64, B) ⊕ t,其中t = (n*j)+i

            R[i] = LSB(64, B)

        }//i

    }//j

3)  C[0] = A

For i = 1 to n, C[i] = R[i]

Return C = C[0] || C[1] || ... || C[n]

  1. KWP

带填充的KW加密KWP-AE(P)和带填充的KW解密KWP-AD(C)。

加密C = KWP-AE(P)

输入:明文P

输出:密文C

1. ICV2 = 0xA65959A6.

2. 

3. PAD = 08×padlen

4. S = ICV2 || [len(P)/8]32 || P || PAD

5.  If len(P) ≤ 64,   return C = CIPHK(S);

else,            return C = W(S). 

这里的padlen是指将明文P填充为64bit的整数倍时需要填充(填充数据为全零字节)的最短字节数,可以为0。消息S表示在填充后消息的前面再加64比特的特殊消息,以保证S长度最少为一个分组大小(128bit)。如果S长度只有一个分组大小,则直接执行AES。

解密P = KW-AD(C)

输入:密文C,C = C1||C2||...||Cn, n个64-bit

输出:明文P或者失败

1.  ICV2 = 0xA65959A6.

2. If n = 2, S = CIPH-1K(C); if n > 2, S = W-1(C).

3. If MSB32(S) ≠ ICV2, return FAIL and stop.

4.  Plen = int(LSB32(MSB64(S))).

5. padlen = 8(n-1)-Plen.

6. If padlen <0 or padlen > 7, return FAIL and stop.

7. If LSB8×padlen(S) ≠ 08×padlen, return FAIL and stop.

8. Return P &#61; MSB8×Plen(LSB64×(n-1)(S)).

  1. TKW

这个和KW其实是一样的&#xff0c;只有一下几个地方有区别&#xff1a;

  1. 使用的密码算法不一样&#xff1a;KW采用AES&#xff1b;TKW采用TDES
  2. 分组大小不一样导致半分组大小不一样&#xff1a;KW半分组大小64bit&#xff1b;TKW半分组大小32bit。

详细流程可辅助参见KW。

注意&#xff1a;TKW没有加填充的所谓TKWP算法。

  1. 测试数据

NIST SP 800-38F里面没有测试数据&#xff1b;测试数据可以在RFC 3394和RFC 5649里面查。

LibTomCrypt目前尚不支持KeyWrap。


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
author-avatar
bj_gqdy_342
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有