elgamal加密算法 java_JAVA加解密17-非对称加密算法-ElGamal算法

本文详细介绍了ElGamal加密算法的工作原理,包括其与ECC算法的区别,以及它在数据传输中的单向性。通过Java代码展示了如何生成密钥对、公钥加密和私钥解密的过程,强调了该算法的密文会成倍增长的特点,以及与RSA算法的对比。
摘要由CSDN通过智能技术生成

一、概述

1.ElGamal算法和ECC算法基于离散对数问题

2.这个是一个单向的过程。虽然密钥对构造简单,但是只是乙方向另外一方单向传送数据进行加解密,不能反向操作

3.这里只有“公钥加密、私钥解密”这个过程

4.ElGamal不足之处就是 密文会成倍增长

5.ElGamal和RSA最大不同就是他们构造密钥对的方式不同。还有就是是否为双向加解密

二、模型分析

以甲方向乙方发送数据为模型

1.甲方构造密钥对(公钥+私钥),公布公钥给乙方

2.这里甲方没法给乙方发送数据了,只有乙方能给甲方传送数据

3.乙方用公钥对数据进行加密,传送给甲方,甲方用私钥对数据进行解密

三、代码实现

package com.ca.test;

import java.security.AlgorithmParameterGenerator;

import java.security.AlgorithmParameters;

import java.security.Key;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.Security;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.HashMap;

import java.util.Map;

import javax.crypto.Cipher;

import javax.crypto.interfaces.DHPrivateKey;

import javax.crypto.interfaces.DHPublicKey;

import javax.crypto.spec.DHParameterSpec;

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

import org.bouncycastle.jce.provider.BouncyCastleProvider;

/**

* 非对称加密算法ElGamal算法组件

* 非对称算法一般是用来传送对称加密算法的密钥来使用的。相对于RSA算法,这个算法只支持私钥加密公钥解密

* @author kongqz

* */

public class ElGamalCoder {

//非对称密钥算法

public static final String KEY_ALGORITHM="ElGamal";

/**

* 密钥长度,DH算法的默认密钥长度是1024

* 密钥长度必须是8的倍数,在160到16384位之间

* */

private static final int KEY_SIZE=256;

//公钥

private static final String PUBLIC_KEY="ElGamalPublicKey";

//私钥

private static final String PRIVATE_KEY="ElGamalPrivateKey";

/**

* 初始化密钥对

* @return Map 甲方密钥的Map

* */

public static Map initKey() throws Exception{

//加入对BouncyCastle支持

Security.addProvider(new BouncyCastleProvider());

AlgorithmParameterGenerator apg=AlgorithmParameterGenerator.getInstance(KEY_ALGORITHM);

//初始化参数生成器

apg.init(KEY_SIZE);

//生成算法参数

AlgorithmParameters params=apg.generateParameters();

//构建参数材料

DHParameterSpec elParams=(DHParameterSpec)params.getParameterSpec(DHParameterSpec.class);

//实例化密钥生成器

KeyPairGenerator kpg=KeyPairGenerator.getInstance(KEY_ALGORITHM) ;

//初始化密钥对生成器

kpg.initialize(elParams,new SecureRandom());

KeyPair keyPair=kpg.generateKeyPair();

//甲方公钥

PublicKey publicKey= keyPair.getPublic();

//甲方私钥

PrivateKey privateKey= keyPair.getPrivate();

//将密钥存储在map中

Map keyMap=new HashMap();

keyMap.put(PUBLIC_KEY, publicKey);

keyMap.put(PRIVATE_KEY, privateKey);

return keyMap;

}

/**

* 公钥加密

* @param data待加密数据

* @param key 密钥

* @return byte[] 加密数据

* */

public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{

//实例化密钥工厂

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//初始化公钥

//密钥材料转换

X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);

//产生公钥

PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);

//数据加密

Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, pubKey);

return cipher.doFinal(data);

}

/**

* 私钥解密

* @param data 待解密数据

* @param key 密钥

* @return byte[] 解密数据

* */

public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{

//取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//生成私钥

PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);

//数据解密

Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

/**

* 取得私钥

* @param keyMap 密钥map

* @return byte[] 私钥

* */

public static byte[] getPrivateKey(Map keyMap){

Key key=(Key)keyMap.get(PRIVATE_KEY);

return key.getEncoded();

}

/**

* 取得公钥

* @param keyMap 密钥map

* @return byte[] 公钥

* */

public static byte[] getPublicKey(Map keyMap) throws Exception{

Key key=(Key) keyMap.get(PUBLIC_KEY);

return key.getEncoded();

}

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

//初始化密钥

//生成密钥对

Map keyMap=ElGamalCoder.initKey();

//公钥

byte[] publicKey=ElGamalCoder.getPublicKey(keyMap);

//私钥

byte[] privateKey=ElGamalCoder.getPrivateKey(keyMap);

System.out.println("公钥:/n"+Base64.encodeBase64String(publicKey));

System.out.println("私钥:/n"+Base64.encodeBase64String(privateKey));

System.out.println("================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输=============");

String str="ElGamal密码交换算法";

System.out.println("/n===========甲方向乙方发送加密数据==============");

System.out.println("原文:"+str);

//乙方使用公钥对数据进行加密

byte[] code2=ElGamalCoder.encryptByPublicKey(str.getBytes(), publicKey);

System.out.println("===========乙方使用公钥对数据进行加密==============");

System.out.println("加密后的数据:"+Base64.encodeBase64String(code2));

//甲方使用私钥对数据进行解密

byte[] decode2=ElGamalCoder.decryptByPrivateKey(code2, privateKey);

System.out.println("甲方解密后的数据:"+new String(decode2));

}

}

控制台输出:

公钥:

MHgwUAYGKw4HAgEBMEYCIQD0uq+9qH/RFRMgdsbGP9scyNhsDF51I40kDUGYfDs9LwIhAMxG0VQV

ZBaqTMZzLeFGYO2SBQX2UMAnuiBzLhKEcPh1AyQAAiEA2eL2mHUbsm/3p9wNRLSaikuOmkRoIbbp

Ltvj8Lok3OE=

私钥:

MHkCAQAwUAYGKw4HAgEBMEYCIQD0uq+9qH/RFRMgdsbGP9scyNhsDF51I40kDUGYfDs9LwIhAMxG

0VQVZBaqTMZzLeFGYO2SBQX2UMAnuiBzLhKEcPh1BCICIHkLWWt3E212XnDAMZonNEE4tDbDtkVV

9GOHK/rBjAQi

================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输=============

===========甲方向乙方发送加密数据==============

原文:ElGamal密码交换算法

===========乙方使用公钥对数据进行加密==============

加密后的数据:d9HzNTy1AnEk9c7f6cUs7B6QRbHnMSd3666pfqlffC+ziJj0jYCcmV4Jso8eU1gTs57z8pjJB23j

mCB1A8uFjw==

甲方解密后的数据:ElGamal密码交换算法

四、总结

1.这个是一个单向传递数据的过程,这个和RSA不同,RSA的公钥私钥都可以用来做加解密数据的

2.这里java6不支持ElGamal算法,BouncyCastle支持这个算法

3.这里的公钥私钥长度几乎一致

4.这里只有“公钥加密、私钥解密”这一个原则

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值