前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >加密与安全_探索非对称加密算法_RSA算法

加密与安全_探索非对称加密算法_RSA算法

作者头像
小小工匠
发布于 2024-05-26 05:17:19
发布于 2024-05-26 05:17:19
22000
代码可运行
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构
运行总次数:0
代码可运行

Pre

加密与安全_探索密钥交换算法(Diffie-Hellman算法) 中我们可以看到,公钥-私钥组成的密钥对是非常有用的加密方式,因为公钥是可以公开的,而私钥是完全保密的,由此奠定了非对称加密的基础。

对称加密确实是一种非常有用的加密方式,其基础就是公钥和私钥组成的密钥对。公钥可以公开,而私钥则是完全保密的,这种特性为非对称加密提供了很好的安全性。

在非对称加密中,加密和解密使用的不是相同的密钥。只有同一个密钥对中的公钥和私钥才能正常地进行加密和解密操作

因此,如果小明要向小红发送加密文件,他应该首先向小红索取她的公钥。然后,小明使用小红的公钥对文件进行加密,并将加密后的文件发送给小红。由于只有小红持有与公钥对应的私钥,因此只有小红能够使用她的私钥解密这个文件。其他人无法使用公钥解密文件,因为只有私钥的持有者才能解密数据。

这种方式确保了文件在传输过程中的安全性,只有具备私钥的接收方才能解密文件,保护了通信的机密性。

主流的非对称加密算法

主流的非对称加密算法包括:

  1. RSA(Rivest-Shamir-Adleman): RSA是最常用的非对称加密算法之一,它基于大数分解的数学难题。RSA算法可以用于加密、数字签名和密钥交换等场景,广泛应用于网络通信、数据传输和身份认证等领域。
  2. DSA(Digital Signature Algorithm): DSA是一种数字签名算法,专门用于生成和验证数字签名,常用于身份认证、数据完整性验证等场景。DSA算法基于离散对数的数学难题,相对于RSA算法,它的加密和解密速度更快。
  3. ECC(Elliptic Curve Cryptography): ECC是一种基于椭圆曲线的非对称加密算法,具有与RSA相当的安全性,但在密钥长度较短的情况下提供了更高的安全性,因此在资源受限的环境下更加适用。
  4. ElGamal: ElGamal是一种基于离散对数的非对称加密算法,主要用于密钥交换和加密通信。与RSA类似,ElGamal算法也可以用于加密和数字签名,但相对于RSA,ElGamal算法在实现和使用上更为复杂。

这些非对称加密算法在不同的场景下有着各自的优缺点和适用性,选择合适的算法取决于具体的安全需求、性能要求和应用环境。

典型算法:RSA

非对称加密的典型算法就是RSA算法,它是由Ron Rivest、Adi Shamir和Leonard Adleman这三位密码学家共同发明的,因此用他们三人的姓的首字母缩写表示。

相比对称加密,非对称加密有显著的优点。对称加密需要在通信双方之间协商共享密钥,而非对称加密则可以安全地公开各自的公钥。

  • 在N个人之间进行通信时,使用非对称加密只需要N个密钥对,每个人只需管理自己的密钥对。
  • 而使用对称加密时,则需要N*(N-1)/2个密钥,因此每个人需要管理N-1个密钥,密钥管理的难度大,并且容易导致密钥泄漏。

非对称加密的缺点就是运算速度非常慢,比对称加密要慢很多。 在实际应用中,通常会将非对称加密和对称加密结合使用,以充分发挥它们各自的优点,并弥补彼此的缺点。

假设小明需要向小红传输加密文件,他们可以采取以下步骤:

  1. 小明和小红首先交换各自的公钥,这可以在安全的通信渠道上完成。
  2. 小明生成一个随机的对称密钥(比如AES口令),然后使用小红的公钥通过RSA算法对这个对称密钥进行加密,得到密文。
  3. 小明将加密后的对称密钥发送给小红。
  4. 小红使用自己的RSA私钥对收到的密文进行解密,得到原始的对称密钥。
  5. 现在,小明和小红都拥有相同的对称密钥,他们可以使用对称加密算法(如AES)来加密和解密通信内容。由于对称加密算法的运算速度快,因此通信双方可以更高效地进行加密通信。

通过这种方式,非对称加密用于安全地传输对称密钥,而对称加密用于加密和解密实际的通信内容,既保证了安全性,又提高了效率。

Code

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.artisan.securityalgjava.rsa;

import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class RSAExample {

    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPair keyPair = generateRSAKeyPair();

        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // 要加密的原始数据
        String plaintext = "Hello, RSA!";
        System.out.println("Plaintext: " + plaintext);

        // 使用公钥加密数据
        byte[] encryptedBytes = encryptRSA(plaintext.getBytes(), publicKey);
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted text: " + encryptedText);

        // 使用私钥解密数据
        byte[] decryptedBytes = decryptRSA(Base64.getDecoder().decode(encryptedText), privateKey);
        String decryptedText = new String(decryptedBytes);
        System.out.println("Decrypted text: " + decryptedText);
    }

    // 生成RSA密钥对
    public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 设置密钥长度为2048位
        return keyPairGenerator.generateKeyPair();
    }

    // 使用公钥加密数据
    public static byte[] encryptRSA(byte[] data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    // 使用私钥解密数据
    public static byte[] decryptRSA(byte[] encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(encryptedData);
    }
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Plaintext: Hello, RSA!
Encrypted text: CU+9ZlNmH3NR5SZSdpZRQmTyXQLU0SLX1d1ICoi/LjAu6a4lMsVXUfB+STFHglKOTVCEjddCJwoWVGXJDcm/nTqRVtB/qIV3+kt7W4/H2fvLeYf+mgbIyNNMyZU4h7k0rbVSTIdHpmfcV1ToYPNVtYarHQ0EbmD261iKeGBGb9HrprknspsXxfIMAEeKOEFotE/4fkwySCsWatANwOwjivEqZcDBnX/1BlhA9CIP4zd4osUoiRt/wJtBsx58/A+47Lf2wBo7C8YcRRpa2A8HxtxnOkhy0cciVeaAzMtaaiVDWbaBqML3sXu3iP3CDkrZQ2+VmBCTZX35y1fxCZ1/Dg==
Decrypted text: Hello, RSA!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.artisan.securityalgjava.rsa;

import javax.crypto.Cipher;
import java.math.BigInteger;
import java.security.*;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class RsaDemo {

    public static void main(String[] args) throws Exception {
        // 明文:
        byte[] plain = "Hello, encrypt use RSA".getBytes("UTF-8");
        // 创建公钥/私钥对
        Person alice = new Person("Alice");
        // 用Alice的公钥加密:
        byte[] pk = alice.getPublicKey();
        System.out.println(String.format("public key: %x", new BigInteger(1, pk)));
        byte[] encrypted = alice.encrypt(plain);
        System.out.println(String.format("encrypted: %x", new BigInteger(1, encrypted)));

        // 用Alice的私钥解密:
        byte[] sk = alice.getPrivateKey();
        System.out.println(String.format("private key: %x", new BigInteger(1, sk)));
        byte[] decrypted = alice.decrypt(encrypted);
        System.out.println(new String(decrypted, "UTF-8"));
    }
}

class Person {
    String name;
    // 私钥:
    PrivateKey sk;
    // 公钥:
    PublicKey pk;

    public Person(String name) throws GeneralSecurityException {
        this.name = name;
        // 生成公钥/私钥对:
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
        kpGen.initialize(1024);
        KeyPair kp = kpGen.generateKeyPair();
        this.sk = kp.getPrivate();
        this.pk = kp.getPublic();
    }

    /**
     * 把私钥导出为字节
     * @return
     */
    public byte[] getPrivateKey() {
        return this.sk.getEncoded();
    }

    /**
     *  把公钥导出为字节
     * @return
     */
    public byte[] getPublicKey() {
        return this.pk.getEncoded();
    }

    /**
     * 用公钥加密
     * @param message
     * @return
     * @throws GeneralSecurityException
     */
    public byte[] encrypt(byte[] message) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, this.pk);
        return cipher.doFinal(message);
    }

    /**
     * 用私钥解密
     * @param input
     * @return
     * @throws GeneralSecurityException
     */
    public byte[] decrypt(byte[] input) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, this.sk);
        return cipher.doFinal(input);
    }
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public key: 30819f300d06092a864886f70d010101050003818d00308189028181008c97547fab56c9af0f54d814581a7d695e0722c7029751e4d05530d28923c45ac29420e8cec253a71043e98dae2139cee1d97e125f73c0b32a91196a7154c3199cf6529942627e50796463fc7ab6c747ab0788fe67d3855c9f9348233277ef68d663c2df1232c5adb6d7d9be0aefe5e6c0bcdda48abf9570d732878b93c5bc6d0203010001
encrypted: 24bac571932a8f2c633660493a57e895e404c03824ba8fff87bfaaa655914eaeabd032beed102d24479c21e1c17ccfea5018708da42e28ec7e2f472b36f769f0aa0639bdff985babdbce3a9d357a89dcf31df2b00366f16708245c2a75a3c5d25aedd25207f3204416a6e431f305bd49b90eb0d40d6caed2bb4f068c183fb442
private key: 30820275020100300d06092a864886f70d01010105000482025f3082025b020100028181008c97547fab56c9af0f54d814581a7d695e0722c7029751e4d05530d28923c45ac29420e8cec253a71043e98dae2139cee1d97e125f73c0b32a91196a7154c3199cf6529942627e50796463fc7ab6c747ab0788fe67d3855c9f9348233277ef68d663c2df1232c5adb6d7d9be0aefe5e6c0bcdda48abf9570d732878b93c5bc6d02030100010281806b2753f1d2875d449decce9c02e27dbf7738fd1aad30e3ebff954e96c88b88369ca305ca2afc1581f975a966a0d716164630dc53e88872d09b9ae7c2270ab17f80e36bc78532d68216ecb3a62bc4ab84be8b6db08c48568622f2216e29609f3ae6db825c13d503554a923fe62850cd6fcf2221315c98946c3fd47c79f6bc5089024100fcc240d520a5106544a5cc764c9149c35fca005b9af0fcb5999fa5e4b69a1a5ca19f732e5a2633c0ceeceb7cc433e39f5fca0c7c9a1679ff9990029170adfe070241008e64db6f5b7270a69d4082c88db9c8c9909519b535bd8bf898f2fc6f3d7ac00c1fa8d2fa4614cb851f64f7bea021d60e5d27fe5f5aa0c21e0f05ef5f54e314eb0240460aca8e850258ddc73d2ec0a58d2964b3b9b589ad1114e67a10cc96e9a720a104c4bbd55f73f0a9806e14ffb91b2bfbb13ebb61180e1c76a126501fdf9ac7a7024020845bb0045c0fe99c837cda3bb32f6d083d644f836433b0a38ce9a4a58f8087c43b1362dfda23d7d4a18409de1b9bfc4fbdb0532a2907eb415703a0eb8ba7dd02401fee6a8ef7af9c5c723215500003984e5ded1bd31061ce5396bf5b55ab7cdbe8b6024863fd466eb8de13318863f485af479cc66b8d8a858f02b9b3254b0c1562
Hello, encrypt use RSA

RSA的公钥和私钥的恢复

RSA的公钥和私钥都可以通过getEncoded()方法获得以byte[]表示的二进制数据,并根据需要保存到文件中。

伪代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
byte[] pkData = ...
byte[] skData = ...
KeyFactory kf = KeyFactory.getInstance("RSA");
// 恢复公钥:
X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(pkData);
PublicKey pk = kf.generatePublic(pkSpec);
// 恢复私钥:
PKCS8EncodedKeySpec skSpec = new PKCS8EncodedKeySpec(skData);
PrivateKey sk = kf.generatePrivate(skSpec);

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.artisan.securityalgjava.rsa;

import java.security.*;
import java.security.spec.*;
import java.util.Base64;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */

public class RSAKeyConversionExample {

    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPair keyPair = generateRSAKeyPair();

        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // 将公钥和私钥转换为byte[]数组
        byte[] publicKeyBytes = publicKey.getEncoded();
        byte[] privateKeyBytes = privateKey.getEncoded();

        // 将byte[]数组转换为Base64编码的字符串方便保存和传输
        String publicKeyBase64 = Base64.getEncoder().encodeToString(publicKeyBytes);
        String privateKeyBase64 = Base64.getEncoder().encodeToString(privateKeyBytes);

        System.out.println("Public key (Base64): " + publicKeyBase64);
        System.out.println("Private key (Base64): " + privateKeyBase64);

        // 从Base64编码的字符串恢复公钥和私钥
        PublicKey restoredPublicKey = restorePublicKey(Base64.getDecoder().decode(publicKeyBase64));
        PrivateKey restoredPrivateKey = restorePrivateKey(Base64.getDecoder().decode(privateKeyBase64));

        // 验证恢复的公钥和私钥与原始的是否一致
        System.out.println("Restored public key equals original: " + publicKey.equals(restoredPublicKey));
        System.out.println("Restored private key equals original: " + privateKey.equals(restoredPrivateKey));
    }

    // 生成RSA密钥对
    public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 设置密钥长度为2048位
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 从byte[]数组恢复公钥
     * @param publicKeyBytes
     * @return
     * @throws Exception
     */
    public static PublicKey restorePublicKey(byte[] publicKeyBytes) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
        return keyFactory.generatePublic(publicKeySpec);
    }

    /**
     * 从byte[]数组恢复私钥
     * @param privateKeyBytes
     * @return
     * @throws Exception
     */
    public static PrivateKey restorePrivateKey(byte[] privateKeyBytes) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        return keyFactory.generatePrivate(privateKeySpec);
    }
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public key (Base64): MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApd4mRIUmxWx9+Jrp/Gp06gqRbgsGdy36Dshvrkz5ofiKe6guRfP/swimmsdZItPpfWJNn2BKQzTL32gSiZ5y+uU7EpkEDmg2Z6ip5jb0Dpt0/cTldD7ykG6AMlnpJwoFQXgNTCpgqOOhFRNRPTBLUjeVMeNeJPoVQKipdFTVrUU5NCZSHgvBWjngELmLZDdj1sJ/vCyEol1eg9N1G8c9kcyhbAhSGX7BSq3q/heuOPGjzHVTMJb2mKvGPst7fYdmUyVvW+ovF7AMf8AfemLrdZJ+mxi4dj2X5c2fKcNK32+zfJNhpQMdaLZtbHAAyvSVc6xGxiYYGAuUrFnGiY26XwIDAQAB
Private key (Base64): MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCl3iZEhSbFbH34mun8anTqCpFuCwZ3LfoOyG+uTPmh+Ip7qC5F8/+zCKaax1ki0+l9Yk2fYEpDNMvfaBKJnnL65TsSmQQOaDZnqKnmNvQOm3T9xOV0PvKQboAyWeknCgVBeA1MKmCo46EVE1E9MEtSN5Ux414k+hVAqKl0VNWtRTk0JlIeC8FaOeAQuYtkN2PWwn+8LISiXV6D03Ubxz2RzKFsCFIZfsFKrer+F6448aPMdVMwlvaYq8Y+y3t9h2ZTJW9b6i8XsAx/wB96Yut1kn6bGLh2PZflzZ8pw0rfb7N8k2GlAx1otm1scADK9JVzrEbGJhgYC5SsWcaJjbpfAgMBAAECggEAMndY5Vgt57uOyGk58Bbj46G7hePM384ZWw4ZDMtW2LUqTV1qVtZaYjqrlkQ5FqOrUv7p5ygA8FnL/flISp7vFO9R/eKYnVmP1BI5P1ZRA3DBM8UIm0nbu54jWy6IBdzCpJzGTvpF1p0LkcIC4b8j66wFtNwc9NsyRC4NANwe90ytm6/HrsoUlRgMeJv9QejfA8A3+VrF1Y1ozn7aSuElX6q7tdZ0kNEGN7qVdl1qilmcMiPpMLC5k7J7WpTeVZGeQM3Akm2LnbcAS5QMkSyhSZWj0n3e+kGRdmCBdRRCGQVsk2qeTahYZvtv1hJRe0mUbDEC/DWSDFLJudbSa5GAAQKBgQDxMFGpiQZ5IWrxh4Rh2CPJpZB1UfQjC5NI0kcKx8jXGp/GXoGfpcjmmF7yRg9ASeG1oOioZKdktSo7KRsSLKetG+L3W+pHkPaPMz/Vt788XuWAZKlBUJ0+02czeRjXDXY0B6Ik4uJ9okRuKO4EndWVhT/bSC2f6khergOe6HPqXwKBgQCwDbllyfGsRS0yn31KcNTjG2E9FMh9uhRP+0wcJR1dDqsXimQ1KE1cdWRsGWolA5oXaR8jNtSUc3NhuyYnjSoI/S2Z8VYnKdfDNb8x6pPV1RxCW5gRT2vrRxBnnN9bkI5ABhRKQslmAq+I0mYAueUGU+6c7iwNIfC8U+Kn+9gwAQKBgQCCQqloGdRAKXc7uQgbXAOADYYmhruHDeJe6wppXRswaXWvSi1RztThDZwB1yq3eu+HC7976tipQFrtlrbDKxDoIm6DT8YJHta64l/wigujjFEA9dyfpO04GC7dkuKCiwey9AhzSYIvfirdIAfkwGWxGkUxphrWCk9Jq0vTUBICmwKBgB62djZssW11L/pZ2ninEGyCNUd7nbJZSPvfAhsS2nmGepCDwxGG82AC1r8I+/xzEWmuHBF/mjw/m8xb4r8ZoFCrIk5tzLLOWOakNLOXkazHHcPxyKiUa2ZDIniA5HJL2JUQum9uEUZrh4Xd9o9/3pVpBQJ5hlPQLPgdxje59rABAoGAbXZS1iNDOJCw+FG2YsCxUWl0fqwW41ldT6qplckCZ/oZuMNXdxCI3ZNhS1juo0A9dL4tu1wJqHdenlYlmxcVpXfz65n2mdXIULnW4eQts5qKyxY/DImJbrxi0qrRGLd0C/GMxpChjoWLrT4in87JI9PiuJT8OpNq/kgs/z3V4VQ=
Restored public key equals original: true
Restored private key equals original: true

以RSA算法为例,它的密钥有256/512/1024/2048/4096等不同的长度。长度越长,密码强度越大,当然计算速度也越慢

如果修改待加密的byte[]数据的大小,可以发现,使用512bit的RSA加密时,明文长度不能超过53字节,使用1024bit的RSA加密时,明文长度不能超过117字节,这也是为什么使用RSA的时候,总是配合AES一起使用,即用AES加密任意长度的明文,用RSA加密AES口令。

RSA算法的加密和解密操作中,密钥长度会影响可以处理的数据大小。一般来说,RSA加密操作能处理的最大数据块大小取决于密钥长度和填充模式。

在常见的填充模式下(如PKCS#1 v1.5或OAEP填充),RSA加密时需要对明文进行填充以满足算法要求的固定长度。这意味着,即使密钥长度较长,但实际能够加密的明文长度仍然受到限制

对于RSA加密,加密前需要对数据进行填充,以保证数据块的大小不超过密钥长度。填充的过程会增加一定的开销。一般来说,填充过程会使得实际能够加密的明文长度比密钥长度小一些。

具体来说,对于一个RSA密钥,它能够加密的最大数据块大小等于密钥长度减去一些填充的开销。因此,较短的密钥长度会限制加密的数据块大小。

在实际应用中,RSA算法的密钥长度一般选择较大的值(如2048位或更高),以提高安全性。但是,由于RSA算法加密的性能相对较慢,特别是在处理较大数据块时,因此通常不适合直接用于加密大量数据。相反,RSA常常与对称加密算法(如AES)结合使用,以提高性能和安全性。

因此,通常的做法是,使用RSA加密对称密钥(如AES密钥),然后使用对称密钥加密要传输的数据。这样既能保证安全性,又能提高加密和解密的性能。

小结

除了无法防止中间人攻击外,非对称加密算法还有一些其他缺点:

  1. 性能低下: 非对称加密算法的计算复杂度比对称加密算法高很多,特别是在处理大量数据时,性能会受到明显影响。因此,非对称加密算法通常用于密钥交换和数字签名等场景,而不适合直接加密大量数据。
  2. 密钥长度限制: 非对称加密算法的密钥长度会直接影响其安全性,通常需要选择较长的密钥长度以确保安全性。然而,较长的密钥长度会导致加密和解密的速度变慢,从而增加了计算的开销。
  3. 密钥管理复杂: 非对称加密算法需要管理公钥和私钥,密钥的生成、存储、分发和更新都需要一定的机制和流程来保证安全性。特别是在大规模系统中,密钥管理可能会变得非常复杂和困难。
  4. 安全性依赖于实现和使用: 非对称加密算法的安全性取决于其算法的设计和实现,以及密钥的生成和使用方式。如果实现存在漏洞或者密钥管理不当,可能会导致加密系统的安全性受到威胁。

综上所述,虽然非对称加密算法在密钥交换和数字签名等方面具有重要的作用,但其性能和安全性方面存在一些局限性,因此在实际应用中需要根据具体情况综合考虑,选择合适的加密方案。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
非对称加密之RSA是怎么加密的
前几天阿粉刚刚说了这个 MD5 加密的前世今生,因为 MD5 也确实用的人不是很多了,阿粉就不再继续的一一赘述了,今天阿粉想给大家分享的,是非对称加密中的一种,那就是 RSA 加密算法。
Java极客技术
2022/12/04
1.3K0
JAVA非对称加密算法-RSA算法
这篇文章上次修改于 255 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 一、概述 RSA是基于大数因子分解难题。目前各种主流计算机语言都支持RSA算法的实现 java6支持RSA算法 RSA算法可以用于数据加密和数字签名 RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多 总原则:公钥加密,私钥解密 / 私钥加密,公钥解密 二、模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 甲方将数据用私钥进
Erwin
2019/12/31
3.7K0
RSA非对称加密
需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,所以只要私钥不泄露,那么我们的数据就是安全的。
会跳舞的机器人
2018/09/03
1.6K0
浅谈RSA加密算法
一、什么是非对称加密 1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2、密钥分为:公钥,私钥    公钥:可以对外给任何人的加密和解密的密码,是公开的      私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑) 3、当将要加密的内容用公钥加密的时候,只能用私钥来解密      当将要加密的内容用私钥加密的时候,只能用公钥来解密 4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系 5、常见的非对称加密算
听着music睡
2018/05/18
2.1K0
Java加密与解密之非对称加密算法
非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥解密,反之私钥加密只能用公钥解密。相比对称加密算法,非对称加密算法加/解密效率低,但安全性高,这两种算法一般结合使用。常见非对称加密算法有RSA、ECC、Elgamal等。
布禾
2020/11/24
1.2K0
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
加密算法通常被分为两种:对称加密算法和非对称加密算法。其中,对称加密算法在加密和解密时使用的密钥相同;非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是对数据进行摘要并且不可逆的算法。
万猫学社
2022/04/22
1.6K0
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
每日一博 - 对称加密算法 vs 非对称加密算法
我们今天来梳理一下将分别介绍这两种加密算法的优缺点,并通过Java代码实现和测试结果来验证其效果。
小小工匠
2023/05/29
4930
RSA 非对称加密原理(小白也能看懂哦~)
RSA 加密原理 步骤 说明 描述 备注 1 找出质数 P 、Q - 2 计算公共模数 N = P * Q - 3 欧拉函数 φ(N) = (P-1)(Q-1) - 4 计算公钥E 1 < E < φ(N) E的取值必须是整数 E 和 φ(N) 必须是互质数 5 计算私钥D E * D % φ(N) = 1 - 6 加密 C = M E mod N C:密文 M:明文 7 解密 M =C D mod N C:密文 M:明文 公钥=(E , N) 私钥=(D, N) 对外,我们只暴露公钥。 示例 1、
java404
2018/05/18
6.5K2
加密与安全_使用Java代码操作RSA算法生成的密钥对
在数字化时代,网络通信的安全性是必须关注的重要问题之一。非对称加密算法作为现代密码学的重要组成部分,为保护通信的隐私提供了一种可靠的解决方案。
小小工匠
2024/05/26
2240
加密与安全_使用Java代码操作RSA算法生成的密钥对
JAVA使用几种非对称加密
DH: package com.fengyunhe.asymmetric; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; import javax.crypto.*; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import java.security.*; import java.security
前Thoughtworks-杨焱
2021/12/08
4590
加密解密(RSA)非对称加密算法
RSA加解密是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman于1977年提出。它的概念是基于两个密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。
一百减一是零
2024/08/04
3070
说一下你常用的加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
Java旅途
2020/07/23
1.9K0
Java安全之安全加密算法
本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多。了解的层次只是基于加密算法的一些应用上。也来浅谈一下加密算法在安全领域中的作用。写本篇文也是基于算法的应用和实现,也是我的基本原则,能用就行。
全栈程序员站长
2021/04/07
1.4K0
Java安全之安全加密算法
【Java小工匠聊密码学】--非对称加密--RSA1
  RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。   对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
Java小工匠
2018/08/10
8270
深入解析RSA算法原理及其安全性机制
RSA算法是一种广泛使用的公钥加密算法,它的名称来源于其创始人Ron Rivest、Adi Shamir和Leonard Adleman的首字母缩写。该算法于1977年首次被提出,并迅速成为公钥密码学的标准之一。RSA算法的安全性基于大数分解和离散对数等数学难题,使得它在保护数据隐私和完整性方面具有很高的可靠性。
公众号:码到三十五
2024/04/02
2.1K0
深入解析RSA算法原理及其安全性机制
RSA加密算法心得
RSA加密密钥是非对称的,一般是成对出现分为公钥和私钥,所以也叫非对称加密,可以公钥加密,私钥解密,也可以私钥加密,公钥解密。
全栈程序员站长
2022/09/02
1K0
基于JAVA的RSA非对称加密算法简单实现
  RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
CodeWwang
2022/08/24
8390
基于JAVA的RSA非对称加密算法简单实现
请看,常见的加密算法及详解都在这里!
加密算法,是现在每个软件项目里必须用到的内容。广泛应用在包括了用户登入、数字签名、数据传输等多个场合。那大家都知道那些呢?今天我把常见的加密算法全部整理在这里,供大家学习参考。
攻城狮的那点事
2019/12/10
1.5K0
学一学RSA加密吧,下次对接的时候就不会被对方Diss了
RSA加密算法:是一种非对称加密算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密,加密和解密需要两个不同的密钥,因此被称为非对称加密,加密的双方在开发前根据明文的长度/数据加密等级需要协定好密钥的位数,目前可使用1024、2048、4096字节的密钥(key),安全性随字节长度升高而升高,性能随之而下降,时间复杂度为O(nlogn)。
关忆北.
2021/12/07
1.2K0
[Java 安全]加密算法
Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别。 Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的A
静默虚空
2018/01/05
4K0
[Java 安全]加密算法
相关推荐
非对称加密之RSA是怎么加密的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档