RSA加解密的应用

来源:互联网 发布:杀牛电击锤价格淘宝 编辑:程序博客网 时间:2024/05/17 09:44

先直接贴代码

package com.rsa;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;import org.apache.commons.codec.binary.Base64;public class jdkRSA {private static final String src = "Hello World!";public static void main(String[] args) {try {run();} catch (Exception e) {e.printStackTrace();}}public static void run() throws Exception{// 1.初始化秘钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(512); // 长度为64的倍数KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();System.out.println("公钥:"+Base64.encodeBase64String(rsaPublicKey.getEncoded()));System.out.println("私钥:"+Base64.encodeBase64String(rsaPrivateKey.getEncoded()));// 2.私钥加密 公钥解密--加密PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] result = cipher.doFinal(src.getBytes());System.out.println("私钥加密 公钥解密--加密:"+Base64.encodeBase64String(result));// 3.私钥加密 公钥解密--解密X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, publicKey);result = cipher.doFinal(result);System.out.println("私钥加密 公钥解密--解密:"+new String(result));// 4.公钥加密 私钥解密--加密x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");publicKey = keyFactory.generatePublic(x509EncodedKeySpec);cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);result = cipher.doFinal(src.getBytes());System.out.println("公钥加密 私钥解密--加密:"+Base64.encodeBase64String(result));// 5.公钥加密 私钥解密--解密pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);result = cipher.doFinal(result);System.out.println("公钥加密 私钥解密--解密:"+new String(result));}}
运行结果:

公钥:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKIWPgseI2RlErZnKhK+Wkmco6mI+kyuTRvy0Vt+RQ7RLcLP1GL4DsH2O8OBhGGfZcsij9h6AhYIZK0UNseKZaUCAwEAAQ==私钥:MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAohY+Cx4jZGUStmcqEr5aSZyjqYj6TK5NG/LRW35FDtEtws/UYvgOwfY7w4GEYZ9lyyKP2HoCFghkrRQ2x4plpQIDAQABAkBRXwM0x6OS8h7rzWzUzhU7oVSUdvzZZCO35TXvTbvTjKczdkBzOaSYMSCKk3+ZqqO9YV0QfNRffKBC3YJjBaG9AiEA7HKnzpKKK0ohdqOmj3+rwLXZ6BO9ZL9t5dKUsdxvhUsCIQCvfXIPD93JjxUqvtupy6RYqqVAqipvgZfUIOjRAPwazwIhAJp3dMTw2q7ZKO9WjfNlFpE4u/hvHOV6YZModNeVCI3tAiEArpceT6/YVnv8cg952N6Z/gCf8cqZ91+13rxzA+R37G8CIClID6+g+j4NfTVaHj46hOulkPOwOyCPMMjAbaDQ2jC8私钥加密 公钥解密--加密:eNs3iaOO+Hv8lGRWGlEQ2aXWmBdVhG4wGFNFnrOyp3FHTBOg99uBnZHzA3UrKcDULfYVQMiJsT6XOY4Vc4tSIw==私钥加密 公钥解密--解密:Hello World!公钥加密 私钥解密--加密:n9R5GnOZDdCcV4v2g3MH+XYSXw/KhbCQoypELd+i8XlKJXjI7b6N91KA9oY1DpxugDhJvGK1AUSmYhI1cmtZwQ==公钥加密 私钥解密--解密:Hello World!

总结:

1.RSA为最常用的非对称解密算法,相比DH代码更简练;

2.公钥和私钥都能实现加解密。一般,服务器端保存私钥,客户端保存公钥;

3.公钥基于X509EncodedKeySpec标准,私钥基于PKCS8EncodedKeySpec标准;

4.RSA秘钥长度需为64整数倍(建议使用1024bit,512已不再安全!);

5.RSA可用于加密和签名;

关于公钥私钥的使用:

1.虽然公钥是公开的,但是不是所有人都有公钥,公钥是提供给业务需要的第三方,即第三方的请求服务端都会通过解密处理;

2.公钥能保证拥有公钥的多个第三方之间的数据是安全的,即公钥是不能解密公钥加密的数据的,公钥加密的密文只能通过私钥解密;

3.然而通过私钥加密的密文,拥有相同公钥的多个第三方是可以解密的;

4.所以公钥也很重要,严禁泄露;

5.如果双方需要交换数据,即A发送消息给B,B也要回复消息给A,且消息只能由接收方可读,此处需要两套秘钥:

请求:A用B提供的公钥加密报文,B通过自己的私钥解密报文;

响应:B用A提供的公钥加密报文,A通过自己的私钥解密报文;

取长补短,RSA和DES结合实现长明文加解密:

1.RSA的加密明文受到加密秘钥的长度限制,所以长度过大的明文不宜用RSA加密,RSA安全(虽然被破解过,但消耗资源巨大,貌似花费了数天时间);

2.DES的加密明文不受加密秘钥的长度限制,可以通过DES加密长度过大的明文,但DES不安全(已被破解);

3.可以考虑,用RSA和DES互补实现报文传输的加解密:

请求:A用DES秘钥加密明文,并用B的RSA公钥加密DES的秘钥;B用自己的RSA私钥解密得到DES秘钥,并用DES秘钥解密得到明文;

响应:B用DES秘钥加密明文,并用A的RSA公钥加密DES的秘钥;A用自己的RSA私钥解密得到DES秘钥,并用DES秘钥解密得到明文;