Linux内核密码模块

目录

密码算法介绍

Hash摘要算法

Cipher加解密算法

块密码算法

认证算法 MAC和HMAC

AEAD算法

Linux内核密码模块的基本构件

Linux内核密码模块介绍

如何使用Linux密码模块

用户层调用Linux内核密码模块的方法

cryptodev

AF_ALG

如何开发一个密码引擎驱动

开发一个密码引擎驱动的流程

以cbc(aes)算法为例的实际代码示例


密码算法介绍

密码算法主要是为了保护双方或者多方的通信,涉及到保密性、完整性和可认证性

Hash摘要算法

Hash或Digest是属于完整性,根据指定输入得到“唯一”校验值,比如SHA1,MD5,等等。

针对HASH算法的三个标准:

1、尽可能少的碰撞出相同的摘要值

2、不可能根据摘要值重新生成原数据

3、一个小的修改就能生成完成不同的摘要值

Cipher加解密算法

要求使用一组或者几组数据来加密/解密数据

Cipher算法可以分为流密码算法和块密码算法,还可以分为对称密码算法和非对称密码算法。

其中流密码算法是对一串流数据加密,块密码算法需要限定数据大小的数据块;

其中对称密码算法是指加解密都使用相同的密钥,非对称密码算法加密使用公钥,解密使用私钥。有AES,RSA算法等

块密码算法

块密码算法只能对一小块数据进行加解密,我们需要找个方法来处理任意长度的数据,大部分的块密码算法都要求有Initialization Vector(IV)来混淆加密数据。此算法模式有ECB,CBC等。

认证算法 MAC和HMAC

MAC代表消息认证码,用来认证发送者消息的机制,使用一组密钥和转化算法来生成认证码,使用HASH算法就叫HMAC。

AEAD算法

AEAD算法表示对数据进行认证加密,把认证,加密和摘要一步完成。

Linux内核密码模块的基本构件

Linux内核密码模块介绍

Linux密码模块的基本构件主要为两个结构体:struct crypto_alg和struct crypto_tfm。支持所有的算法,比如Cipher(加解密)、Hash(摘要)、AEAD(链式)、HMAC(认证)和Compression(解压缩)。

密码算法可以用一个基本算法构建的模块来表示,比如hmac(sha1)表示用SHA1摘要实现的HMAC算法,cbc(aes)表示使用AES的CBC模式,authenc(hmac(sha1),cbc(aes))表示使用AES-CBC加解密和SHA1做认证的链式算法,即一次完成加密和认证。

如何使用Linux密码模块

使用Linux密码模块的流程如下图所示:

左侧为流程分割,右侧为对应的实现函数。

用户层调用Linux内核密码模块的方法

用户层调用Linux内核密码模块的方法有两种,一种是cryptodev,另一种是AF_ALG。

cryptodev

  • 据说性能超过AF_ALG
  • 使用内核密码模块内标准接口
  • 将设备暴露在/dev/crypto目录下
  • 使用ioctl函数设置密码运算上下文
  • 在OpenSSL里原生支持

AF_ALG

  • 在Linux 2.6.38版本后支持
  • 主要通过netlink套接字实现

如何开发一个密码引擎驱动

开发一个密码引擎驱动的流程

1、Linux内核密码模块并不区分硬件引擎与软件实现

2、开发一个密码引擎就只是通过向密码模块子系统注册crypto_alg

3、辨别你想新增算法的类型并与相关的crypto_alg接口绑定,比如skcipher_alg,ahash_alg等等

4、实现xxx_alg接口内容并调用crypto_register_xxx()来向密码子系统注册

以cbc(aes)算法为例的实际代码示例

struct skcipher_alg xxx_cbc_aes_alg = {
    ...
    .base = {
        /* Name used by the framework to find who is implementing what. */
        .cra_name = "cbc(aes)",
        /* Driver name. Can be used to request a specific implementation of an algorithm. */
        .cra_driver_name = "xxx-cbc-aes",
        /* Priority is used when implementation auto-selection takes place:
         * if there are several implementers, the one with the highest priority is chosen.
         * By convention: HW engine > ASM/arch-optimized > plain C
         */
        .cra_priority = 300,
        /* CRYPTO_ALG_TYPE_XX: describes the type algorithm implemented here
         * CRYPTO_ALG_ASYNC: the engine is operating in an asynchronous manner
         * CRYPTO_ALG_KERN_DRIVER_ONLY: engine is not directly accessible to userspace
         */
        .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC,
        /* Size of the data blocks this algo operates on. */
        .cra_blocksize = AES_BLOCK_SIZE,
        /* Size of the context attached to an algorithm instance. */
        .cra_ctxsize = sizeof(struct xxx_aes_ctx),
        /* constructor/destructor methods called every time an alg instance is created/destroyed. */
        .cra_init = xxx_skcipher_cra_init,
        .cra_exit = xxx_skcipher_cra_exit,
    },
};

struct skcipher_alg mv_cesa_cbc_aes_alg = {
    /* Set key implementation. */
    .setkey = xxx_aes_setkey,
    /* Encrypt/decrypt implementation. */
    .encrypt = xxx_cbc_aes_encrypt,
    .decrypt = xxx_cbc_aes_decrypt,
    /* Symmetric key size. */
    .min_keysize = AES_MIN_KEY_SIZE,
    .max_keysize = AES_MAX_KEY_SIZE,
    /* IV size */
    .ivsize = AES_BLOCK_SIZE,
    .base = {
        ....
    },
};

static int xxx_encrypt(struct skcipher_request *req)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Prepare and queue the request here. Return 0 if the request has
     * been executed, -EINPROGRESS if it's been queued, -EBUSY if it's
     * been backlogged or a different error code for other kind of
     * errors.
     */
    return ret;
}

static int xxx_decrypt(struct skcipher_request *req)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Similar to xxx_encrypt() except this time we prepare and queue
     * a decrypt operation.
     */
    return ret;
}

static int xxx_setkey(struct crypto_skcipher *cipher, const u8 *key,
unsigned int len)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Expand key and assing store the result in the ctx. */
    return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/129703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据的备份和恢复

数据的备份和恢复 备份:完全备份 增量备份 完全备份:将整个数据库完整的进行备份 增量备份:在完全备份的基础之上,对后续新增的内容进行备份 备份的需求 1、在生产环境中,数据的安全至关重要、任何数据的丢失都可…

【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数

引言 在上一篇中我们介绍了MySQL数据的导入与导出;在开发中,对MySQL函数的运用是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中函数的操作。 上一篇链接:【MySQL进阶之路丨第十五篇】一文带你精通MySQL数据的导入与导出 MySQ…

vue3使用element plus时遇到的问题

1.el-form中input无法输入 问题描述:在el-form中的el-input中输入数字或字母时出现卡顿,输入不进去的现象 问题原因:el-form的ref和model的名称写成了一样的单词 问题解决:两个不能一样 2.input去除边框 问题描述:…

2、鸿蒙开发工具首次运行时开发环境配置

请务必在第一次运行时配置好开发环境,如果取消了配置,后续再配置会比较麻烦 1、点击工具图标运行 2、在欢迎页中点击“Agree” 3、默认“Do not import setting”,点击“OK” 3、此片设置Nodejs和Ohpm的安装,其中, …

基于springboot实现高校党务平台管理系统【项目源码】

基于springboot实现高校党务平台管理系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群&#x…

Python类的定义和使用:什么是类?实在不知道啥叫累!

文章目录 前言1.基础概念2.定义一个 Person 类3.类定义4.类方法定义5.类的继承6.类的公有,私有7.子类调用父类的方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例…

【紫光同创国产FPGA教程】——【PGL22G第十一章】以太网传输实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注www.meyesemi.com) 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光…

VEX —— Intrinsic attribute

目录 查看 使用 PackedGeometry Intrinsic attribute 内在属性是已经被计算的值(从几何体派生出来的),可像属性一样访问; 查看 ginfo -I,打印所有内在属性;geometry spreadsheet,查看内在属性…

08.Diffusion Model数学原理分析(下)

文章目录 denoising matching term σ t z \sigma_tz σt​z的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …

第四章:人工智能深度学习教程-激活函数(第一节-激活函数)

简单来说,人工神经元计算其输入的“加权和”并添加偏差,如下图所示的净输入。 从数学上来说, 现在净输入的值可以是从 -inf 到 inf 之间的任何值。神经元并不真正知道如何绑定到值,因此无法决定激发模式。因此激活函数是人工神经网…

【Proteus仿真】【STM32单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用按键、LED模块等。 主要功能: 系统运行后,系统运行后,系统开始运行,K1键控制左转向灯&#xff…

【PHP函数封装】分分钟帮你实现数据脱敏处理, 支持手机号码、邮箱、身份证号 中文字符串!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

一篇文章教会你写一个贪吃蛇小游戏(纯C语言)

一篇文章教会你写一个贪吃蛇小游戏 1、游戏展示2、游戏功能3、Win32 API3.1 控制台程序3.2 控制台屏幕上的坐标COORD3.3 GetStdHandle函数3.4 GetConsoleCursorInfo函数3.4.1 CONSOLE_CURSOR_INFO结构体 3.5 SetConsoleCursorInfo函数3.6 SetConsoleCursorPosition函数3.7 GetA…

C++智能指针的使用:shared_ptr、weak_ptr、unique_ptr的使用,使用案例说明。

系列文章目录 本章内容: (1)shared_ptr、weak_ptr、unique_ptr的介绍 (2)单独使用share_ptr造成的内存泄漏 (3)shared_ptr和weak_ptr的配合使用 文章目录 系列文章目录前言一、shared_ptr、wea…

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群

openEuler 系统使用 Docker Compose 容器化部署 Redis Cluster 集群 Redis 的多种模式Redis-Alone 单机模式Redis 单机模式的优缺点 Redis 高可用集群模式Redis-Master/Slaver 主从模式Redis-Master/Slaver 哨兵模式哨兵模式监控的原理Redis 节点主客观下线标记Redis 节点主客观…

如何避免手动修改文件名,批量重命名文件的方法

在我们的日常生活和工作中,经常需要处理大量的文件,其中一些文件可能需要进行重命名。如果只是少数几个文件,我们可以手动重命名,但是当面对成百上千的文件时,手动重命名就变得非常繁琐和低效。那么,有没有…

低代码技术这么香,如何把它的开发特点发挥到极致?

前言 什么是低代码技术? 低代码是一种可视化软件开发方法,通过最少的编码更快地交付应用程序。图形用户界面和拖放功能使开发过程的各个方面自动化,消除了对传统计算机编程方法的依赖。 文章目录 前言低代码平台怎么选?用友Yonbu…

C语言中一维指针、二维指针和三维指针

指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。 假设…

github遇到想要强制拉取远程仓库内容

进行项目的时候,遇到了我的远程仓库 Sync fork 更新以后,这时候我的本地就和远程不同步,如果使用 git pull 的时候,如果出现 conficts 过多的情况怎么办,如果我们想要直接把远程仓库拉下来应该怎么办? git…

srs webrtc推拉流环境搭建

官方代码https://github.com/ossrs/srs 拉取代码: git clone https://github.com/ossrs/srs.gitcd ./configure make ./objs/srs -c conf/rtc.confconf/rtc.conf中,当推拉流浏览器在本地时,如果srs也在本地,那么可以使用官网默认…