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


推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文探讨了在使用Azure Active Directory进行用户身份验证时,结合AddAuthentication和RequireAuthenticatedUser的必要性及其潜在冗余问题。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文介绍了如何通过配置 Android Studio 和 Gradle 来显著提高构建性能,涵盖内存分配优化、并行构建和性能分析等实用技巧。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
  • 本文探讨了高质量C/C++编程的最佳实践,并详细分析了常见的内存错误及其解决方案。通过深入理解内存管理和故障排除技巧,开发者可以编写更健壮的程序。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
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社区 版权所有