加密算法(二)-非对称加密(RSA、ECC、DSA)一篇了解所有主流非对称加密,轻松上手使用。

一、非对称加密算法

        非对称加密算法运用一对密钥,也就是公钥和私钥。公钥用于加密,私钥用于解密。该算法的优点是安全性高,能有效解决密钥分发的问题,不过加密和解密的速度相对较慢。

1.1、RSA(主流)

        应用极为广泛的非对称加密算法,可用于加密和数字签名。其安全性建立在大整数分解的困难性之上。

优点

1.通用性强:是应用最广泛的非对称加密算法,几乎所有主流的编程语言和加密库都支持 RSA,在数字签名、密钥交换等场景中被广泛使用。

2.安全性基于成熟理论:其安全性基于大整数分解的困难性,这是一个经过深入研究的数学难题,在密钥长度足够长时,能提供较高的安全性。

3.功能丰富:既可以用于加密数据,也可以用于生成数字签名,能满足多种安全需求。

缺点

1.性能较低:加密和解密速度相对较慢,尤其是在处理大量数据时,效率明显低于对称加密算法。

2.密钥长度要求长:为了达到较高的安全性,需要使用较长的密钥,例如 2048 位甚至更长,这会增加密钥管理的难度和存储成本。

加密

// RSA 加密
    public static String rsaEncrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

解密

public static String rsaDecrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

结果

public static void main(String[] args) throws Exception {
        String plainText = "Hello, 感谢关注,精华内容将持续更新!";
        // RSA 测试
        KeyPairGenerator rsaKeyPairGenerator = KeyPairGenerator.getInstance("RSA");
        rsaKeyPairGenerator.initialize(2048);
        KeyPair rsaKeyPair = rsaKeyPairGenerator.generateKeyPair();
        PublicKey rsaPublicKey = rsaKeyPair.getPublic();
        PrivateKey rsaPrivateKey = rsaKeyPair.getPrivate();
        String rsaEncrypted = rsaEncrypt(plainText, rsaPublicKey);
        String rsaDecrypted = rsaDecrypt(rsaEncrypted, rsaPrivateKey);
        System.out.println("RSA 加密: " + rsaEncrypted);
        System.out.println("RSA 解密: " + rsaDecrypted);
    }

RSA 加密: Ys8gStnOThTB2nJwbecmV55AEgdNARQOT55tNZuDz37ck/j6UxLfUop8TRMOM7xSeUFrc4uD15PlkJqPsUkQXXzGpCRDf7E7gkfA5g4MBWsCC7hms4iOH65Z7nJRl3BeuMPdQ20lzWTuoRXK4c2AsdV6YZhuyx4ZXy1tnuOp2ROnas9LjWW/LStctVV4gw9QPTrnBkyAem3QNBq+RFYjBScoi56/b72DbYuZIdTAIavfpMzNHVzW5TiXIVYZWYyti4zkBNGhW3TJhmoU5ce1gw1oNjHYCWwVQgwSpuFNhr/fG48JAQbDpy/EfsUkh5IK9ntbHnR/X0D9UKd+6SySjg==
RSA 解密: Hello, 感谢关注,精华内容将持续更新!

1.2、ECC

        基于椭圆曲线数学原理的非对称加密算法,在相同的安全级别下,ECC 所需的密钥长度比 RSA 更短,因此具有更高的效率和更小的密钥存储空间。

优点

1.高安全性与短密钥:在相同的安全级别下,ECC 所需的密钥长度比 RSA 短很多,例如 256 位的 ECC 密钥与 3072 位的 RSA 密钥具有相当的安全性,这减少了密钥存储和传输的开销。

2.计算效率高:加密和解密速度快,尤其是在移动设备和资源受限的环境中,ECC 的性能优势更加明显。

3.带宽需求低:由于密钥长度短,签名和加密后的密文数据量也相对较小,降低了对网络带宽的要求。

缺点

1.算法复杂度高:椭圆曲线的数学原理相对复杂,实现难度较大,对开发者的技术要求较高。

2.应用普及度相对低:虽然 ECC 的优势明显,但在一些传统系统和应用中,RSA 仍然占据主导地位,ECC 的普及需要一定的时间。

加密

public static String eccEncrypt(String plainText, PublicKey publicKey) throws Exception {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance("ECIES", "BC");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

解密

public static String eccDecrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance("ECIES", "BC");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

结果

public static void main(String[] args) throws Exception {
        String plainText = "Hello, 感谢关注,精华内容将持续更新!";
        // ECC 测试
        KeyPairGenerator eccKeyPairGenerator = KeyPairGenerator.getInstance("EC");
        eccKeyPairGenerator.initialize(256);
        KeyPair eccKeyPair = eccKeyPairGenerator.generateKeyPair();
        PublicKey eccPublicKey = eccKeyPair.getPublic();
        PrivateKey eccPrivateKey = eccKeyPair.getPrivate();
        String eccEncrypted = eccEncrypt(plainText, eccPublicKey);
        String eccDecrypted = eccDecrypt(eccEncrypted, eccPrivateKey);
        System.out.println("ECC 加密: " + eccEncrypted);
        System.out.println("ECC 解密: " + eccDecrypted);
    }


ECC 加密: BDihrABFYVgdyQs2o75m2rLODXiHpdah1B7XQBu1VoJ6ggS36GvXXaMSxcB+hsXZ68/iSBzSQqSpaId5MqNCddN3zEyTNjXvPC2UW6veEs78wnt520OX7urT4azULyYgMsgp7HwDdP97RNVtyoNCCU4aJBz/JtEZ3Bg6s/KlAJyBiql//Q==
ECC 解密: Hello, 感谢关注,精华内容将持续更新!

1.3、DSA

        主要用于数字签名的非对称加密算法,它是美国政府采用的标准数字签名算法。DSA 基于离散对数问题,与 RSA 不同,它主要用于签名,而不用于加密数据。

优点

1.专注数字签名:专门为数字签名设计,在签名生成和验证方面具有较高的效率和安全性,能够有效防止数据被篡改和伪造。

2.美国政府标准:是美国政府采用的标准数字签名算法,具有较高的权威性和认可度。

缺点

1.功能单一:只能用于数字签名,不能用于加密数据,适用场景相对较窄。

2.密钥管理复杂:与 RSA 相比,DSA 的密钥管理和分发过程较为复杂,需要额外的安全措施来保证密钥的安全性。

加密

 public static String dsaSign(String data, PrivateKey privateKey) throws Exception {
        Signature dsa = Signature.getInstance("SHA256withDSA");
        dsa.initSign(privateKey);
        dsa.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] signatureBytes = dsa.sign();
        return Base64.getEncoder().encodeToString(signatureBytes);
    }

解密

 public static boolean dsaVerify(String data, String signature, PublicKey publicKey) throws Exception {
        Signature dsa = Signature.getInstance("SHA256withDSA");
        dsa.initVerify(publicKey);
        dsa.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] signatureBytes = Base64.getDecoder().decode(signature);
        return dsa.verify(signatureBytes);
    }

结果

public static void main(String[] args) throws Exception {
        String plainText = "Hello, 感谢关注,精华内容将持续更新!";
        // DSA 测试
        KeyPairGenerator dsaKeyPairGenerator = KeyPairGenerator.getInstance("DSA");
        dsaKeyPairGenerator.initialize(2048);
        KeyPair dsaKeyPair = dsaKeyPairGenerator.generateKeyPair();
        PublicKey dsaPublicKey = dsaKeyPair.getPublic();
        PrivateKey dsaPrivateKey = dsaKeyPair.getPrivate();
        String dsaSignature = dsaSign(plainText, dsaPrivateKey);
        boolean dsaVerified = dsaVerify(plainText, dsaSignature, dsaPublicKey);
        System.out.println("DSA 加密: " + dsaSignature);
        System.out.println("DSA 解密: " + dsaVerified);
    }


DSA 加密: MDwCHBEwUZkEZIYMs+ELpLCrADbU7Ba1eCIlfhgagIwCHCZ59qZ+U3C4Os2URLKPLlM7S/WuynjJsQxdTkE=
DSA 解密: true

通过以上内容便可轻轻松松使用是非对称加密算法.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值