非对称加密算法(RSA、ECC、SM2)——密码学基础

对称加密算法(AES、ChaCha20和SM4)Python实现------密码学基础(Python出现No module named "Crypto" 解决方案)

这篇的续篇,因此实践部分少些;


文章目录

  • 一、非对称加密算法基础
  • 二、RSA算法
    • [2.1 RSA原理与数学基础](#2.1 RSA原理与数学基础)
    • [2.2 RSA密钥长度与安全性](#2.2 RSA密钥长度与安全性)
    • [2.3 RSA实现工具与库](#2.3 RSA实现工具与库)
    • [2.4 RSA的局限性](#2.4 RSA的局限性)
  • 三、椭圆曲线密码学(ECC)
    • [3.1 ECC原理与数学基础](#3.1 ECC原理与数学基础)
    • [3.2 常用椭圆曲线标准](#3.2 常用椭圆曲线标准)
    • [3.3 ECC与RSA比较](#3.3 ECC与RSA比较)
    • [3.4 ECC实现工具与库](#3.4 ECC实现工具与库)
  • 四、国密算法SM2
    • [4.1 SM2算法概述](#4.1 SM2算法概述)
    • [4.2 SM2技术特点](#4.2 SM2技术特点)
    • [4.3 SM2与国际算法对比](#4.3 SM2与国际算法对比)
    • [4.4 SM2实现与应用](#4.4 SM2实现与应用)
  • 五、非对称加密实践建议
    • [5.1 密钥管理](#5.1 密钥管理)
    • [5.2 安全实现注意事项](#5.2 安全实现注意事项)
    • [5.3 混合加密系统设计](#5.3 混合加密系统设计)
    • [5.4 跨境合规与算法选择](#5.4 跨境合规与算法选择)
  • 六、未来发展与量子安全
    • [6.1 量子计算威胁](#6.1 量子计算威胁)
    • [6.2 后量子密码学](#6.2 后量子密码学)
    • [6.3 算法过渡策略](#6.3 算法过渡策略)
    • [6.4 永恒密钥问题与前向保密](#6.4 永恒密钥问题与前向保密)
  • 七、总结与建议
  • 附录:专业术语表

一、非对称加密算法基础

非对称加密概述

非对称加密是现代密码学的基石,它使用一对密钥(公钥和私钥)进行加密和解密操作。与传统的对称加密不同,非对称加密解决了密钥分发的难题,为互联网安全通信奠定了基础。

非对称加密的基本工作原理是:

  • 使用接收方的公钥加密信息,只有拥有对应私钥的接收方才能解密
  • 使用发送方的私钥签名信息,任何人都可以使用发送方的公钥验证签名的真实性

这种机制为网络通信带来了机密性、完整性和不可否认性等关键安全特性。

常见应用场景

非对称加密在日常数字生活中无处不在:

  • HTTPS安全通信:保护网络浏览安全
  • 数字签名:确保电子文档的真实性和完整性
  • PKI(公钥基础设施):管理和分发数字证书
  • SSH安全连接:保护远程服务器访问
  • 区块链与加密货币:保护数字资产交易
  • 安全电子邮件:加密敏感通信内容

二、RSA算法

2.1 RSA原理与数学基础

RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman三位密码学家于1977年提出,是最早的公钥密码系统之一,至今仍被广泛使用。

RSA的安全性基于大整数分解的计算困难性。其核心数学原理如下:

  1. 选择两个大质数p和q,计算乘积n = p × q
  2. 计算欧拉函数φ(n) = (p-1) × (q-1)
  3. 选择一个与φ(n)互质的整数e作为公钥指数
  4. 计算e的模反元素d,使得e × d ≡ 1 (mod φ(n)),d作为私钥指数
  5. 公钥为(n, e),私钥为(n, d)

加密过程:c = m^e mod n (其中m为明文)

解密过程:m = c^d mod n (其中c为密文)

2.2 RSA密钥长度与安全性

RSA的安全性主要取决于密钥长度,常见的密钥长度包括:

  • 1024位:已被认为不够安全,不应在新系统中使用
  • 2048位:当前推荐的最低标准,适合一般应用
  • 3072位:满足中等安全需求,预计安全至2030年
  • 4096位:提供更高安全性,适合对安全有极高要求的场景

密钥长度增加会降低性能,需要在安全性和效率之间权衡。美国国家标准与技术研究院(NIST)和各国密码管理机构会定期更新密钥长度推荐标准。

2.3 RSA实现工具与库

实现RSA加密时,应尽量使用经过充分测试的开源库,而非自行实现:

  • OpenSSL:跨平台的开源密码学工具包和库

    bash 复制代码
    # 生成RSA私钥
    openssl genrsa -out private.pem 2048
    # 从私钥提取公钥
    openssl rsa -in private.pem -pubout -out public.pem
    # 使用公钥加密文件
    openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt -out encrypted.txt
    # 使用私钥解密文件
    openssl rsautl -decrypt -inkey private.pem -in encrypted.txt -out decrypted.txt
  • 编程语言库:

    • Java: java.security和Bouncy Castle
    java 复制代码
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(2048);
    KeyPair pair = keyGen.generateKeyPair();
    PublicKey publicKey = pair.getPublic();
    PrivateKey privateKey = pair.getPrivate();
    • Python: cryptography和PyCryptodome
    python 复制代码
    from cryptography.hazmat.primitives.asymmetric import rsa
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048
    )
    public_key = private_key.public_key()
    • .NET: System.Security.Cryptography
    csharp 复制代码
    using (RSA rsa = RSA.Create(2048))
    {
        string publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey());
        string privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());
    }

2.4 RSA的局限性

尽管RSA广泛应用,但它也存在一些局限:

  • 性能问题:RSA运算相对耗时,不适合加密大量数据
  • 量子计算威胁:理论上,量子计算机可以使用Shor算法在多项式时间内分解大整数
  • 实现漏洞:不当实现可能导致侧信道攻击

在实际应用中,通常将RSA与对称加密结合使用:用RSA加密对称密钥,再用对称密钥加密实际数据,这种混合加密既保证了安全性,又提高了效率。


三、椭圆曲线密码学(ECC)

3.1 ECC原理与数学基础

椭圆曲线密码学基于椭圆曲线上的离散对数问题,其数学复杂度比整数分解更高,因此可以用更短的密钥提供同等安全级别。

ECC的基本椭圆曲线方程形式为:y² = x³ + ax + b (mod p)

其中关键的数学原理包括:

  1. 定义在有限域上的椭圆曲线点集
  2. 曲线上点的加法运算
  3. 点的标量乘法(即连续加法):Q = kP,已知P和k容易计算Q,但已知P和Q难以求解k

这一数学难题称为椭圆曲线离散对数问题(ECDLP),是ECC安全性的基础。

3.2 常用椭圆曲线标准

实际应用中,使用标准化的椭圆曲线参数集可确保安全性和互操作性:

  • NIST曲线:美国标准,如P-256、P-384和P-521
  • Brainpool曲线:欧洲标准,提供替代参数集
  • Curve25519和Curve448:更现代的曲线,设计目标是抵抗侧信道攻击
  • secp256k1:比特币和以太坊等加密货币使用的曲线

选择曲线时应考虑安全性、性能和各国监管要求。

3.3 ECC与RSA比较

ECC相比RSA的主要优势:

安全级别 RSA密钥长度 ECC密钥长度 ECC优势比例
80位 1024位 160-223位 约5倍
112位 2048位 224-255位 约8倍
128位 3072位 256-383位 约12倍
192位 7680位 384-511位 约20倍
256位 15360位 512位以上 约30倍

ECC的其他优势:

  • 更低的计算复杂度,特别适合资源受限设备
  • 更小的密文和签名大小,节省带宽和存储空间
  • 更快的密钥生成速度

缺点:

  • 实现复杂度高于RSA
  • 专利问题(部分曲线和实现)
  • 相对较新,长期安全性评估少于RSA

3.4 ECC实现工具与库

  • OpenSSL支持多种椭圆曲线:

    bash 复制代码
    # 查看支持的椭圆曲线
    openssl ecparam -list_curves
    
    # 生成ECC私钥(使用P-256曲线)
    openssl ecparam -name prime256v1 -genkey -noout -out private.pem
    
    # 从私钥提取公钥
    openssl ec -in private.pem -pubout -out public.pem
  • 编程语言库:

    • Java:
    java 复制代码
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
    ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1");
    keyGen.initialize(ecSpec);
    KeyPair pair = keyGen.generateKeyPair();
    • Python:
    python 复制代码
    from cryptography.hazmat.primitives.asymmetric import ec
    private_key = ec.generate_private_key(
        ec.SECP256R1()
    )
    public_key = private_key.public_key()
    • JavaScript (使用Web Crypto API):
    javascript 复制代码
    async function generateECDHKeys() {
      const keyPair = await window.crypto.subtle.generateKey(
        {
          name: "ECDH",
          namedCurve: "P-256"
        },
        true,
        ["deriveKey", "deriveBits"]
      );
      return keyPair;
    }

四、国密算法SM2

4.1 SM2算法概述

SM2是中国商用密码算法标准之一,由国家密码管理局于2010年发布,是基于椭圆曲线密码学的非对称加密算法。SM2是"国密"体系中的重要组成部分,与SM3(哈希算法)和SM4(对称加密算法)共同构建中国自主知识产权的密码体系。

SM2包含三部分功能:

  • 数字签名算法
  • 密钥交换协议
  • 公钥加密算法

4.2 SM2技术特点

SM2具有以下技术特点:

  • 基于椭圆曲线数学原理,曲线方程为:y² = x³ + ax + b (mod p)
  • 使用256位密钥长度,安全性等同于RSA 3072位
  • 采用中国自定义的椭圆曲线参数

4.3 SM2与国际算法对比

SM2与国际常用的ECC算法相比:

  • 安全性:理论上与同等密钥长度的国际ECC算法具有相当安全性
  • 性能:在中国设计的密码硬件上可能有更优的性能表现
  • 算法差异:采用不同的椭圆曲线参数和预处理方法
  • 应用范围:在中国政府、金融机构和关键基础设施中强制使用

对于跨国企业,需要同时支持国际标准和国密标准。

4.4 SM2实现与应用

SM2在中国有广泛应用:

  • 电子政务系统
  • 金融支付系统
  • 数字证书
  • 安全通信
  • 网络身份认证

实现SM2的工具与库:

  • GmSSL:支持国密算法的OpenSSL分支

    bash 复制代码
    # 生成SM2密钥对
    gmssl sm2keygen -out sm2.key
    
    # 从私钥提取公钥
    gmssl sm2pubout -in sm2.key -out sm2.pub
    
    # 使用公钥加密
    gmssl sm2encrypt -in plaintext.txt -inkey sm2.pub -out ciphertext.bin
    
    # 使用私钥解密
    gmssl sm2decrypt -in ciphertext.bin -inkey sm2.key -out decrypted.txt
  • 编程语言支持:

    • Java: Bouncy Castle提供SM2支持
    java 复制代码
    ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");
    kpg.initialize(sm2Spec);
    KeyPair keyPair = kpg.generateKeyPair();
    • Go: tjfoc/gmsm库
    go 复制代码
    import "github.com/tjfoc/gmsm/sm2"
    
    privateKey, _ := sm2.GenerateKey()
    publicKey := &privateKey.PublicKey

五、非对称加密实践建议

5.1 密钥管理

良好的密钥管理是非对称加密安全的基础:

  • 私钥保护:

    • 使用硬件安全模块(HSM)或可信平台模块(TPM)存储私钥
    • 加密存储私钥,使用强密码和密钥派生函数(KDF)
    • 实施最小权限原则,限制私钥访问
    • 定期轮换密钥,减少长期暴露风险
  • 公钥分发:

    • 使用可信的公钥基础设施(PKI)
    • 验证公钥指纹或哈希值
    • 使用带外渠道确认公钥
  • 密钥备份与灾难恢复:

    • 安全备份私钥,考虑分片存储
    • 制定密钥恢复流程,防止单点故障
    • 记录密钥元数据,如算法、长度、用途和过期日期

5.2 安全实现注意事项

非对称加密实现中的常见安全隐患:

  • 随机数生成:使用密码学安全的随机数生成器(CSPRNG)
  • 填充机制:采用OAEP等现代填充方案,避免传统PKCS#1 v1.5填充
  • 侧信道防护:实施恒定时间算法和内存清理
  • 算法参数验证:验证输入参数,防止小子群攻击等
  • 错误处理:使用一致的错误消息,避免泄露敏感信息

5.3 混合加密系统设计

实际应用中,通常将非对称加密与对称加密结合:

  1. 随机生成会话密钥(对称密钥)
  2. 使用非对称公钥加密会话密钥
  3. 使用会话密钥加密实际数据
  4. 传输加密的会话密钥和数据

这种方法结合了非对称加密的密钥管理优势和对称加密的性能优势。

TLS协议是混合加密的典型应用:

  • 使用非对称加密进行身份认证和密钥交换
  • 协商会话密钥后使用对称加密保护通信内容

5.4 跨境合规与算法选择

全球化业务面临的密码算法合规问题:

  • 中国:关键信息基础设施需使用国密算法(SM2/SM3/SM4)
  • 美国:政府系统通常使用NIST批准的算法
  • 欧盟:遵循ETSI和ENISA标准
  • 俄罗斯:某些场景要求使用GOST算法

解决方案:

  • 开发多算法支持架构
  • 实施区域性密码政策
  • 保持算法更新机制,应对新标准和安全威胁

六、未来发展与量子安全

6.1 量子计算威胁

量子计算对当前非对称加密构成严重威胁:

  • Shor算法:理论上可以在多项式时间内解决整数分解和离散对数问题
  • 影响:RSA、DSA、ECC等传统非对称算法将不再安全
  • 时间窗口:专家估计实用量子计算机可能在10-20年内出现

6.2 后量子密码学

为应对量子威胁,研究者开发了多种后量子密码算法:

  • 格密码:基于格中最短向量问题(SVP)和最近向量问题(CVP)的困难性
  • 基于哈希的签名:利用哈希函数的单向性构建签名方案
  • 多变量多项式:基于求解多变量非线性方程组的困难性
  • 基于编码的密码:利用解码随机线性码的困难性
  • 同态密码:支持对加密数据直接进行计算

NIST后量子密码标准化进程已选择多个候选算法,包括:

  • CRYSTALS-Kyber:格密码密钥封装机制(KEM)
  • CRYSTALS-Dilithium、FALCON和SPHINCS+:数字签名算法

6.3 算法过渡策略

组织应制定量子安全过渡计划:

  1. 密码敏捷性:设计支持快速算法更换的系统架构
  2. 混合方案:同时使用传统算法和后量子算法
  3. 风险评估:识别量子威胁下的关键资产和长期敏感数据
  4. 保持监控:跟踪量子计算进展和密码标准更新
  5. 早期采用:在非关键系统中试点后量子算法

6.4 永恒密钥问题与前向保密

应对"保存现在、破解未来"的威胁:

  • 实施前向保密机制:使用临时密钥,即使长期密钥泄露也不影响历史通信安全
  • 密钥限时:限制密钥使用时间,减少长期暴露风险
  • 数据生命周期管理:确定数据保护期限,超期数据安全销毁

七、总结与建议

基于不同场景的算法推荐:

  • 通用企业应用:RSA-2048或ECC P-256
  • 对性能敏感场景:优先选择ECC
  • 移动和物联网设备:ECC或轻量级后量子算法
  • 中国境内系统:遵循国密标准,使用SM2
  • 长期数据保护:考虑混合使用传统算法和后量子算法

定期评估密码系统安全性:

  • 密码算法及参数审查
  • 密钥管理流程评估
  • 实现安全性测试(包括侧信道分析)
  • 密码边界识别和保护
  • 加密文档与策略审查

密码学的真正目标不是创造隔离,而是在保障安全的前提下构建信任和连接。


附录:专业术语表

A

  • 非对称加密(Asymmetric Encryption):使用公钥和私钥对的加密系统

  • 认证(Authentication):验证身份或信息来源的过程
    B

  • 区块链(Blockchain):使用密码学链接的分布式账本技术

  • 暴力攻击(Brute Force Attack):通过尝试所有可能的密钥值来破解加密
    C

  • 密文(Ciphertext):经过加密的数据

  • 密码学(Cryptography):研究信息安全的科学

  • 证书(Certificate):包含公钥和身份信息的数字文档
    D

  • 解密(Decryption):将密文转换回明文的过程

  • 数字签名(Digital Signature):验证消息来源和完整性的密码机制
    E

  • 椭圆曲线密码学(Elliptic Curve Cryptography, ECC):基于椭圆曲线数学的加密方法

  • 加密(Encryption):将明文转换为密文的过程
    F

  • 前向保密(Forward Secrecy):确保即使长期密钥泄露也不影响过去通信安全的属性
    H

  • 哈希函数(Hash Function):将任意大小数据映射为固定大小值的单向函数

  • 硬件安全模块(Hardware Security Module, HSM):专用于密码操作的安全硬件设备
    K

  • 密钥(Key):控制加密和解密操作的参数

  • 密钥长度(Key Length):密钥的位数,影响安全强度

  • 密钥管理(Key Management):生成、存储、分发和销毁密钥的流程
    M

  • 明文(Plaintext):未加密的原始数据
    N

  • 随机数(Nonce):只使用一次的随机值,用于防止重放攻击
    O

  • OpenSSL:广泛使用的开源密码学工具包和库
    P

  • 公钥(Public Key):可公开分享的密钥,用于加密或验证签名

  • 私钥(Private Key):需保密的密钥,用于解密或创建签名

  • 公钥基础设施(Public Key Infrastructure, PKI):管理数字证书的系统和流程
    Q

  • 量子计算(Quantum Computing):利用量子力学原理进行计算的技术

  • 量子密码学(Quantum Cryptography):利用量子力学原理设计的密码系统
    R

  • RSA:基于大整数分解难题的非对称加密算法

  • 随机数生成器(Random Number Generator):生成随机值的算法或设备
    S

  • 签名(Signature):证明消息来源和完整性的加密结构

  • 侧信道攻击(Side-channel Attack):通过分析实现的物理特性破解密码系统

  • SM2:中国国家密码管理局发布的椭圆曲线公钥密码算法
    T

  • 传输层安全(Transport Layer Security, TLS):保护网络通信的加密协议
    Z

  • 零知识证明(Zero-knowledge Proof):证明者可以向验证者证明一个陈述是真实的,而不泄露除了该陈述为真之外的任何信息

相关推荐
山登绝顶我为峰 3(^v^)31 天前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
应长天3 天前
密码学(斯坦福)
密码学
Turbo正则4 天前
量子计算基础概念以及八大分支
密码学·量子计算
网安INF14 天前
公钥加密与签名算法计算详解(含计算题例子)
网络·算法·网络安全·密码学
KWMax15 天前
RSA加密原理及推导
加密·rsa
电院工程师15 天前
基于机器学习的侧信道分析(MLSCA)Python实现(带测试)
人工智能·python·嵌入式硬件·安全·机器学习·密码学
电院工程师17 天前
SM3算法C语言实现(无第三方库,带测试)
c语言·算法·安全·密码学
小七mod18 天前
【BTC】密码学原理
web3·区块链·密码学·比特币·btc·肖臻·北大区块链
电院工程师23 天前
轻量级密码算法PRESENT的C语言实现(无第三方库)
c语言·算法·安全·密码学
电院工程师24 天前
轻量级密码算法CHAM的python实现
python·嵌入式硬件·算法·安全·密码学