首页 > 编程语言 >对称加密、非对称加密、详解 RSA 非对称加密算法

对称加密、非对称加密、详解 RSA 非对称加密算法

时间:2024-07-08 13:28:11浏览次数:12  
标签:公钥 加密 RSA 密钥 对称 非对称 加密算法

文章目录

对称加密和非对称加密

对称加密和非对称加密是密码学中两种基本的加密技术,它们在加密和解密过程中使用密钥的方式不同,各自有着独特的特性和适用场景。

想象一个数学魔术,你让朋友想一个3位数,然后乘以91,只告诉你结果的后三位。看似信息丢失,但我乘以11就能猜出原数,因为91×11=1001,任何3位数乘1001,后三位不变。

基于此,构建加密系统:数乘400000001(=19801×20201),后8位不变。你乘19801,我乘20201,形成不对称加密。更复杂如4000000000000000000000000000001=1199481995446957×3334772856269093,造就30位加密。

此方法酷在任何人都能加密,唯独我知道解密。安全性基于乘法易做,质因数难求,尤其无电脑时代。但若知原理和条件,目标值易猜。故真实加密如RSA,用指数和模运算,本质相同。

核心思想:利用特定数学性质构造加密系统,保证加密容易,解密需知特定“密钥”。。

对称加密

对称加密示意图

特点:

  • 高效性:由于使用相同的密钥,对称加密算法的速度较快,适用于加密大量数据。
  • 密钥管理:对称加密的一个主要挑战是密钥的安全分发。如果密钥被第三方截获,那么加密信息就可能被破解。因此,密钥的安全传递和保护至关重要。
  • 常见算法:DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、RC4、Blowfish等。

非对称加密

非对称加密示意图

非对称加密也被称为公钥加密,它使用一对密钥:公钥和私钥。公钥可以公开,用于加密信息;私钥必须保密,用于解密信息。这意味着任何人都可以使用你的公钥加密信息发送给你,但只有你才能使用自己的私钥解密这些信息。

特点:

  • 安全性:非对称加密比对称加密更安全,因为私钥不需要在网络上进行传输,减少了密钥被截获的风险。
  • 效率:相比于对称加密,非对称加密的计算开销较大,速度较慢,因此通常不用于大量数据的直接加密。
  • 密钥管理:非对称加密简化了密钥管理,因为公钥可以公开,而私钥保持秘密。这解决了对称加密中密钥分发的难题。
  • 常见算法:RSA、DSA(Digital Signature Algorithm)、ECC(Elliptic Curve Cryptography)等。

应用场景:

  • 对称加密:适用于需要高速加密大量数据的场景,如加密存储在硬盘上的文件、数据库加密等。
  • 非对称加密:适用于需要安全通信但难以安全地分发密钥的场景,如HTTPS通信、数字签名、加密电子邮件等。

在实际应用中,往往将对称加密和非对称加密结合起来使用,以利用两者的优点。例如,HTTPS通信中,首先使用非对称加密交换一个临时的对称密钥,然后使用这个对称密钥进行后续的数据加密传输,这样既保证了安全性又保持了较高的传输效率。

RSA 非对称加密算法

RSA是非对称加密算法的一种,它的名字来源于三位发明者的名字首字母——Ron Rivest、Adi Shamir和Leonard Adleman。RSA算法的安全性基于大整数分解问题的难度,也就是说,对于两个大素数的乘积,分解它们回到原来的素数是非常困难的,尤其是在没有足够计算资源的情况下。

RSA算法详细解释

RSA是非对称加密算法的一种,它的名字来源于三位发明者的名字首字母——Ron Rivest、Adi Shamir和Leonard Adleman。RSA算法的安全性基于大整数分解问题的难度,也就是说,对于两个大素数的乘积,分解它们回到原来的素数是非常困难的,尤其是在没有足够计算资源的情况下。

下面是使用Markdown语法对RSA算法的详细解释:

  1. 密钥生成

    • 选择两个大的随机素数( p )和( q )。
    • 计算它们的乘积( n = pq ),( n )的长度通常在1024到4096比特之间。
    • 计算欧拉函数( \phi(n) = (p-1)(q-1) )。
    • 选择一个整数( e ),满足( 1 < e < \phi(n) )并且( e )和( \phi(n) )互质。
    • 计算( d ),使得( ed \equiv 1 \pmod{\phi(n)} )。换句话说,找到( d )使得( ed - 1 )是( \phi(n) )的倍数。

    公钥是( (n, e) ),私钥是( (n, d) )。

  2. 加密过程

    • 假设要加密的消息( m )是一个小于( n )的整数。
    • 使用公钥( (n, e) )加密消息( m )得到密文( c ):( c = m^e \mod n )。
  3. 解密过程

    • 使用私钥( (n, d) )解密密文( c )得到原始消息( m ):( m = c^d \mod n )。

RSA算法之所以有效,是因为( m^{ed} \equiv m \pmod{n} )。这是因为( ed \equiv 1 \pmod{\phi(n)} ),所以( m^{ed} )实际上等于( m )加上( \phi(n) )的倍数,这确保了在模( n )意义下,( m^{ed} )和( m )是相同的。

RSA的安全性依赖于大整数分解问题的难度,即给定( n ),很难找到( p )和( q )。然而,随着量子计算机的发展,使用Shor’s算法可以在多项式时间内解决大整数分解问题,从而威胁到RSA的安全性。因此,对于未来的安全考虑,正在研究和采用后量子加密算法。

需要注意的是,实际应用中,RSA通常不会直接用于大量数据的加密,因为其加密速度较慢。相反,它常被用于加密对称密钥,然后使用对称密钥加密大量数据,这种方法称为混合加密。

RSA算法的使用

在Java中,RSA非对称加密算法可以通过Java Cryptography Extension (JCE) API来实现。JCE提供了加密、解密、签名以及验证签名的功能。以下是在Java中使用RSA的基本步骤和示例代码:

步骤1: 生成密钥对
首先,你需要生成一个RSA密钥对,包括公钥和私钥。这通常通过KeyPairGenerator类完成。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

public class RSADemo {
    public static void main(String[] args) {
        try {
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
            keyGen.initialize(2048); // 设置密钥长度,例如2048位
            KeyPair keyPair = keyGen.generateKeyPair();
            
            // 获取公钥和私钥
            java.security.PublicKey publicKey = keyPair.getPublic();
            java.security.PrivateKey privateKey = keyPair.getPrivate();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

步骤2: 加密数据

使用公钥加密数据,这通常通过Cipher类完成。

import javax.crypto.Cipher;
import java.security.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.PublicKey;

public class RSADemo {
    // 假设你已经有了publicKey和privateKey
    private static PublicKey publicKey;
    private static java.security.PrivateKey privateKey;

    public static byte[] encryptData(byte[] data, PublicKey publicKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

步骤3: 解密数据

使用私钥解密数据,同样使用Cipher类。

public class RSADemo2 {
    // 假设你已经有了publicKey和privateKey
    private static PublicKey publicKey;
    private static java.security.PrivateKey privateKey;

    public static byte[] decryptData(byte[] encryptedData, java.security.PrivateKey privateKey) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(encryptedData);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

注意事项

  • RSA加密的数据大小有限制,一般不超过密钥长度减去一些开销。
  • 在实际应用中,RSA通常用于加密对称密钥而不是直接加密大量数据,后者通过更高效的对称加密算法如AES完成。
  • 为了提高安全性,建议使用更长的密钥长度,比如4096位。

以上代码片段展示了如何在Java中使用RSA算法进行基本的加密和解密。在实际项目中,你可能还需要处理异常,以及可能的性能优化,比如分块加密/解密较大的数据集。

在其他方面的应用

RSA非对称加密算法在信息安全领域有广泛的应用,除了基本的加密和解密之外,还包括但不限于以下几个方面:

  1. 数字签名
    RSA可以用于创建数字签名,这是通过私钥加密一小段数据(通常是消息摘要)来实现的。任何人都可以使用与私钥相对应的公钥来验证签名的真实性。数字签名确保了数据的完整性和来源的认证。

  2. 安全通信
    RSA可以用于在通信双方之间建立安全通道,例如在TLS/SSL协议中,公钥可以用来加密对称密钥,然后这个对称密钥用于加密会话中的数据,这种方式结合了非对称和对称加密的优点。

  3. 密钥交换
    RSA可以用于安全地交换对称加密密钥。例如,在Diffie-Hellman密钥交换中,可以使用RSA作为额外的安全层来保护密钥。

  4. 身份验证
    RSA可以用于身份验证过程,例如在SSH协议中,客户端使用其私钥证明其身份给服务器端,而服务器使用存储的公钥来验证签名。

  5. 软件分发
    软件开发商可以使用RSA签名来签署其软件,这样用户就可以确认软件的来源和完整性,防止恶意篡改。

  6. 证书管理
    在PKI(公钥基础设施)中,RSA用于创建和验证数字证书,这些证书包含公钥,并由信任的第三方(证书颁发机构)签名,以保证公钥属于特定实体。

  7. 安全存储
    RSA可以用于加密存储在硬盘、USB驱动器或其他存储介质上的敏感数据,确保即使物理介质被盗也无法访问数据。

  8. 法律和合规性
    在某些行业和法规中,RSA签名可以用于确保合同和其他法律文件的电子版本具有法律效力。

  9. 区块链和加密货币
    在区块链技术中,RSA或类似的非对称加密技术用于创建和验证交易签名,确保交易的有效性和不可篡改性。

  10. 云服务安全
    在云环境中,RSA可以用于保护客户数据的隐私,确保只有授权用户才能访问加密数据。

由于RSA算法的计算成本较高,它通常用于加密较小的数据量,如密钥、签名或简短的信息,而对于大量数据则使用对称加密算法,同时使用RSA加密对称密钥。

参考:
https://www.zhihu.com/question/33645891/answer/192604856

标签:公钥,加密,RSA,密钥,对称,非对称,加密算法
From: https://blog.csdn.net/weixin_68020300/article/details/140263893

相关文章

  • 透明加密是什么丨企业用透明加密软件分享
    一、为什么需要透明加密技术在当今数字化的时代,数据已成为企业最宝贵的资产之一。然而,数据泄露的风险也日益增加,这使得透明加密技术成为保护企业数据安全的关键手段。首先,用户无感知的特性确保了员工在日常工作中无需为加密和解密操作分心,从而保持工作效率。例如,员工在编辑文......
  • Spring 配置文件加密
    前文在某些场景下,使用Spring作为开发组件时,不可避免地需要使用到配置文件,然而,对于配置文件中的某些敏感数据(如密码等信息字段),如果使用明文的方式,则可能在一定程度上导致信息泄露。为此,需要一种有效的方式来对这些字段进行加密处理,当前主流的一种加密方式就是Jasypt基本使用......
  • 非堆成加密是公私钥使用
    对称加密学习-CSDN博客加密算法学习-CSDN博客非对称加密算法使用一对密钥,包括一个公钥和一个私钥,它们是数学上相关联的,但公钥可以公开分享,而私钥必须保密。以下是使用非对称加密算法的一般步骤:密钥生成:用户首先生成一对密钥,包括一个私钥和一个公钥。私钥必须安全存储,不能......
  • 陪玩app源码,加密算法中密钥生成和读取一览
    陪玩app源码,加密算法中密钥生成和读取一览密钥生成与读取密码学随机数密码学随机数算法在安全场景中使用广泛,如:生成对称密钥、盐、iv等,因此相比普通的随机数算法(如线性同余),它需要更高强度的不可预测性,在Java中,使用SecureRandom来生成更安全的随机数,如下:publicclass......
  • 陪玩小程序源码,不容错过的加密算法整理清单
    陪玩小程序源码,不容错过的加密算法整理清单在开发陪玩小程序源码时,可采用的加密算法类型包含:对称加密对称加密算法,使用Cipher类即可,以广泛使用的AES为例,如下:publicbyte[]encrypt(byte[]data,Keykey){try{Ciphercipher=Cipher.getInstance("......
  • Python:自制密码的加密与破译
    importtkinterastkupper_password={'A':('△','▽','○'),'B':('◇','□','☆'),'C':('▷','◁','♤'),'D':('♡&......
  • 企业加密软件推荐丨全方位防止文件泄密
    在当前数字化、信息化快速发展的时代,企业面临的数据安全挑战日益严峻。数据泄露不仅会导致商业机密的丢失,还可能引发法律诉讼、经济损失和声誉损害等一系列连锁反应。因此,企业必须采取有效的防泄密措施,以确保其核心资产的安全。以下是对企业为什么需要防泄密以及市场上一些防......
  • 源代码防泄密很重要!2024源代码加密软件推荐
    一、源代码防泄密的重要性源代码作为软件的核心资产,其防泄密工作至关重要。一旦源代码泄露,可能引发一系列严重后果。知识产权被盗用,意味着竞争对手可能凭借获取的源代码迅速开发出相似产品,抢占市场份额。例如,某创新型软件公司研发的独特算法源代码被泄露,竞争对手很快推出了功......
  • vue项目中使用AES实现密码加密解密ECB和CBC模式)
    ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准) 1.先安装crypto-......
  • 常见加密解密算法及其在 PHP 中的实现
    加密和解密算法在信息安全中起着至关重要的作用。以下是一些常见的加密和解密算法,包括对称加密、非对称加密和哈希算法。对称加密算法对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括:AES(AdvancedEncryptionStandard):AES是一种广泛使用的对称加密算法,支......