深入浅出 区块链密码学(学习笔记3.0)——非对称加密

引言

        上一篇文章我们说到密码学中的对称加密,这篇文章向大家介绍何为非对称加密,希望对大家有帮助,也希望大家在评论指出文章存在问题及不足。


一.非对称加密

1.1 定义

        非对称加密,也称为公钥加密,是一种加密技术,与对称加密相比具有不同的特点。在非对称加密中,使用一对密钥来进行加密和解密操作,这对密钥包括公钥和私钥。

  1. 公钥(Public Key):公钥是可公开的,用于加密数据的密钥。它可以分发给任何人,任何人都可以使用公钥来加密消息。

  2. 私钥(Private Key):私钥是保密的,用于解密由对应公钥加密的数据。私钥只能由密钥的所有者持有,并且不应该公开。


1.2 非对称加密过程 

    非对称加密的过程如下:

  • 发送方使用接收方的公钥来加密要发送的消息。
  • 接收方使用自己的私钥来解密接收到的密文。

由于私钥是保密的,只有接收方才能解密数据,因此非对称加密可以确保数据的机密性。而公钥是公开的,任何人都可以使用它来加密消息,因此非对称加密也可用于实现数字签名等功能。

常见的非对称加密算法包括RSA、DSA、ECC等。非对称加密在网络安全、数字签名、身份认证等领域得到了广泛应用,是信息安全中重要的一环。


二.常见算法

2.1 RSA算法

  RSA算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的是绝大多数密码攻击。RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却及其困难,因此可以将乘积公开作为加密密钥。

2.1.1 RSA算法工作原理

        RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,其工作原理基于大整数分解问题。RSA 算法涉及两个主要操作:密钥生成和加解密。

密钥生成:

  1. 选择两个大素数 p 和 q:选择两个足够大的素数,通常为几百位或更多位的长度。
  2. 计算乘积 n:计算 p 和 q 的乘积 n,即 n = p * q。n 就是公钥和私钥的一部分,称为模数。
  3. 计算欧拉函数 φ(n):计算模数 n 的欧拉函数 φ(n),其中 φ(n) = (p-1)(q-1)。
  4. 选择公钥 e:选择一个与 φ(n) 互质的数 e(即 e 和 φ(n) 之间的最大公约数为 1),通常选择常数 65537。e 称为加密指数。
  5. 计算私钥 d:计算 e 的模反元素 d,即 (e * d) mod φ(n) = 1。d 称为解密指数。
  6. 生成公钥和私钥:公钥由 (e, n) 组成,私钥由 (d, n) 组成。公钥用于加密,私钥用于解密。

加解密过程:

  • 加密:对于要加密的消息 m,用公钥 (e, n) 进行加密,加密后的密文为 c = m^e mod n。
  • 解密:用私钥 (d, n) 对密文 c 进行解密,解密后的明文为 m = c^d mod n。

RSA 算法的安全性基于大整数分解问题的困难性,即给定 n 的值,找出其质因数 p 和 q 的过程是非常困难的,特别是当 p 和 q 非常大时。因此,只要私钥 d 足够长,RSA 算法就可以提供足够的安全性。

相应代码(node.js)展示:

// RSA 加密算法实现

// 生成随机大素数
function generatePrime(bits) {
    // 这里省略了具体实现,可以使用 Miller-Rabin 算法等方法生成大素数
}

// 求模反元素
function modInverse(a, m) {
    // 这里省略了具体实现,可以使用扩展欧几里得算法等方法求解模反元素
}

// 求最大公约数
function gcd(a, b) {
    // 这里省略了具体实现,可以使用欧几里得算法等方法求解最大公约数
}

// RSA 密钥生成
function generateKeys(bits) {
    // 选择两个大素数 p 和 q
    const p = generatePrime(bits / 2);
    const q = generatePrime(bits / 2);

    // 计算 n = p * q
    const n = p * q;

    // 计算 φ(n) = (p - 1) * (q - 1)
    const phi = (p - 1) * (q - 1);

    // 选择公钥 e,要求 1 < e < φ(n),且 e 与 φ(n) 互质
    let e = 65537; // 常用的选择是 65537
    while (gcd(e, phi) !== 1) {
        e++;
    }

    // 计算私钥 d,使得 (e * d) % φ(n) = 1
    const d = modInverse(e, phi);

    // 返回公钥和私钥
    return {
        publicKey: { e, n },
        privateKey: { d, n }
    };
}

// RSA 加密
function encrypt(message, publicKey) {
    const { e, n } = publicKey;
    // 将消息转换为数字
    const m = BigInt(message.charCodeAt(0)); // 仅适用于单个字符的简单示例
    // 加密并返回密文
    return m ** BigInt(e) % BigInt(n);
}

// RSA 解密
function decrypt(ciphertext, privateKey) {
    const { d, n } = privateKey;
    // 解密并返回明文
    return String.fromCharCode(Number((BigInt(ciphertext) ** BigInt(d)) % BigInt(n))); // 仅适用于单个字符的简单示例
}

// 使用示例
const message = "Hello, RSA!";
console.log("原始消息:", message);

// 生成 RSA 密钥对
const { publicKey, privateKey } = generateKeys(1024);

// 加密消息
const ciphertext = encrypt(message, publicKey);
console.log("加密后:", ciphertext);

// 解密消息
const decryptedMessage = decrypt(ciphertext, privateKey);
console.log("解密后:", decryptedMessage);

2.1.2 RSA算法可应用的领域

RSA 算法是一种非常广泛应用的非对称加密算法,可以在许多不同领域中发挥作用。以下是一些常见的应用领域:

  1. 数据加密和解密:RSA 算法可用于保护敏感数据的传输和存储。例如,通过使用 RSA 加密,可以对电子邮件、文件、通信和数据库中的数据进行加密,以确保只有授权的用户能够访问这些数据。

  2. 数字签名:RSA 算法可用于生成数字签名,以验证数据的真实性、完整性和不可否认性。数字签名在网络通信、电子商务、文件认证等领域中被广泛使用,如 SSL/TLS 协议、代码签名等。

  3. 身份验证:RSA 算法可用于实现身份验证机制,例如在网络登录、访问控制、身份认证等方面。用户可以使用其私钥签名数据,并将签名发送给服务器,服务器使用用户的公钥验证签名的有效性,从而验证用户的身份。

  4. 数字证书:RSA 算法被用于生成和验证数字证书,数字证书是用于证明实体身份和数字签名的一种数字凭证。常见的应用包括 SSL/TLS 证书、代码签名证书、身份证明证书等。

  5. 密钥交换:RSA 算法可用于安全地交换对称密钥,例如在 SSL/TLS 握手过程中,客户端和服务器可以使用 RSA 算法进行密钥交换,以加密通信中使用的对称密钥。

  6. 数字货币:RSA 算法在加密货币领域也有应用,尤其是在早期的加密货币中,如比特币。RSA 算法可用于生成数字货币的密钥对、签名交易等。

  7. 安全协议:RSA 算法可用于构建安全协议,如 SSL/TLS、SSH、IPsec 等网络安全协议,以确保通信的保密性、完整性和可信度。

总的来说,RSA 算法在信息安全领域有着广泛的应用,是保护数据安全和确保通信可信的重要工具之一。

2.2 DSA算法

        DSA(Digital Signature Algorithm)是一种基于离散对数问题的数字签名算法,它主要用于数字签名和验证

2.2.1 DSA算法工作原理

DSA(Digital Signature Algorithm)是一种基于离散对数问题的数字签名算法,它主要用于数字签名和验证。DSA 算法的工作原理可以简要概括如下:

密钥生成:

  1. 选择参数:选择两个大素数 p 和 q,其中 q 是一个较小的素数,p 是一个大素数,满足 p - 1 能被 q 整除。此外,选择一个整数 g,其中 g 是一个模 p 的原根,即 g 的阶(order)是 p - 1。

  2. 生成私钥:选择一个私钥 x,满足 1 < x < q。

  3. 生成公钥:计算公钥 y,其中 y = g^x mod p。

 签名生成:

  1. 选择随机数:选择一个随机数 k,满足 1 < k < q。

  2. 计算 r:计算 r,其中 r = (g^k mod p) mod q。

  3. 计算 s:计算 s,其中 s = (k^(-1) * (H(m) + x * r)) mod q,其中 H(m) 是消息 m 的哈希值。

  4. 签名:生成签名 (r, s)。

 签名验证:

  1. 计算 w:计算 w,其中 w = s^(-1) mod q。

  2. 计算 u1 和 u2:计算 u1,其中 u1 = H(m) * w mod q,以及 u2,其中 u2 = r * w mod q。

  3. 计算 v:计算 v,其中 v = ((g^u1 * y^u2) mod p) mod q。

  4. 验证签名:如果 v 等于 r,则签名有效;否则,签名无效。

DSA 算法的安全性基于离散对数问题的困难性,即在离散对数问题下,从 g、p 和 y 的值中推导出 x 的值是一个计算上的困难问题。因此,只要私钥 x 足够长,DSA 签名算法可以提供足够的安全性。

相应代码展示(node.js):

const crypto = require('crypto');

// DSA 密钥生成
function generateKeys() {
    const { publicKey, privateKey } = crypto.generateKeyPairSync('dsa', {
        modulusLength: 2048, // 密钥长度
    });

    return { publicKey, privateKey };
}

// DSA 签名
function sign(message, privateKey) {
    const signer = crypto.createSign('DSA');
    signer.update(message);
    const signature = signer.sign(privateKey, 'hex');
    return signature;
}

// DSA 验证签名
function verify(message, signature, publicKey) {
    const verifier = crypto.createVerify('DSA');
    verifier.update(message);
    const isValid = verifier.verify(publicKey, signature, 'hex');
    return isValid;
}

// 示例
const message = 'Hello, DSA!';
console.log('原始消息:', message);

// 生成 DSA 密钥对
const { publicKey, privateKey } = generateKeys();
console.log('公钥:', publicKey.export({ format: 'pem', type: 'spki' }));
console.log('私钥:', privateKey.export({ format: 'pem', type: 'pkcs8' }));

// 使用私钥对消息进行签名
const signature = sign(message, privateKey);
console.log('签名:', signature);

// 使用公钥验证签名
const isValidSignature = verify(message, signature, publicKey);
console.log('签名验证结果:', isValidSignature ? '有效' : '无效');

2.2.2 DSA算法可应用的领域

        DSA(Digital Signature Algorithm)是一种非对称加密算法,主要用于数字签名和验证。与 RSA 不同,DSA 不是用于加密通信,而是用于确保数据的完整性和真实性。以下是 DSA 算法的一些主要应用领域:

  1. 数字证书:DSA 可用于生成数字证书中的数字签名,证明数字证书的真实性和合法性。数字证书在 SSL/TLS 连接、代码签名、电子邮件加密等方面起着重要作用。

  2. 身份认证:DSA 可用于生成和验证数字签名,用于身份认证过程。例如,在网络登录过程中,服务器可以使用 DSA 验证用户提供的数字签名,从而验证用户的身份。

  3. 文件认证:DSA 可用于对文件进行数字签名,证明文件的来源和完整性。这在软件发布、文件传输、电子合同等场景中非常有用。

  4. 电子投票:DSA 可用于保护电子投票系统的安全性和可信度。通过数字签名,可以确保选票的完整性和真实性,防止选票篡改和伪造。

  5. 电子支付:DSA 可用于数字支付系统中,以确保支付交易的真实性和不可否认性。数字签名可以用于验证支付请求的合法性,防止支付欺诈和非法访问。

  6. 网络安全协议:DSA 可以用于构建安全通信协议,如 IPsec、SSH 等,以确保通信的保密性和完整性。数字签名可以用于验证协议中的握手消息和认证数据。

  7. 法律合同:DSA 可用于数字化的法律合同和文件签署过程,以确保合同的合法性和完整性。数字签名可以用于代表合同签署者验证合同的真实性。

总的来说,DSA 在数字签名和验证领域有着广泛的应用,是确保数据完整性和真实性的重要工具。

三.非对称加密的优缺点

非对称加密有许多优点和一些缺点,下面是它们的主要特点:

优点:

  1. 更安全的密钥交换:非对称加密通过公钥进行加密,私钥进行解密,避免了对称加密中密钥交换的安全难题。公钥可以公开发布,而私钥仅由接收方持有,因此密钥交换更加安全。
  2. 数字签名:非对称加密可以用于生成数字签名,验证数据的完整性和真实性。数字签名在保护数据不被篡改和伪造方面具有重要作用。
  3. 密钥管理:非对称加密简化了密钥管理过程,因为公钥可以公开发布,而私钥仅由接收方持有,无需像对称加密那样需要安全地分发和管理密钥。
  4. 可信度:使用公钥加密的数据只能由持有相应私钥的实体解密,因此可以确保数据只能被预期的接收方访问,增加了数据的可信度。
  5. 可扩展性:非对称加密算法可以扩展到大量的通信方,每个实体都可以使用自己的密钥对进行加密和解密,而不需要额外的密钥管理。

缺点:

  1. 计算复杂性:与对称加密相比,非对称加密算法通常更加计算密集,因此加密和解密的速度较慢,特别是对于较长的密钥长度和大量的数据。
  2. 密钥长度:为了保证安全性,非对称加密算法需要使用相对较长的密钥长度,这导致加密和解密所需的计算资源更多,同时也增加了数据传输的成本。
  3. 数据大小限制:由于计算复杂性的原因,非对称加密算法通常不适用于加密大型数据,因此通常只用于加密对称密钥或数字签名等较小的数据。
  4. 安全性依赖:非对称加密算法的安全性依赖于难解的数学问题,例如大素数分解或离散对数问题。如果这些数学问题被解决或者存在有效的攻击方法,就会影响到非对称加密的安全性。

四.非对称加密与对称加密的比较

        非对称加密和对称加密是两种不同的加密技术,它们在性能、安全性和用途等方面有所不同。以下是它们之间的比较:

性能方面:

1.加密和解密速度:

  • 对称加密通常比非对称加密更快,因为它使用相同的密钥进行加密和解密操作,算法相对简单,执行效率高。
  • 非对称加密的加密和解密速度较慢,因为它需要进行复杂的数学运算,特别是对于较长的密钥长度和大量的数据。

2. 密钥长度:

  • 对称加密算法通常需要较短的密钥长度,因此加密和解密所需的计算资源较少。
  • 非对称加密算法通常需要较长的密钥长度,以确保安全性,这增加了加密和解密的计算复杂性和资源消耗。

安全性方面:

1. 密钥管理:

  •  对称加密需要安全地管理共享密钥,以防止第三方获取密钥并访问加密数据。
  • 非对称加密使用公钥加密和私钥解密,无需共享密钥,因此更容易管理密钥。

2.抵抗攻击:

  • 对称加密算法对于密钥泄露和中间人攻击等风险更为脆弱,因为只有一个密钥。
  • 非对称加密算法在一定程度上更加抵抗中间人攻击和密钥泄露,因为公钥可以公开发布,私钥仅由接收方持有。

用途:

1.适用场景:

  • 对称加密通常用于加密大量数据或实时通信,例如在加密文件、数据库和实时通信中广泛使用。
  • 非对称加密通常用于密钥交换、数字签名、身份认证等场景,例如在 SSL/TLS 握手、数字证书颁发和数字签名中使用。

2. 结合使用:
        通常情况下,非对称加密和对称加密会结合使用,以兼顾安全性和性能。例如,在对称加密中使用随机生成的对称密钥来加密数据,然后使用非对称加密的公钥来加密对称密钥,以实现安全的密钥交换。

总的来说,对称加密和非对称加密各有优缺点,根据具体的应用场景和需求选择合适的加密技术是非常重要的。


结语

以上为密码学中非对称加密的部分,不是很全面,希望大家可以在评论区一起讨论。

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值