java 非对称加密有哪些_Java编程实现非对称加密的方法详解

本文实例讲述了Java编程实现非对称加密的方法。分享给大家供大家参考,具体如下:

对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

是一种 高级的双保险加密方式,一般的实现加密方式有DH密钥交换算法,RSA基于因子分解算法,ElGamal离散对数算法及ECC椭圆曲线加密等。

DH加密解密

/**

* 非对称加密之:DH加密

* 非对称DH,是安全性基于在有限域中计算离散对数的难度的一种加密算法。

* 可用于密钥分发,但不能用于加/解密报文。DH即Diffie-Hellman算法的简写,也缩写为D-H算法。

* D-H加密算法的核心思想就是大素数不可分解质因数的数学理论方法。

* @description:

* @date 2015-10-29 上午9:08:14

*/

public class EncryptDH {

private static String dhStr = "encrypt test by DH";

public static void main(String[] args) {

jdkDh();

}

private static void jdkDh() {

try {

// 初始化发送方密钥

KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");

senderKeyPairGenerator.initialize(512);

KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();

byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();// 发送方的公钥,发送给接受方,发送方式多种,比如文件,网络等

// 初始化接受方密钥

KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");

X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);

PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);

DHParameterSpec dhParameterSpec = ((DHPublicKey) receiverPublicKey).getParams();

KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");

receiverKeyPairGenerator.initialize(dhParameterSpec);

KeyPair receiveKeyPair = receiverKeyPairGenerator.generateKeyPair();

PrivateKey receiverPrivateKey = receiveKeyPair.getPrivate();

byte[] receiverPublicKeyEnc = receiveKeyPair.getPublic().getEncoded();

// 密钥构建

KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");

receiverKeyAgreement.init(receiverPrivateKey);

receiverKeyAgreement.doPhase(receiverPublicKey, true);

SecretKey receiverSecretKey = 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 snederSecretKey = senderKeyAgreement.generateSecret("DES");

if (Objects.equals(receiverSecretKey, snederSecretKey)) {

System.out.println("双方密钥相同");

}

// 加密

Cipher cipher = Cipher.getInstance("DES");

cipher.init(Cipher.ENCRYPT_MODE, snederSecretKey);

byte[] result = cipher.doFinal(dhStr.getBytes());

System.out.println("DH加密后为:" + Base64.encode(result));

// 解密

cipher.init(Cipher.DECRYPT_MODE, receiverSecretKey);

result = cipher.doFinal(result);

System.out.println("DH解密后为:" + new String(result));

}

catch (Exception e) {

e.printStackTrace();

}

}

}

RSA加密解密

/**

* 非对称加密之:RSA加密

* @description:

* RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。

* 1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

* RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

* 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

* 但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

* RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

* @date 2015-10-29 上午9:08:14

*/

public class EncryptRSA {

private static String rsaStr = "encrypt test by ElGamal";

public static void main(String[] args) {

jdkRSA();

}

private static void jdkRSA() {

try {

// 初始化密钥

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("RSA公钥:" + Base64.encode(rsaPublicKey.getEncoded()));

System.out.println("RSA私钥:" + Base64.encode(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(rsaStr.getBytes());

System.out.println("RSA私钥加密,公钥解密--加密:" + Base64.encode(result));

// 私钥加密,公钥解密--解密

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("RSA私钥加密,公钥解密--解密:" + new String(result));

// 公钥加密,私钥解密--加密

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(rsaStr.getBytes());

System.out.println("公钥加密,私钥解密--加密:" + Base64.encode(result));

// 公钥加密,私钥解密--解密

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();

}

}

}

ElGamal加密

/**

* 非对称加密之:ElGamal加密

* @description:

* ElGamal算法,是一种较为常见的加密算法,它是基于1984年提出的公钥密码体制和椭圆曲线加密体系。

* 既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。

* 在加密过程中,生成的密文长度是明文的两倍,且每次加密后都会在密文中生成一个随机数K,

* 在密码中主要应用离散对数问题的几个性质:求解离散对数(可能)是困难的,而其逆运算指数运算可以应用平方-乘的方法有效地计算。

* 也就是说,在适当的群G中,指数函数是单向函数。

* @date 2015-10-29 上午9:08:14

*/

public class EncrypElGamal {

private static String rsaStr = "encrypt test by ElGamal";

public static void main(String[] args) {

jdkRSA();

}

private static void jdkRSA() {

try {

// 公钥加密,私钥解密

// Security.addProvider(new BouncyCastleProvider());//需要添加bouncycastleprovider jar

//初始化密钥

AlgorithmParameterGenerator algorithmParameterGenerator=AlgorithmParameterGenerator.getInstance("ElGamal");

algorithmParameterGenerator.init(256);

AlgorithmParameters algorithmParameters=algorithmParameterGenerator.generateParameters();

DHParameterSpec dhParameterSpec=algorithmParameters.getParameterSpec(DHParameterSpec.class);

KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("ElGamal");

keyPairGenerator.initialize(dhParameterSpec,new SecureRandom());

KeyPair keyPair=keyPairGenerator.generateKeyPair();

PublicKey publicKey=keyPair.getPublic();

PrivateKey privateKey=keyPair.getPrivate();

System.out.println("ElGamal加密公钥:"+Base64.encode(publicKey.getEncoded()));

System.out.println("ElGamal加密私钥:"+Base64.encode(privateKey.getEncoded()));

//加密解密同Rsa是一样的

}

catch (Exception e) {

e.printStackTrace();

}

}

}

Ecc加密可以参考:http://www.pediy.com/kssd/pediy06/pediy6014.htm等。

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:http://tools.jb51.net/password/hash_md5_sha

希望本文所述对大家java程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值