非对称加密算法(1):DH
来源:互联网 发布:在线ppi计算器软件 编辑:程序博客网 时间:2024/06/07 12:33
一.非对称加密算法:对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
二.优缺点:
非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
三.常用算法:非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等
四.DH 实现个过程
五.具体的实现代码(java):
import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher;import javax.crypto.KeyAgreement;import javax.crypto.SecretKey;import javax.crypto.interfaces.DHPublicKey;import javax.crypto.spec.DHParameterSpec;import org.apache.commons.codec.binary.Base64;public class F_Symmetry_Encrypt {static String src = "我爱编程";public static void main(String[] args) throws Exception {// TODO Auto-generated method stub//初始化发送方的公钥KeyPair senderkeyPair = DH_GetSecretKey();byte [] senderPublicKeyEnc = senderkeyPair.getPublic().getEncoded();//接收方的公钥PublicKey receivePublicKey = DH_ReceiverPulicKey_GetSecretKey(senderPublicKeyEnc);//接收方的私钥KeyPair receivekeyPair = DH_ReceiverPrivateKey_GetSecretKey(receivePublicKey);PrivateKey receiveprivateKey = receivekeyPair.getPrivate();//接收方的秘钥SecretKey receivesecretKey = DH_Receiver_GetSecretKey(receivePublicKey,receiveprivateKey);byte[] receivePublicKeyEnc = receivekeyPair.getPublic().getEncoded();//构建发送方的公钥PublicKey senderPublicKey = DH_SenderPublicKey_GetSecretKey(receivePublicKeyEnc);//构建发送方的秘钥 SecretKey sendersecretKey = DH_Sender_GetSecretKey(senderkeyPair,senderPublicKey);//接收方加密数据 byte [] result = DH_Encrypt(src,receivesecretKey);System.out.println("加密数据:"+Base64.encodeBase64String(result));//发送方解密数据 System.out.println("解密数据:"+new String(DH_Decrypt(result,sendersecretKey)));}/** * 发送方解密数据 * @param encryptBytes * @param sendersecretKey * @return * @throws Exception */public static byte [] DH_Decrypt(byte[] encryptBytes , SecretKey sendersecretKey) throws Exception{Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE, sendersecretKey);byte [] result = cipher.doFinal(encryptBytes);return result;}/** * 接收方数据加密 * @param src * @param receivesecretKey * @return * @throws Exception */public static byte [] DH_Encrypt(String src , SecretKey receivesecretKey) throws Exception{Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, receivesecretKey);byte [] result = cipher.doFinal(src.getBytes());return result;}/** * 发送方的秘钥构建 ,根据接收方的公钥 * @param senderkeyPair * @param senderPublicKey * @return * @throws NoSuchAlgorithmException * @throws InvalidKeyException */public static SecretKey DH_Sender_GetSecretKey(KeyPair senderkeyPair,PublicKey senderPublicKey) throws NoSuchAlgorithmException,InvalidKeyException {KeyAgreement senderkeyAgreement = KeyAgreement.getInstance("DH");senderkeyAgreement.init(senderkeyPair.getPrivate());senderkeyAgreement.doPhase(senderPublicKey, true);SecretKey sendersecretKey = senderkeyAgreement.generateSecret("DES");return sendersecretKey;}/** * 发送方的公钥构建 ,根据接收方的公钥 * @param receivePublicKeyEnc * @return * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */public static PublicKey DH_SenderPublicKey_GetSecretKey(byte[] receivePublicKeyEnc) throws NoSuchAlgorithmException,InvalidKeySpecException {KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(receivePublicKeyEnc);PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);return senderPublicKey;}/** * 接收方的秘钥构建 ,根据接收方的公钥,私钥 * @param receivePublicKey * @param receiveprivateKey * @return * @throws NoSuchAlgorithmException * @throws InvalidKeyException */public static SecretKey DH_Receiver_GetSecretKey(PublicKey receivePublicKey, PrivateKey receiveprivateKey)throws NoSuchAlgorithmException, InvalidKeyException {KeyAgreement receivekeyAgreement = KeyAgreement.getInstance("DH");receivekeyAgreement.init(receiveprivateKey);receivekeyAgreement.doPhase(receivePublicKey, true);SecretKey receivesecretKey = receivekeyAgreement.generateSecret("DES");return receivesecretKey;}/** * 接收方的私钥构建 ,根据接收方的公钥 * @param receivePublicKey * @return * @throws NoSuchAlgorithmException * @throws InvalidAlgorithmParameterException */public static KeyPair DH_ReceiverPrivateKey_GetSecretKey(PublicKey receivePublicKey) throws NoSuchAlgorithmException,InvalidAlgorithmParameterException {DHParameterSpec dhParameterSpec = ((DHPublicKey)receivePublicKey).getParams();KeyPairGenerator receivekeyPairGenerator = KeyPairGenerator.getInstance("DH");receivekeyPairGenerator.initialize(dhParameterSpec);KeyPair receivekeyPair = receivekeyPairGenerator.generateKeyPair();return receivekeyPair;}/** * 接收方的公钥构建,根据发送方的公钥 * @param senderPublicKeyEnc * @return * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */public static PublicKey DH_ReceiverPulicKey_GetSecretKey(byte[] senderPublicKeyEnc) throws NoSuchAlgorithmException,InvalidKeySpecException {PublicKey receivePublicKey = DH_SenderPublicKey_GetSecretKey(senderPublicKeyEnc);return receivePublicKey;}/** * 发送方的公钥 * @return * @throws NoSuchAlgorithmException */public static KeyPair DH_GetSecretKey() throws NoSuchAlgorithmException {KeyPairGenerator senderkeyPairGenerator = KeyPairGenerator.getInstance("DH");senderkeyPairGenerator.initialize(512);KeyPair senderkeyPair = senderkeyPairGenerator.generateKeyPair();return senderkeyPair;}}
阅读全文
0 0
- 非对称加密算法(1):DH
- 非对称加密算法DH
- 非对称加密算法-DH算法
- 非对称加密算法-DH算法
- 非对称加密算法-DH算法
- 非对称加密算法之DH
- 每日一得--非对称加密算法之(DH)
- 非对称加密算法-DH,RSA,ElGamal
- java加密算法非对称加密算法——数字信封 DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- Java加密技术(五)——非对称加密算法的由来DH
- 51Nod 1049 最大子段和
- @Controller和@RestController的区别
- HDU-5792 World is Exploding(思维、树状数组+离散化)
- opencv249鼠标操作按下输出当前图片的像素值
- codevs1732
- 非对称加密算法(1):DH
- Maven详解(七)------ 创建Web工程以及插件原理
- php session内容
- Android基于4.4以上沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
- 字符串中的单词逆序输出
- linux系统管理员需要知道的20条命令
- 2255:重建二叉树
- Hadoop Hbase Spark 配置文档详解
- Elasticsearch学习整理(1):ES面试基础知识要点