[JAVA加解密]DH算法

本文详细介绍了Diffie-Hellman(DH)算法,这是一种用于安全交换密钥的方法。算法描述包括其原理和步骤,并通过实例展示了密钥的计算过程。接着,文章提供了JAVA实现DH算法的步骤,解释了密钥生成和交换的过程,并给出了测试用例,验证了甲乙双方本地密钥的一致性和加解密的互操作性。最后提到了密钥长度的选择和对称加密算法的应用,强调了合理选择的重要性。
摘要由CSDN通过智能技术生成

一、算法描述:

1.简介:

Diffie-Hellman:一种确保共享KEY安全穿越不安全网络的方法。Whitefield与Martin Hellman在1976年提出了一个奇妙的密钥交换协议,称为Diffie-Hellman密钥交换协议/算法(Diffie-Hellman Key Exchange/Agreement Algorithm).这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。

就是说,DH算法是用来安全地交换密钥的

2.算法描述:

基于原根的定义及性质,可以定义Diffie-Hellman密钥交换算法.该算法描述如下:
1,有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根.
2,假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XA<q),并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地,用户B选择一个私有的随机数XB<q,并计算公开密钥YB=a^XB mod q。B对XB的值保密存放而使YB能被A公开获得.
3,用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod q.同样,用户B产生共享秘密密钥的计算是K = (YA)^XB mod q.这两个计算产生相同的结果: K = (YB)^XA mod q = (a^XB mod q)^XA mod q = (a^XB)^XA mod q (根据取模运算规则得到) = a^(XBXA) mod q = (a^XA)^XB mod q = (a^XA mod q)^XB mod q = (YA)^XB mod q 因此相当于双方已经交换了一个相同的秘密密钥.
4,因为XA和XB是保密的,一个敌对方可以利用的参数只有q,a,YA和YB.因而敌对方被迫取离散对数来确定密钥.例如,要获取用户B的秘密密钥,敌对方必须先计算 XB = inda,q(YB) 然后再使用用户B采用的同样方法计算其秘密密钥K. Diffie-Hellman密钥交换算法的安全性依赖于这样一个事实:虽然计算以一个素数为模的指数相对容易,但计算离散对数却很困难.对于大的素数,计算出离散对数几乎是不可能的. 下面给出例子.密钥交换基于素数q = 97和97的一个原根a = 5.A和B分别选择私有密钥XA = 36和XB = 58.每人计算其公开密钥 YA = 5^36 = 50 mod 97 YB = 5^58 = 44 mod 97 在他们相互获取了公开密钥之后,各自通过计算得到双方共享的秘密密钥如下: K = (YB)^XA mod 97 = 44^36 = 75 mod 97 K = (YA)^XB mod 97 = 50^58 = 75 mod 97 从|50,44|出发,攻击者要计算出75很不容易. 下图给出了一个利用Diffie-Hellman计算的简单协议.


二、算法JAVA实现:

开始之前声明一下有一点还是不太明白:

假设甲方给乙方传数据,算法的实现要求乙方构建密钥时必须用甲方公钥构建乙方密钥。我自己是这样理解的:在实际实现的过程中,很难传递双方共享素数q及其元根α,因此采取这样的措施。

那么我们在接下的实现约定以下几个原则:

1.本地密钥:加密数据用的密钥

2.密钥=公钥+私钥,甲乙有自己的不相同的密钥,用来加密本地密钥

3.一方的密钥由Init()直接产生,另一方的密钥构建需用到已构建方的公钥


首先,对全局变量声明:

<span style="white-space:pre">	</span>private static final String KEY_ALGORITHM = "DH";
	private static final String SECRET_ALGORITHM = "AES";
	private static final int KEY_SIZE=512;
	private static final String PUBLIC_KEY="DHPublicKey";
	private static final String PRIVATE_KEY="DHPrivateKey";

复习一下对称加密中产生密钥的三种方法:

产生secretKey的三种方法:
a.凭空产生:KeyGenerator类对象获得SecretKey类对象:init()->generatorKey() 
b.通过byte[]数组产生:密钥工厂利用密钥材料生成SecretKey:secretKeyFactory.generateSecretKey(dks);
c.通过byte[]数组产生:密钥材料类初始化成父类SecretKey


构建DH甲方密钥对:凭空产生:keyGenerator -> keyPair ->publicKey,privateKey. 最后用map对象返回,分别对应键: PUBLIC_KEY

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值