package com.digican.books.a0102.b0101;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.KeyAgreement;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class TestDHCrypto {
// The 1024 bit Diffie-Hellman modulus values used by SKIP
private static final byte[] skip1024ModulusBytes = {
(byte)0xF4, (byte)0x88, (byte)0xFD, (byte)0x58,
(byte)0x4E, (byte)0x49, (byte)0xDB, (byte)0xCD,
(byte)0x20, (byte)0xB4, (byte)0x9D, (byte)0xE4,
(byte)0x91, (byte)0x07, (byte)0x36, (byte)0x6B,
(byte)0x33, (byte)0x6C, (byte)0x38, (byte)0x0D,
(byte)0x45, (byte)0x1D, (byte)0x0F, (byte)0x7C,
(byte)0x88, (byte)0xB3, (byte)0x1C, (byte)0x7C,
(byte)0x5B, (byte)0x2D, (byte)0x8E, (byte)0xF6,
(byte)0xF3, (byte)0xC9, (byte)0x23, (byte)0xC0,
(byte)0x43, (byte)0xF0, (byte)0xA5, (byte)0x5B,
(byte)0x18, (byte)0x8D, (byte)0x8E, (byte)0xBB,
(byte)0x55, (byte)0x8C, (byte)0xB8, (byte)0x5D,
(byte)0x38, (byte)0xD3, (byte)0x34, (byte)0xFD,
(byte)0x7C, (byte)0x17, (byte)0x57, (byte)0x43,
(byte)0xA3, (byte)0x1D, (byte)0x18, (byte)0x6C,
(byte)0xDE, (byte)0x33, (byte)0x21, (byte)0x2C,
(byte)0xB5, (byte)0x2A, (byte)0xFF, (byte)0x3C,
(byte)0xE1, (byte)0xB1, (byte)0x29, (byte)0x40,
(byte)0x18, (byte)0x11, (byte)0x8D, (byte)0x7C,
(byte)0x84, (byte)0xA7, (byte)0x0A, (byte)0x72,
(byte)0xD6, (byte)0x86, (byte)0xC4, (byte)0x03,
(byte)0x19, (byte)0xC8, (byte)0x07, (byte)0x29,
(byte)0x7A, (byte)0xCA, (byte)0x95, (byte)0x0C,
(byte)0xD9, (byte)0x96, (byte)0x9F, (byte)0xAB,
(byte)0xD0, (byte)0x0A, (byte)0x50, (byte)0x9B,
(byte)0x02, (byte)0x46, (byte)0xD3, (byte)0x08,
(byte)0x3D, (byte)0x66, (byte)0xA4, (byte)0x5D,
(byte)0x41, (byte)0x9F, (byte)0x9C, (byte)0x7C,
(byte)0xBD, (byte)0x89, (byte)0x4B, (byte)0x22,
(byte)0x19, (byte)0x26, (byte)0xBA, (byte)0xAB,
(byte)0xA2, (byte)0x5E, (byte)0xC3, (byte)0x55,
(byte)0xE9, (byte)0x2F, (byte)0x78, (byte)0xC7
};
// The SKIP 1024 bit modulus
private static final BigInteger skip1024Modulus = new BigInteger(1, skip1024ModulusBytes);
// The base used with the SKIP 1024 bit modulus
private static final BigInteger skip1024Base = BigInteger.valueOf(2);
public static void main(String[] args) throws Exception {
//getA291();
//getA292a();
getA292b();
}
/**
* 创建DH公钥和私钥
*/
public static void getA291() throws Exception {
DHParameterSpec DHP=new DHParameterSpec(skip1024Modulus,skip1024Base);
KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH");
kpg.initialize(DHP);
KeyPair kp=kpg.genKeyPair();
PublicKey pbk=kp.getPublic();
PrivateKey prk=kp.getPrivate();
FileOutputStream f1=new FileOutputStream("d:\\zb\\bdhpublickey.txt");
ObjectOutputStream b1=new ObjectOutputStream(f1);
b1.writeObject(pbk);
b1.flush();
FileOutputStream f2=new FileOutputStream("d:\\zb\\bdhprivatekey.txt");
ObjectOutputStream b2=new ObjectOutputStream(f2);
b2.writeObject(prk);
b2.flush();
}
/**
* 创建DH共享密钥
* 读取自己的私钥和对方的公钥来产生共享密钥
* 生成A的共享密钥
*/
public static void getA292a() throws Exception {
//对方的公钥
FileInputStream f1=new FileInputStream("d:\\zb\\bdhpublickey.txt");
ObjectInputStream b1=new ObjectInputStream(f1);
PublicKey pbk=(PublicKey)b1.readObject();
//自己的私钥
FileInputStream f2=new FileInputStream("d:\\za\\adhprivatekey.txt");
ObjectInputStream b2=new ObjectInputStream(f2);
PrivateKey prk=(PrivateKey)b2.readObject();
KeyAgreement ka=KeyAgreement.getInstance("DH");
ka.init(prk);
ka.doPhase(pbk, true);
byte[] sb=ka.generateSecret();
for(int i=0;i<sb.length;i++){
System.out.print(sb[i]+" ");
}
}
/**
* 创建DH共享密钥
* 读取自己的私钥和对方的公钥来产生共享密钥
* 生成B的共享密钥
*/
public static void getA292b() throws Exception {
//对方的公钥
FileInputStream f1=new FileInputStream("d:\\za\\adhpublickey.txt");
ObjectInputStream b1=new ObjectInputStream(f1);
PublicKey pbk=(PublicKey)b1.readObject();
//自己的私钥
FileInputStream f2=new FileInputStream("d:\\zb\\bdhprivatekey.txt");
ObjectInputStream b2=new ObjectInputStream(f2);
PrivateKey prk=(PrivateKey)b2.readObject();
KeyAgreement ka=KeyAgreement.getInstance("DH");
ka.init(prk);
ka.doPhase(pbk, true);
byte[] sb=ka.generateSecret();
for(int i=0;i<sb.length;i++){
System.out.print(sb[i]+" ");
}
//SecretKeySpec k = new SecretKeySpec(sb,"DESede");//这个创建的密钥也完全相同
}
}
分享到:
相关推荐
在密码学领域,RSA、Diffie-Hellman和签名算法是至关重要的概念,它们与非对称和对称密钥紧密相关。...非对称密钥和对称密钥的结合使用,使得我们能够在享受高效加密的同时,也能确保通信的隐私和安全。
DH算法,全称为Diffie-Hellman密钥交换算法,是一种在不安全的通信信道上,让两个通信方安全地交换对称密钥的方法。这个算法由Whitfield Diffie和Martin Hellman在1976年提出,是公钥密码学的重要里程碑,为后续的...
(1)编程实现两个程序(c/s模式),两个程序之间可通过DH协议...(2)在共享密钥建立后,两个程序之间的消息交换要保证机密性(用对称加密算法和共享密钥加密)。(3)接收方能验证消息的真实性(消息完整和来源可性)
DH密钥交换算法这个机制的巧妙在于它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道确定对称密钥。 我用Java写了两个例子,有需要的可以看看。
在原始的DH协议中,虽然可以实现密钥的非对称交换,但并不防止**中间人攻击**。中间人攻击是指攻击者在通信双方之间插入自己,篡改或监听他们的通信内容。 为了对抗中间人攻击,我们可以采用几种增强的安全措施: ...
DH算法,全称为Diffie-Hellman密钥交换协议,是一种在不安全的网络环境中安全地交换对称密钥的方法。这个协议由Whitfield Diffie和Martin Hellman于1976年提出,它是非对称加密技术的重要组成部分。在DH算法中,两个...
本文介绍了使用 Java 中的 Diffie-Hellman(DH)算法实现非对称加密的实例,提供了完整的实现代码,供需要的朋友参考。 Diffie-Hellman 算法是一种经典的密钥交换协议,允许两个用户在不安全的通道上秘密地共享密钥...
2. **非对称密钥分配**:如RSA或ECC,使用一对公钥和私钥,公钥公开,私钥保密,一方用对方的公钥加密,另一方用自己的私钥解密。 3. **密钥协商协议**:如IKE(Internet Key Exchange),用于IPSec中,允许双方...
5. **安全通信**:共享秘密可以用来生成对称密钥,用于后续的加密和解密通信。C++中可以使用如AES(Advanced Encryption Standard)这样的对称加密算法。 6. **C++编程**:编写C++代码时,需要考虑内存管理,确保...
对称加密(如AES、DES、3DES、Blowfish)适用于大量数据的快速加密,而非对称加密(如RSA、DH)更适合小量数据的安全传输或密钥交换。哈希算法(如MD5)则用于数据完整性检查。理解并正确使用这些加密算法,对于保护...
非对称加密使用一对密钥,即公钥和私钥,其中公钥用于加密,私钥用于解密。这种方式增加了安全性,但也带来了计算上的开销。 ##### 非对称加密的优缺点 - **优点**:相对于对称加密而言,非对称加密更加安全,因为...
java密钥交换算法DH是一种基于 Diffie-Hellman 密钥交换算法的实现,主要用于解决对称加密中的密钥传递问题。下面将详细介绍java密钥交换算法DH的定义、原理、使用方法及相关操作注意事项。 一、对称加密缺点 对称...
DH(Diffie-Hellman)加密算法是一种非对称密钥交换协议,它允许两个通信方在不安全的网络环境中安全地协商一个共享密钥,而无需事先共享任何秘密信息。这个过程是基于数学上的大整数因子分解的困难性。C++是一种...
3. 为防止中间人攻击,采用RSA非对称加密算法协助DH算法完成密钥交换。具体过程如下: a. 接收者与发送者双方各自利用RSA算法生成自己的公私钥,并生成数字证书,并在一个CA进行认证。 b. 在DH密钥交换阶段,A生成A...
DH(Diffie-Hellman)算法是一种非对称密钥交换协议,它的主要作用是在不安全的网络环境中,让两个通信方(通常称为Alice和Bob)能够协商出一个共同的秘密密钥,而无需事先共享任何秘密信息。这个过程是安全的,因为...
Web协议详解与抓包实战
在网络游戏中,密钥的分配方法通常包括对称密钥和非对称密钥两种类型。对称密钥加密使用同一密钥进行加密和解密,简单快速,但密钥分发是个挑战,因为需要安全地将密钥传递给接收方。非对称密钥则有公钥和私钥,公钥...
首先,需要使用 KeyPairGenerator 生成密钥对,然后使用 KeyFactory 将公钥编码成X509EncodedKeySpec,最后使用 KeyAgreement 实现密钥构建和加密解密。 6. Java实现RSA加密解密 Java可以使用 Cipher 和 ...
(1)根据图1所示,实现利用公钥密码算法分发对称密钥的过程。 实现的阶梯任务如下: ①以本地两个目录模拟两个用户,采用变量方式直接实现密钥的分发; ②实现算法的图形化方式,用户可以选择算法、参数、工作模式等...