王小扬博客
Git
AI
产品
film
AI Code
Java
其他
计算机网络
DB
云原生
Node
Docker
操作系统
Elasticsearch
Apollo
Nestjs
Think
大前端
PHP
软件开发
设计
生活技巧
CI
缓存
Java 加解密
加密解密算法参考
AES对称加密
AES 支持不同长度的密钥,分别为 128 位、192 位和 256 位。密钥长度越长,加密的安全性越高,但计算复杂度也会相应增加。
模式 | 描述 | 典型应用 |
电码本 (ECB) | 用相同的密钥分别对明文分组独立加密 | 单个数据的安全传输 (如一个加密密钥) |
密文分组链接 (CBC) | 加密算法的输入是上一个密文组和下一个明文组的异或 | 面向分组的通用传输认证 |
密文反馈 (CFB) | 一次处理 s 位,上一块密文作为加密算法的输入,产生的伪随机数输出与明文异或作为下一单元的密文 | 面向数据流的通用传输认证 |
输出反馈 (OFB) | 与 CFB 类似,只是加密算法的输入是上一次加密的输出,且使用整个分组 | 噪声信道上的数据流的传输 |
计数器 (CTR) | 每个明文分组都与一个经过加密的计数器相异或。对每个后续分组计数器递增 | 面向分组的通用传输,用于高速需求 |
伽罗瓦 / 计数器模式 (GCM) | 结合计数器模式 (CTR) 进行加密,同时使用伽罗瓦域计算认证标签,提供机密性、完整性和认证 | 常用于网络通信、存储加密等对数据安全和性能有综合要求的场景,如 TLS 协议中 |
Offset Codebook (OCF) | 通常基于预先定义的码本,通过偏移操作对数据进行变换加密。在一些特定的轻量级加密场景或对资源受限设备适用的加密方案中使用,通过对码本的偏移映射实现明文到密文的转换 | 适用于资源受限环境(如某些物联网设备)下的简单数据加密需求,对计算资源和存储要求相对较低的场景 |
- 明文P(plainText):未经加密的数据
- 密钥K(key):用来加密明文的密码。在对称加密算法中,加密与解密的密钥是相同的,由双方协商产生,绝不可以泄漏
- 密文C(cipherText): 经过加密的数据
- 加密函数E(encrypt):C = E(K, P),即将明文和密钥作为参数,传入加密函数中,就可以获得密文
- 解密函数D(decrypt):P = D(K, C),即将密文和密钥作为参数,传入解密函数中,就可以获得明文
AES 密文
- AES加密需要二进制密钥,但二进制数据不方便人类阅读和传输
- 十六进制可以将二进制数据转换为可读的字符串形式
- 例如:二进制 00000001 可以表示为十六进制 01
16进制字符只能是 0-9 和 A-F(不区分大小写)。"W" 不在这个范围内,所以抛出了 NumberFormatException。
如果是用户自定义密码,可以基于密码先Hash 然后使用
AES密钥长度
AES的明文分组长度为128位(16字节)
名字 | AES-128 | AES-196 | AES-256 |
明文分组长度 /位 | 128 | 128 | 128 |
密钥长度 /位 | 128 | 198 | 256 |
迭代轮数 | 10 | 12 | 14 |
字节 | 16 | 24 | 32 |
在十六进制表示中,每个字符代表 4 位二进制数。因为1字节等于8位,所以换算关系为:字符数 = 位数 ÷4 = 字节数 ×2。因此,128 位(16 字节)、192 位(24 字节)、256 位(32 字节)的十六进制表示分别如下:
- 128 位(16 字节):字符长度为128÷4=16×2=32个字符。
- 192 位(24 字节):字符长度为192÷4=24×2=48个字符。
- 256 位(32 字节):字符长度为256÷4=32×2=64个字符。
- 生成合适长度的AES密钥:根据AES算法的要求,可以生成16、24或32字节的随机密钥。可以使用编程语言中的随机数生成函数来生成密钥,例如在Python中可以使用
secrets
模块的token_bytes
函数。
- 密钥派生函数(Key Derivation Function):如果只有一个较短的密钥可用,可以使用密钥派生函数来生成符合要求长度的AES密钥。常用的密钥派生函数包括PBKDF2、bcrypt和scrypt等。
- 密钥扩展算法(Key Expansion Algorithm):如果有一个较短的密钥可用,可以使用密钥扩展算法将其扩展为符合要求长度的AES密钥。常用的密钥扩展算法包括AES Key Expansion算法。
- 使用密钥管理服务(Key Management Service):如果需要更高级的密钥管理功能,可以使用密钥管理服务来生成和管理AES密钥。密钥管理服务可以提供密钥的生成、存储、分发和轮换等功能。
Java AES-GCM
java aes gcm实现
Node AES GMC
node code
ECC
ECC 加密(NullCipher不可用)
NullCipher不可用
ECIES
Only secp256k1 curve, only SHA-512 (KDF), HMAC-SHA-256 (HMAC) and AES-256-CBC for ECIES
ECIESCIES也有几个标准:ANSI X9.63, IEEE 1363a 和 ISO/IEC 18033-2。简单来说加密时为: 使用发送者的私钥和接受者的公钥生成加密密钥ek和MAC密钥mk,用ek对明文M加密得到密文c,使用mk生成密文c的标签。将发送者的公钥,密文c和标签一起发送给接受者。(也可在生成密钥和标签的步骤加入共享消息) 解密时:接受者收到发送者发送的公钥,密文c和标签,加入自己的私钥,即可生成加密密钥ek和MAC密钥mk,使用ek对密文c解密,得到消息M。
Cipher.getInstance provide含义 BC Bouncy Castle SunJCE SunJCE (Sun Java Cryptography Extension) 是 Java 加密体系结构(JCA)和 Java 加密扩展(JCE)框架的默认实现,由 Oracle 提供。AESTest.javabcgitECIESTest.javabcgit
ECIES android、ios swif、java、node 具体代码实现,可以互相加解密AES:AES/GCM/NoPadding(128 位,32 字符)加密过程
1. 生成临时密钥对(ephemeral key pair)
2. 使用ECDH计算共享密钥
3. 使用SHA-256派生加密密钥和MAC密钥
4. 使用AES-128-CBC加密数据
5. 使用HMAC-SHA256计算MAC6. 组合输出格式: 临时公钥 + IV + 加密数据 + MAC
解密过程
1. 解析密文获取临时公钥、IV、加密数据和MAC
2. 使用ECDH计算共享密钥
3. 使用SHA-256派生加密密钥和MAC密钥
4. 验证MAC5. 使用AES-128-CBC解密数据
业务使用:用户密钥使用非对称 ECC、对刑案数据加密使用 AESAES 密钥用用户公钥加密后存储关联用户信息
Loading...