加解密算法-知识体系

对称加密类

在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

DES(Data Encryption Standard 数据加密标准)

DES(Data Encryption Standard)数据加密标准,速度较快,适用于加密大量数据的场合。

AES(Advanced Encryption Standard 高级加密标准)

AES是下一代的加密算法标准,速度快,安全级别高,支持128、192、256位密钥的加密。

ECB ( Electronic Codebo Book 电码本模式)

这种模式是将整个明文分成若干段相同的小段,然后对每-小段进行加密。

ECB 其实非常简单,就是将数据按照8个字节-段进行DES加密或解密得到一段段的8个字节的密文或者明文,最后- -段

不足8个字节(- 般补0或者F),按照需求补足8个字节进行计算(并行计算),之后按照顺序将计算所得的数据连在-起即可, 各段数据

之间互不影响。

CBC (Cipher Block Chaining 密码分组链接模式)

这种模式是先将明文切分成若干小段,然后每一小段与初始块(IV) 或者上一段的密文段进行异或,再与密钥进行加密。安全性比ECB高。

OFB(Output FeedBack 输出反馈模式)

CFB(Cipher FeedBack 密码反馈模式)

CTR(Counter 计算器模式)

计算器模式不常见,在CTR模式中,有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。

这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。

XTS(XEX Tweakable Block Cipher with Ciphertext Stealing)

XTS即基于XEX(XOR Encrypt XOR)的密文窃取算法的可调整的密码本模式(Tweakable Codebook mode),该算法主要用于以数据单元(包括扇区、逻辑磁盘块等)为基础结构的存储设备中静止状态数据的加密。

XTS-AES主要应用与存储产品的数据安全性。

AES-XTS MULTI-BOOSTER(AES-XTS 多重加速器)

AES-XTS多重加速器的加密引擎可轻松移植到ASIC和FPGA中,支持各种技术上的广泛应用,独特的架构可实现高度的灵活性,可根据特定应用程序所需的吞吐量和功能选择高性能的配置。

MAC(Message Authentication Code 消息认证码)

密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。安全性依赖于Hash函数,故也称带的Hash函数。消息认证码是基于和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。

HMAC(Hash-based message authentication code 哈希消息认证码)

HMAC,效率高、应用广、性质好、安全性强强的一种利用Hash函数实现MAC的方案。

HMAC是Bellare等人中提出的,其要求使用的Hash函数具有迭代结构(如MD5、SHA1、SHA2等)。

GMAC(Galois message authentication code mode 伽罗瓦消息验证码)

对应到消息认证码,GMAC就是利用伽罗华域(Galois Field,GF,有限域)乘法运算来计算消息的MAC值。假设秘钥长度为128bits, 当密文大于128bits时,需要将密文按128bits进行分组。

PMAC(Parallel Message Authentication Code 并行消息身份验证码)

PMAC有别于前面的顺序的MAC方式,之前的ECBC和NMAC本质上都是线性的,但也有相同于前面的MAC方式。

ECBC-MAC、CMAC: 通常基于AES

NMAC: 一种常用的HMAC方法

PMAC: 一种并行的MAC方法

Wegman-Carter MAC:一种快速的单次MAC方法

补码种类

PKCS1Padding:

PKCS#1(v1.5)中规定当RSA的密钥长度是1024b,如果使用PKCS1Padding填充,则原文数据最多117B。如果原文不满足长度要求,则在加密前需要进行填充。

PKCS5Padding:

PKCS#5填充是将数据填充到8的倍数,填充后数据长度的计算公式是 定于元数据长度为x, 填充后的长度是 x + (8 - (x % 8)), 填充的数据是 8 - (x % 8),块大小固定为8字节。

PKCS7Padding:

假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小;PKCS5只填充到8字节,而PKCS7可以在1-255之间任意填充。

ZeroPadding:

数据长度不对齐时使用0填充,否则不填充。

NoPadding:

不填充,要求明文就是指定长度的整数倍。这种模式基本用不到,对传入明文长度要求太高。

由于使用PKCS7Padding/PKCS5Padding填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密。

为什么要补码?

某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要对最后一个块填充到16 字节,解密后需要删除掉填充的数据。

各种模式操作对象的对比:

各种模式优缺点对比:


非对称加密类

DSA

既 Digital Signature Algorithm,数字签名算法,他是由美国国家标准与技术研究所(NIST)与1991年提出。和 RSA 不同的是 DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。

RSA

RSA 是一种目前应用非常广泛、历史也比较悠久的非对称秘钥加密技术,在1977年被麻省理工学院的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)三位科学家提出,由于难于破解,RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等,理论上秘钥越长越难于破解,按照维基百科上的说法,小于等于256位的秘钥,在一台个人电脑上花几个小时就能被破解,512位的秘钥和768位的秘钥也分别在1999年和2009年被成功破解,虽然目前还没有公开资料证实有人能够成功破解1024位的秘钥,但显然距离这个节点也并不遥远,所以目前业界推荐使用 2048 位或以上的秘钥,不过目前看 2048 位的秘钥已经足够安全了,支付宝的官方文档上推荐也是2048位,当然更长的秘钥更安全,但也意味着会产生更大的性能开销。

ECDSA

Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法,是ECC(Elliptic curve cryptography,椭圆曲线密码学)和 DSA 的结合,椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的,相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障,据称256位的ECC秘钥的安全性等同于3072位的RSA秘钥,和普通DSA相比,ECDSA在计算秘钥的过程中,部分因子使用了椭圆曲线算法。

ED25519

ED25519 是一种 EdDSA 算法,是一种在扭曲爱德华兹曲线(Twisted Edwards curves)上使用 Schnorr 机制来实现的一种数字签名机制。它具有速度快,密钥较短,安全性高等优点。

Ed25519是一个数字签名算法,签名和验证的性能都极高, 一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名,安全性极高,等价于RSA约3000-bit。签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节。


HASH(哈希散列)类

HASH算法名称

长度

其它说明

ADLER32

4

CRC32

4

RIPEMD160

20

MD2

16

MD4

16

MD5

16

16个十六进制表示,每个2个字符,即32个字符

SHA1

20

SHA256

32

SHA384

48

SHA512

64

HAVAL256-4

32

WHIRLPOOL

64


国产密码算法

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。

SM1算法目前没有公开,只能集成在芯片中。目前应用较多的是SM2、SM3和SM4算法,这三者用法不一。

SM2属于非对称加密算法,使用公钥加密,私钥解密,在安全性和运算速度方面要优于RSA算法。

SM3属于不可逆加密算法,类似于md5,常用于签名。

SM4属于对称加密算法,可用于替代DES/AES等国际算法, SM4算法与AES算法具有相同的密钥长度和分组长度,都是128位。

GmSSL官方网址:

关于GmSSLhttp://gmssl.org/http://gmssl.org/

GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法、SM2国密数字证书及基于SM2证书的SSL/TLS安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建PKI/CA、安全通信、数据加密等符合国密标准的安全应用。GmSSL项目是OpenSSL项目的分支,并与OpenSSL保持接口兼容。因此GmSSL可以替代应用中的OpenSSL组件,并使应用自动具备基于国密的安全能力。GmSSL项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

GmSSL项目代码

GitHub - guanzhi/GmSSL: 支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱. Contribute to guanzhi/GmSSL development by creating an account on GitHub.https://github.com/guanzhi/GmSSLhttps://github.com/guanzhi/GmSSL

Java版本-JNI

https://github.com/guanzhi/GmSSL/tree/master/javahttps://github.com/guanzhi/GmSSL/tree/master/javahttps://github.com/guanzhi/GmSSL/tree/master/java

Go语言版本-CGO

https://github.com/guanzhi/GmSSL/tree/master/gohttps://github.com/guanzhi/GmSSL/tree/master/gohttps://github.com/guanzhi/GmSSL/tree/master/go

GmSSL Go APIhttp://gmssl.org/docs/go-api.htmlhttp://gmssl.org/docs/go-api.html

PHP版本-PHP扩展模块

https://github.com/guanzhi/GmSSL/tree/master/phphttps://github.com/guanzhi/GmSSL/tree/master/phphttps://github.com/guanzhi/GmSSL/tree/master/php

中华人民共和国密码行业标准(GM/T)文本

GitHub - guanzhi/GM-Standards: 中华人民共和国密码行业标准(GM/T)文本中华人民共和国密码行业标准(GM/T)文本. Contribute to guanzhi/GM-Standards development by creating an account on GitHub.https://github.com/guanzhi/GM-Standardshttps://github.com/guanzhi/GM-Standards

在线生成sm2公钥私钥:

SM2 密钥在线生成工具https://const.net.cn/tool/sm2/genkey/https://const.net.cn/tool/sm2/genkey/

在线加密链接:

DES在线解密 DES在线加密 des hex - The X 在线工具DES 加密、解密在线工具免费。支持模式有:ECB、CBC、CTR、CFB和CFB。输出可以是BASE64、十六进制或文本。该工具检测解密结果并设置其格式,如 JSON。https://the-x.cn/cryptography/Des.aspxhttps://the-x.cn/cryptography/Des.aspx

### 使用 OpenSSL 实现 AES-XTS 解密 OpenSSL 是一种广泛使用的工具库,支持多种加密算法。然而需要注意的是,AES-XTS 并不是一个直接由 `openssl` 命令行工具原生支持的模式[^2]。尽管如此,可以通过编程接口(如 C 或 Python)调用 OpenSSL 库来实现 AES-XTS 的加解密操作。 以下是通过命令行和编程两种方式实现 AES-XTS 解密的方法: #### 方法一:基于 OpenSSL 编程接口实现 AES-XTS 解密 由于 OpenSSL 命令行不直接支持 XTS 模式,因此需要借助其 API 来完成此功能。下面是一个简单的示例代码,展示如何使用 OpenSSL 库执行 AES-XTS 解密。 ```c #include <stdio.h> #include <string.h> #include <openssl/evp.h> void handleErrors() { ERR_print_errors_fp(stderr); abort(); } int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *plaintext) { EVP_CIPHER_CTX *ctx; int len; int plaintext_len; ctx = EVP_CIPHER_CTX_new(); if (!EVP_DecryptInit_ex(ctx, EVP_aes_128_xts(), NULL, key, iv)) { // 替换为适当密钥长度 handleErrors(); } if (!EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len)) { handleErrors(); } plaintext_len = len; if (!EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) { handleErrors(); } plaintext_len += len; EVP_CIPHER_CTX_free(ctx); return plaintext_len; } int main(void) { /* 密钥和初始化向量 */ unsigned char key[] = "0123456789abcdef"; // 示例密钥 (需替换为实际密钥) unsigned char iv[] = "fedcba9876543210"; // 示例 IV (需替换为实际值) /* 加密数据 */ unsigned char ciphertext[] = "encrypted_data_here"; int ciphertext_len = sizeof(ciphertext) - 1; // 减去字符串结束符 '\0' /* 输出缓冲区 */ unsigned char plaintext[128]; int plaintext_len; plaintext_len = decrypt(ciphertext, ciphertext_len, key, iv, plaintext); printf("Plaintext is:\n"); for(int i=0;i<plaintext_len;i++) printf("%c", plaintext[i]); printf("\n"); return 0; } ``` 注意,在上面的例子中,`EVP_aes_128_xts()` 可能不可用,具体取决于编译时配置以及版本的支持情况[^3]。 #### 方法二:尝试其他替代方案 如果无法直接利用 OpenSSL 提供的功能,则可以考虑采用第三方库或者扩展模块,比如 Cryptography.io(Python 中的一个高级密码学包),它提供了更灵活的方式处理现代加密标准。 例如,下面是使用 Python 和 PyCryptodome 进行 AES-XTS 解密的简单例子: ```python from Crypto.Cipher import AES from Crypto.Util.strxor import strxor def aes_xts_decrypt(key, data, tweak): cipher1 = AES.new(key[:16], AES.MODE_ECB) cipher2 = AES.new(key[16:], AES.MODE_ECB) encrypted_block = [] decrypted_result = [] for block_index in range(0, len(data), 16): current_tweak = tweak ^ ((block_index >> 4).to_bytes(16, 'big')) t1 = cipher1.encrypt(current_tweak)[:16] t2 = cipher2.encrypt(current_tweak)[:16] combined_key_schedule = strxor(t1, t2) block_to_decrypt = data[block_index:block_index+16].ljust(16, b'\0') intermediate_value = bytes([a ^ b for a,b in zip(block_to_decrypt, combined_key_schedule)]) final_decrypted_block = strxor(intermediate_value, t1) decrypted_result.append(final_decrypted_block) return b''.join(decrypted_result) # Example usage: key = b'your_secret_key_of_length_32_or_more' data = b'some_encrypted_binary_content' tweak = b'\x00'*16 # Initial Tweak Value decrypted_output = aes_xts_decrypt(key, data, tweak) print(f"Decrypted Output: {decrypted_output}") ``` 以上脚本展示了手动模拟 AES-XTS 工作流程的过程,并假设输入的数据已经被正确分块并填充到适合大小。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值