AES  | Advanced Encryption Standard  | 对称加密算法  | 
RSA  | Rivest-Shamir-Adleman  | 非对称加密算法  | 
DES  | Data Encryption Standard  | 对称加密算法  | 
ECC  | Elliptic Curve Cryptography  | 椭圆曲线密码;非对称加密算法  | 
CMAC  | Cipher-based Message Authentication Code  | 基于分组密码的消息认证码算法  | 
SHA  | Secure Hash Algorithm  | 密码散列函数  | 
MD5  | Message Digest Algorithm 5  | 一种常用的哈希函数、可以将任意长度的消息压缩成128位的摘要信息  | 
MAC  | Message Authentication Code  | 消息认证码,是一种确认完整性并进行认证的技术  | 
HMAC  | Hash-based Message Authentication Code  | 是一种基于哈希函数的消息认证码,用于验证消息的完整性和真实性。它将密钥与消息结合起来,通过哈希算法生成一个固定长度的认证标签,以此来确保消息没有被篡改。  | 
MD  | Message Digest  | MD 消息摘要是一种使用定长哈希算法将任意长度的数据转换为固定长度摘要(通常是128位或256位)的技术。这个摘要可以用于验证数据完整性、数字签名和密码学安全等方面。  | 
基础知识
- 单向散列函数,保持数据完整性
 - 数字签名:数字签名是一种用于确保数据完整性和身份认证的技术。它基于公钥密码学,通过将消息使用私钥进行加密来创建数字签名,而任何人都可以使用相应的公钥对数字签名进行验证。如果数字签名有效,则意味着消息没有被篡改过且发送者是可信的。
 - UIO驱动(UIO driver)是一种通用的Linux内核驱动框架,可以用于连接用户空间应用程序和驱动程序。它的全称为User-Mode Linux I/O driver framework。
 
UIO驱动采用了一种简单的设备模型,将设备看作一个内存映射区域,并通过sysfs文件系统提供用户空间应用程序访问设备的接口。UIO驱动允许用户自定义的设备实现,支持多个用户空间应用程序同时访问同一个设备,而不必担心竞争条件和并发访问问题。
UIO驱动主要用于创建用户空间应用程序与硬件设备之间的接口,以便让用户空间应用程序能够直接操作硬件设备。它特别适合用于那些需要高性能、低延迟和可编程的硬件加速器,例如FPGA(Field Programmable Gate Array)等。UIO驱动的使用需要一定的Linux内核和驱动开发经验,但相比较其他驱动框架,UIO驱动的开发和调试难度要小得多。
- 用于认证的技术包括消息验证码和数字签名。消息认证码能够向通信对象保证消息没有被篡改,而数字签名不仅能够向通信对象保证信息没有被篡改,还能够向所有第三方做出这样的保证。
 - 消息认证码(Message Authentication Code ,MAC),是一种确认完整性并进行认证的技术
 
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。
- HMAC (Hash-based Message Authentication Code) 是一种基于哈希函数的消息认证码,用于验证消息的完整性和真实性。它将密钥与消息结合起来,通过哈希算法生成一个固定长度的认证标签,以此来确保消息没有被篡改。常见的 HMAC 算法包括 HMAC-MD5、HMAC-SHA1、HMAC-SHA256 等。
 - 消息认证码无法防止否认。
 - 数字签名就是通过将公钥密码"反过来用"而实现的。
 
在公钥密码中,密码分为加密密钥和解密密钥,用加密密钥无法进行解密。此外,解密密钥只能由需要解密的人持有,而加密密钥则是任何人都可以持有。
- 堆成加密算法(HEAP-based encryption algorithm)是一种基于优先队列(Heap)和堆排序的加密算法。这种算法的基本思想是利用堆的特性和堆排序来对待加密的数据进行排序和重排,从而实现加密的目的。 具体步骤如下: 1. 将待加密的数据按照一定的规则存储在一个堆中,可以是最大堆或最小堆。 2. 对堆中的数据进行堆排序,从而实现对数据的重排。 3. 将排序后的数据按照一定的规则组合成加密后的结果。 堆成加密算法的优点包括: 1. 加密过程中的数据不易被解密,由于堆排序的特性,数据的顺序会被重新排列,增加了解密的难度。 2. 算法相对简单,容易实现。 然而,堆成加密算法也存在一些缺点: 1. 加密后的数据仍然可以通过解密过程还原原始数据,算法的安全性较低。 2. 算法的效率较低,堆排序的时间复杂度为O(nlogn),加密和解密的过程都需要进行堆排序,对于大规模的数据加密会有较大的时间开销。 综上所述,堆成加密算法是一种相对简单的加密算法,适用于对一般数据进行基本保护的场景。但在对安全性要求较高的应用中,推荐使用更为强大和安全的加密算法,如AES、RSA等。
 
公钥密码与数字签名的密钥使用方式
私钥  | 公钥  | |
公钥密码  | 接收者解密时使用  | 发送者加密时使用  | 
数字签名  | 签名者生成签名时使用  | 验证者验证签名时使用  | 
谁持有密钥  | 个人持有  | 只要需要,任何人都可以持有  | 
对称密码与公钥密码的对比
对称密码  | 公钥密码  | |
发送者  | 用共享密钥加密  | 用公钥加密  | 
接收者  | 用共享密钥解密  | 用私钥解密  | 
密钥配送问题  | 存在  | 不存在,但公钥需要另外认证  | 
机密性  | Y  | Y  | 
消息认证码与数字签名的对比
消息认证码  | 数字签名  | |
发送者  | 用共享密钥计算MAC值  | 用私钥生成签名  | 
接收者  | 用共享密钥计算MAC值  | 用公钥验证签名  | 
密钥配送问题  | 存在  | 不存在,但公钥需要另外认证  | 
完整性  | Y  | Y  | 
认证  | Y(仅限通信对象双方)  | Y(可适用于任何第三方)  | 
防止否认  | N  | Y  | 










