密码库LibTomCrypt学习记录——(2.19)分组密码算法的工作模式——LRW磁盘加密模式

本文详细介绍了LRW磁盘加密模式,一种基于AES的可调密码块加密技术。文章探讨了LRW的加密和解密过程,涉及到有限域GF(2^128)的运算,并对比了LRW与XTS-AES的区别。此外,还深入解析了LibTomCrypt中LRW的实现细节,包括结构体定义和关键函数的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. LRW

LRW算法的相关信息是通过分析LibTomCrypt的LRW得到。LRW也是一种磁盘加密模式。IEEE P1619在2006前使用的还是LRW-AES模式,但在2006年后,由于某些安全原因,LRW-AES被XTS-AES代替。具体情况可以在IEEE的官方网站上查询。LRW是可调密码(tweakable block cipher)。

LRW也用到了有限域GF(2^128),生成多项式和GCM一样是

f(x) = x^128+x^7+x^2+x^1+x^0

  1. 加密

输入

[输入] Key 密钥

[输入] P   明文

[输入] IV 输出化向量

[输入] tweak  调整值

[输出] C        密文

步骤:

1. P = P0 || P1 || P2 || …… || Pn  Pn已将最后一个分组填充为128bit(填充方式未知)

2. for ( int i = 0; i <= n; i++ ){

         

}

注意

  1. +是普通的加法;
  2. 是GF(2^128)上的加法,即异或;
  3. 是GF(2^128)上的乘法

解密和加密类似,只是将Ek改为Dk。

  1. 实现上的调整与优化

为加速运算,实现中对

;

调整为

;

前面一项在预计算阶段就可以计算出来并赋给pad。的做法是每次++pad后再与tweak乘。且此乘法可以采用查表的方式加速。查表方式与XTS一样。

  1. TomLibCrypt与LRW

LRW的结构体是

typedef struct { // 记录LRW的信息的结构体

int                    cipher;              // 密码算法索引值,128bit分组密码

unsigned char    IV[16],              // iv 值

tweak[16],         // tweak 值

                     pad[16];           // pad = ( iv + i )  tweak

    symmetric_key      key;             // 扩展密码

#ifdef LRW_TABLES// 如果采用查表法加速运算

    unsigned char   PC[16][256][16];    // 乘法用的查表

#endif

} symmetric_LRW;

涉及函数包括:

int lrw_start( int cipher, const unsigned char *IV, const unsigned char *key, int keylen, const unsigned char *tweak, int  num_rounds, symmetric_LRW *lrw);

int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw);

int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw);

int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw);

int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw);

int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw);

int lrw_done(symmetric_LRW *lrw);

int lrw_test(void);

──────────────────────────────────────

int lrw_start( int cipher, const unsigned char *IV, const unsigned char *key, int keylen, const unsigned char *tweak, int  num_rounds, symmetric_LRW *lrw)

// [功能]   初始化LRW

  1. cipher           // [输入] 密码算法
  2. IV                // [输入] 初始值
  3. key                   // [输入] 密钥
  4. keylen          // [输入] 密钥长度
  5. tweak           // [输入] 调整值
  6. num_rounds      // [输入] 密码算法工作轮数(建议设置为0以使用默认的AES轮数)
  7. lrw               // [输入/输出]LRW状态

//备注:主要做以下几件事情

// 1. 密钥扩展

// 2. 生成tweak的表

// 3. 计算 iv * tweak

──────────────────────────────────────

──────────────────────────────────────

int lrw_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_LRW *lrw);

// [功能]   加密

  1. pt                // [输入]明文
  2. ct                // [输出]密文
  3. len               // [输入]明密文长度
  4. lrw               // [输入/输出] LRW状态

//备注:实际调用的是既可以做加密又可以做解密的lrw_process

──────────────────────────────────────

──────────────────────────────────────

int lrw_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_LRW *lrw);

// [功能]   解密

  1. ct                // [输入] 密文
  2. pt                // [输出] 明文
  3. len               // [输入] 明密文长度
  4. lrw               // [输入/输出]LRW的状态

//备注:实际调用的是既可以做加密又可以做解密的lrw_process

──────────────────────────────────────

──────────────────────────────────────

int lrw_process(const unsigned char *pt, unsigned char *ct, unsigned long len, int mode, symmetric_LRW *lrw);

// [功能]   加密/解密

  1. pt                // [输入/输出]明文(加密时为输入,解密时为输出)
  2. ct                // [输入/输出]密文(加密时为输出,解密时为输入)
  3. len               // [输入]明密文长度
  4. mode           // [输入] LRW_ENCRYPT表示加密, LRW_DECRYPT表示解密
  5. lrw               // [输入/输出] LRW状态

//备注:实际调用的是既可以做加密又可以做解密的lrw_process

──────────────────────────────────────

──────────────────────────────────────

int lrw_getiv(unsigned char *IV, unsigned long *len, symmetric_LRW *lrw);

// [功能]   获取IV

  1. IV                // [输出] 初始化向量
  2. len               // [输出] IV长度
  3. lrw               // [输入/输出]LRW的状态

//备注:获取的IV值就是在lrw_start 或者lrw_setiv中设置的IV值

──────────────────────────────────────

──────────────────────────────────────

int lrw_setiv(const unsigned char *IV, unsigned long len, symmetric_LRW *lrw);

// [功能]   设置IV值

  1. IV                // [输入] 初始化向量
  2. len               // [输入] IV长度
  3. lrw               // [输入/输出]LRW的状态

//备注:主要用在仅改变IV值,而key不变的情况下

──────────────────────────────────────

──────────────────────────────────────

int lrw_done(symmetric_LRW *lrw);

// [功能]   完成LRW

  1. xts               // [输入/输出]XTS的状态

//备注:调用算法的done(), 但AES中done()未作任何事情

//建议最好是销毁密钥相关敏感信息

──────────────────────────────────────

──────────────────────────────────────

int lrw_test(void);

// [功能]   测试函数

──────────────────────────────────────

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值