非对称加密--RSA

来源:互联网 发布:js自动触发function 编辑:程序博客网 时间:2024/05/17 12:53

1、非对称加密--RSA

package com.lijy.RSA;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;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;/** * @author Lijingyu on 2017/9/13. */public class ImoocRSA {    private static String src = "待加密字符串";    public static void main(String[] args) {         jdkRSA();    }    public static void jdkRSA(){        try {            //1、初始化密钥            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");            keyPairGenerator.initialize(512);            KeyPair keyPair = keyPairGenerator.generateKeyPair();            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();            System.out.println("Public key:" + Base64.encodeBase64String(rsaPublicKey.getEncoded()));            System.out.println("Private key:" + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));            //私钥加密、公钥解密==加密            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.print("私钥加密、公钥解密:" + 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.print("公钥加密、私钥解密:" + 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.print("公钥加密、私钥解密:" + new String(result));        }        catch (Exception e) {            e.printStackTrace();        }    }}

2、私钥加密、公钥解密

发送者:1、使用私钥加密数据 2、发送加密数据给接收者
接收者:3、使用公钥解密数据

3、公钥加密、私钥解密

发送者:1、使用公钥加密数据 2、发送加密数据给接收方
接收者:3、使用私钥解密数据

4、生成密钥长度为2048位的公钥和私钥

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;import sun.misc.BASE64Encoder;import javax.crypto.Cipher;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;public class RSATest {    public static String src = "RSA 加密字符串";    public static void main(String[] args) {        jdkRSA();    }    public static void jdkRSA() {        try {            //1.初始化密钥            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");            keyPairGenerator.initialize(2048);//密钥长度            KeyPair keyPair = keyPairGenerator.generateKeyPair();//初始化密钥对            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();//公钥            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();//私钥            System.out.println("公钥" + new String(new BASE64Encoder().encodeBuffer(rsaPublicKey.getEncoded())));            System.out.println("私钥" + new String(new BASE64Encoder().encodeBuffer(rsaPrivateKey.getEncoded())));            //2.私钥加密,公钥解密----加密 生成私钥            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());            KeyFactory keyFactory = KeyFactory.getInstance("RSA");            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);            //Cipher类为加密和解密提供密码功能,通过getinstance实例化对象            Cipher cipher = Cipher.getInstance("RSA");            //初始化加密            cipher.init(Cipher.ENCRYPT_MODE, privateKey);            byte[] result = cipher.doFinal(src.getBytes());            System.out.println("私钥加密,公钥解密----加密:" + Base64.encode(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));        }        catch (Exception e) {            e.printStackTrace();        }    }}