Diffie-Hellman
Diffie-Hellman(D-H)是一种“密钥交换协议“,主要用于安全地生成共享密钥,适用于需要在不安全网络上建立加密通信的场景,常用于 TLS、IPsec。
D-H算法用于建立可用于秘密通信的共享密钥,同时使用椭圆曲线通过公共网络交换数据,以生成点并使用参数获取密钥,算法本身不负责“认证 ” 或“数据传输”。
为了算法的简单性和实际实现,只考虑 4 个变量,一个大质数 P 和 G(P 的元根)和两个私钥值 a 和 b。
P和G都是公开可用的数字。用户(比如 Alice 和 Bob)选择私有值 a 和 b,然后生成密钥并公开交换。对方收到密钥并生成一个密钥,之后他们使用相同的密钥进行加密。
D-H算法示例代码(Go):
// 实现 a^b mod P
func power(a, b, p int) int {
if b == 1 {
return a
} else {
pow := int(math.Pow(float64(a), float64(b)))
return pow % p
}
}
func main() {
var P int // public key P (大质数):用作模运算的基数,限制计算范围,防止数值过大
var G int // public key G (原根):是一个生成元,它的不同指数幂可以生成不同的数,确保密钥交换的安全性
P, G = 21, 9
var a int // a's private key
var b int // b's private key
a, b = 4, 5
var x int
var y int
x = power(G, a, P)
y = power(G, b, P)
fmt.Println("x,y", x, y)
ka := power(y, a, P) // secret key for a
kb := power(x, b, P) // secret key for b
fmt.Println("ka,kb", ka, kb)
}
代码解释:
第 1 步:A 和 B 获取公共号码 P = 23,G = 9
第 2 步:A 选择了一个私钥 a = 4 和
B 选择了一个私有密钥 b = 5
第 3 步:A 和 B 计算公共值
A: x =(9^4 mod 23) = (6561 mod 23) = 6
B: y = (9^3 mod 23) = (729 mod 23) = 16
第 4 步:A和B交换公共号码
第 5 步:A收到公钥y =16和B收到公钥 x = 6
步骤 6:A和B计算对称密钥
A:ka = y^a mod p = 65536 mod 23 = 9
B: kb = x^b mod p = 216 mod 23 = 9
第 7 步:9 是共享密钥。
RSA
非对称加密算法。公钥和私钥是一对,如果用公钥加密,只有对应的私钥才能解密;如果用私钥加密,只有对应的公钥才能解密。
由于资源消耗较大且运算效率较低,RSA 加密算法并不适合用于对整个消息或文件进行加密。因此,实际应用中通常将 RSA 与其他加密机制结合使用,例如用于加密对称密钥,或用于生成数字签名以确保消息的完整性与真实性。
数字签名在身份认证和文件验证方面具有重要作用。通过防止数据在传输过程中被篡改或伪造,数字签名提高了敏感文档的安全性。其工作机制基于非对称加密:发送方使用私钥对哈希值进行签名,接收方则使用相应的公钥验证签名的合法性,从而确认消息来源及其未被篡改。
在加密应用中,用户通常采用 混合加密策略:使用对称加密算法(如 AES)对实际数据加密,再使用 RSA 公钥对对称密钥进行加密。接收方只有在拥有 RSA 私钥的前提下,才能解密该对称密钥,并进一步访问原始消息内容。
RSA 加密已被广泛集成到多个系统和加密库中,如 OpenSSL、cryptlib、wolfCrypt 等,亦广泛应用于 Web 浏览器、电子邮件通信、VPN 和其他网络协议中。
在 VPN 场景中,RSA 尤其用于客户端与服务器之间的 安全密钥交换。以 OpenVPN 协议为例,RSA 可用于 TLS 握手阶段,确保密钥交换过程的机密性和双方身份的可信性,从而建立一个安全的数据通信通道。
加密过程:
- 发送方获取接收方的公钥。
- 将要发送的消息进行编码(转成数字形式)。
- 使用接收方的公钥对这个数字进行加密,得到密文。
- 将密文发送出去。
解密过程:
- 接收方收到密文后,使用自己的私钥进行解密。
- 解密后的结果就是原始消息。
AES
AES-128加密过程:
初始轮(预处理):
- 将密钥与原始数据进行一次初步的异或混合(叫做轮密钥加)。
主轮(9 轮): 每一轮包含以下 4 个步骤:
- 字节代换(SubBytes):对每个字节做替换,使用一个固定的替换表(S盒),增加混淆。
- 行移位(ShiftRows):将每一行的字节向左循环移动不同的位数,打乱位置,增加扩散。
- 列混淆(MixColumns):对每一列的数据进行数学变换,进一步打乱数据结构。
- 轮密钥加(AddRoundKey):将当前轮的密钥与数据块再次混合(异或运算)。
最后一轮(第10轮):
- 同样进行字节代换、行移位和轮密钥加,但不执行列混淆。
AES-128解密过程基本上是加密的反向操作,也需要使用相同的密钥,但各步骤顺序和处理方法刚好相反。
RSA与AES区别
特性 | RSA | AES |
---|---|---|
🔑 加密方式 | 非对称加密(公钥 & 私钥) | 对称加密(同一个密钥) |
🧠 基本原理 | 数学难题(大数分解) | 数据混淆与扩散(代数结构变换) |
📦 密钥类型 | 一对密钥:公钥 + 私钥 | 单一密钥 |
⏱️ 速度 | 慢(适合加密小数据) | 快(适合加密大量数据) |
🧾 用途 | 密钥交换、数字签名 | 数据加密 |
🔐 安全强度 | 安全性取决于密钥长度(通常 ≥2048位) | 非常安全(128/192/256位) |
🛠 应用场景 | HTTPS 握手、SSH 登录、证书签名 | 文件加密、VPN、数据库加密 |
ECDSA
(Elliptic curve digital signature algorithm)椭圆曲线数字签名算法
ECDSA基于椭圆曲线密码学(Elliptic Curve Cryptography,简称ECC)。ECC是一种公钥密码学方法,其原理建立在有限域上的椭圆曲线代数结构之上。与传统的公钥加密方法,如RSA(Rivest-Shamir-Adleman),相比,ECC提供了多种优势,包括更小的密钥尺寸、更快的计算速度,以及在相同密钥长度下更高的安全性。
椭圆曲线通过一个数学方程来定义,形式为:
y^2 = x^3 + ax + b
其中a和b是常数。所有满足该方程的点(x,y),以及一个被称为“无穷远”的特殊点,组成了椭圆曲线的一个群体。ECC的安全性依赖于离散对数问题,而在椭圆曲线上解决这个问题被认为是计算上不可行的,从而确保了其加密的安全性。
在ECDSA中,每个用户生成一对公钥和私钥,用于数字签名的签署与验证。密钥生成的过程包括以下步骤:
- 选择一条合适的椭圆曲线,并指定该曲线上的一个点 GGG 作为基点,同时定义n为点G的阶,其中n是一个大质数。基点G和阶数n是公开的,并且在所有用户之间共享。
- 从1到n−1的范围内随机选择一个整数d。这个整数d被作为私钥。
- 计算公钥Q=dG,其中Q是椭圆曲线上的一个点。这个步骤使用了标量乘法,即重复将基点G与自身相加d次。标量乘法是椭圆曲线密码学中的核心运算。
发表回复