非对称加密(DH、RSA、ELGamal)

非对称加密算法属于高等加密、双保险。以下demo演示各个算法的加解密过程

DH密钥交换算法(需要构建本地密钥);RSA基于因子分解;ELGamal基于离散对数。

均由JDK提供支持,无需导包。

 

其中RSA算法是唯一广泛接受并实现,成为事实上的标准。用于数据加密和数字签名。

支持钥加密、私钥解密私钥加密、公钥解密

 

ELGamal因为运行速度较慢,仅作了解

 

1、DH

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import java.security.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Objects;


/**
 * @Author Rhine
 * @Date 2019/1/18 1:30
 **/
public class ImoocDH {

    private static String src="imooc security dh";

    public static void main(String[] args) {
        jdkDH();
    }

    public static void jdkDH(){
        try {
            //1.初始化发送方密钥
            KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
            senderKeyPairGenerator.initialize(512);
            KeyPair senderKeyPair=senderKeyPairGenerator.generateKeyPair();
            byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();//发送方公钥,发送给接收方(网络、文件)


            //2.初始化接受方的密钥
            KeyFactory keyFactory =KeyFactory.getInstance("DH");
            X509EncodedKeySpec x509EncodedKeySpec =new X509EncodedKeySpec(senderPublicKeyEnc);
            PublicKey receiverPublicKey =keyFactory.generatePublic(x509EncodedKeySpec);
            DHParameterSpec dhGenParameterSpec=((DHPublicKey)receiverPublicKey).getParams();

            KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
            receiverKeyPairGenerator.initialize(dhGenParameterSpec);
            KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair();
            PrivateKey receiverPrivateKey = receiverKeyPair.getPrivate();
            byte[] receiverPublicKeyEnc=receiverKeyPair.getPublic().getEncoded();


            //3.密钥构建
            KeyAgreement receiverkeyAgreement =KeyAgreement.getInstance("DH");
            receiverkeyAgreement.init(receiverPrivateKey);
            receiverkeyAgreement.doPhase(receiverPublicKey,true);
            SecretKey receiverDesKey = receiverkeyAgreement.generateSecret("DES");

            KeyFactory senderKeyFactory =KeyFactory.getInstance("DH");
            x509EncodedKeySpec=new X509EncodedKeySpec(receiverPublicKeyEnc);
            PublicKey senderPublicKey=senderKeyFactory.generatePublic(x509EncodedKeySpec);
            KeyAgreement senderKeyAgreement=KeyAgreement.getInstance("DH");
            senderKeyAgreement.init(senderKeyPair.getPrivate());
            senderKeyAgreement.doPhase(senderPublicKey,true);

            //发送方的本地密钥
            SecretKey senderDesKey = senderKeyAgreement.generateSecret("DES");

            if (Objects.equals(receiverDesKey,senderDesKey)){
                System.out.println("双方的密钥相同");
            }

            //4.加密
            Cipher cipher=Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE,senderDesKey);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("jdk dh encrypt: "+ Base64.encodeBase64String(result));

            //5.解密
            cipher.init(Cipher.DECRYPT_MODE,senderDesKey);
            result=cipher.doFinal(result);
            System.out.println("jdk dh decrypt: "+new String(result));

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

2、RSA

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * @Author Rhine
 * @Date 2019/1/18 20:24
 **/
public class ImoocRSA {
    private static String src="imooc security rsa";

    public static void main(String[] args) {
        jdkRSA();
    }

    public static void jdkRSA(){
        try {
            //1.初始化密钥
            KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(512);
            KeyPair keyPair=keyPairGenerator.genKeyPair();
            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()));

            //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.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));


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值