热门标签 | 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。


推荐阅读
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
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社区 版权所有