密码库LibTomCrypt学习记录——(2.21)分组密码算法的工作模式——F8加密模式

本文主要是介绍密码库LibTomCrypt学习记录——(2.21)分组密码算法的工作模式——F8加密模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. F8

F8和F9用在3G安全中的是机密性算法(f8)和完整性算法(f9),两者都是基于KASUMI算法构造。f8是变形的OFB模式的序列密码;而f9则是变形CBC-MAC模式的消息认证码。

KASUMI算法是日本三菱的Matsui等人基于MISTY算法设计的分组密码。分组大小64bit,密钥长度128bit。由于算法内部大量的使用了16bit的运算,因此最适合16bit处理器实现。   

F8是以流密码的形式进行工作的,即源源不断的产生密码流,密钥流与密文异或就是加密,密钥流与密文异或就是解密。

  1. F8算法

输入

  1. COUNT         32 bit           计数器
  2. BEARER    5 bit       
  3. DIRECTION  1 bit         
  4. CK               128 bit         密钥
  5. LENGTH  *             加解密信息长度可以是 1 - 5114bit
  6. IBS         1-5114 bit    输入流

输出

  1. OBS        1-5114 bit         输出流

Step 1. 初始化

寄存器A = COUNT || BEARER || DIRECTION || 0…0 ,即末尾添加26bit的0

KM = 0x55555555555555555555555555555555 (128bit的密钥掩盖数)

KSB0 = 0

A = KASUM(A)CK XOR KM

Step 2. 密钥流的生成

BLOCKS = LENGTH/64的向上取整(为了使最后一个可能不完整的分组也能得到密钥流)

for(i = 1; i <= BLOCKS; i++ )

{

}

生成的密钥流为KS

KS[((n-1)*64)+i] = KSBn[i] , n = 1 … BLOCKS, i = 0 … 63 //bit级的表示

Step 3 加解密

for(i = 0; i <= LENGTH; i++ )

{

OBS[i] = IBS[i] XOR KS[i] //bit级的异或

}

F8的密钥流生成图如下

F8的密钥流生成图

  1. LibTomCrypt与F8

LibTomCrypt里的F8与3G文档里面的描述有些出入:

  1. 加密算法不一定使用KASUMI,比如其测试函数中使用的是AES。这样就使得分组大小不再是64bit,而是128bit。
  2. f8_start()函数里的输出值IV就是文档中的寄存器A的初始化值,即调用者需在调用f8_start()之前自行完成IV = A = COUNT || BEARER || DIRECTION || 0…0 。
  3. 初始化阶段,文档中的描述为A = KASUM(A)CK XOR KM,LibTomCrypt里面是加密A用的密钥不是CK XOR KM(KM = 0x55…55,128bit)而是CK XOR (salt||0x555…55),测试程序中的salt为32bit,链接的0x555…55为96bit

涉及信息如下:

F8的结构体是

typedef struct {

   int cipher;                      

   int blocklen;

   int padlen; /** The padding offset */

   unsigned char IV[MAXBLOCKSIZE],    // KSB_i 即最新得到的密钥流分组

   unsigned char MIV[MAXBLOCKSIZE]; // 寄存器 A,

   ulong32 blockcnt; // 分组计数器 同文档   /** Current block count */

   symmetric_key key;

} symmetric_F8;

相关函数有:

int f8_start( int cipher, const unsigned char *IV, const unsigned char *key, int keylen, const unsigned char *salt_key, int skeylen, int num_rounds, symmetric_F8 *f8);

int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8);

int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8);

int f8_getiv(unsigned char *IV, unsigned long *len, symmetric_F8 *f8);

int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8);

int f8_done(symmetric_F8 *f8);

int f8_test_mode(void);

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

int f8_start( int cipher, const unsigned char *IV, const unsigned char *key, int keylen, const unsigned char *salt_key, int skeylen, int num_rounds, symmetric_F8 *f8);

// [功能]   初始化F8

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

//备注:主要完成A = CIPHER(A)CK XOR KM,这里加密A用的密钥不是CK XOR KM(KM = 0x55…55,128bit)而是CK XOR (salt||0x555…55)

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

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

int f8_encrypt(const unsigned char *pt, unsigned char *ct, unsigned long len, symmetric_F8 *f8);

// [功能]   加密

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

//备注:由于采用的是流密码的工作方式,所以加密流程和解密流程一样,

//       关键流程在密钥流的生成

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

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

int f8_decrypt(const unsigned char *ct, unsigned char *pt, unsigned long len, symmetric_F8 *f8);

// [功能]   解密

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

//备注:由于采用的是流密码的工作方式,所以加密流程和解密流程一样,

//       关键流程在密钥流的生成

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

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

int f8_getiv(unsigned char *IV, unsigned long *len, symmetric_F8 *f8)

// [功能]   获取IV

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

//备注:-

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

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

int f8_setiv(const unsigned char *IV, unsigned long len, symmetric_F8 *f8)

// [功能]   设置IV值

// [返回]   0 [正常] or other [出错]

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

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

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

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

int f8_done(symmetric_F8 *f8)

// [功能]   完成F8

  1. f8                // [输入/输出] f8的状态

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

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

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

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

int f8_test(void);

// [功能]   测试函数

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

这篇关于密码库LibTomCrypt学习记录——(2.21)分组密码算法的工作模式——F8加密模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743875

相关文章

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

C#借助Spire.XLS for .NET实现Excel工作表自动化样式设置

《C#借助Spire.XLSfor.NET实现Excel工作表自动化样式设置》作为C#开发者,我们经常需要处理Excel文件,本文将深入探讨如何利用C#代码,借助强大的Spire.XLSfor.N... 目录为什么需要自动化工作表样式使用 Spire.XLS for .NET 实现工作表整体样式设置样式配置

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)