ECDH KDF java_java-信息安全(八)-密钥交换/协商机制、迪菲-赫尔曼(DH)密钥交换...

一、概述

密钥交换(密钥协商)算法及其原理

即使有攻击者在偷窥你与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个用来加密应用层数据的密钥(也称“会话密钥”)。

1.1、密钥交换/协商机制的几种类型

1、非对称加密算法【如RSA】

拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。

2、密钥交换算法【DH】

3、依靠通讯双方事先已经共享的“秘密”【PSK 和 SR】

既然双方已经有共享的秘密(这个“秘密”可能已经是一个密钥,也可能只是某个密码/password),只需要根据某种生成算法,就可以让双方产生相同的密钥(并且密钥长度可以任意指定)

二、DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换)

是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一个组成部分。

这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。

Oakley算法是对Diffie-Hellman密钥交换算法的优化,它保留了后者的优点,同时克服了其弱点. Oakley算法具有五个重要特征: 它采用称为cookie程序的机制来对抗阻塞攻击. 它使得双方能够协商一个全局参数集合. 它使用了现时来保证抵抗重演攻击. 它能够交换Diffie-Hellman公开密钥. 它对Diffie-Hellman交换进行鉴别以对抗中间人的攻击.

Oakley可以使用三个不同的鉴别方法:

1、数字签名:通过签署一个相互可以获得的散列代码来对交换进行鉴别;每一方都使用自己的私钥对散列代码加密。散列代码是在一些重要参数上生成的,如用户ID和现时。

2、公开密钥加密:通过使用发送者的私钥对诸如ID和现时等参数进行加密来鉴别交换。

3、对称密钥加密:通过使用某种共享密钥对交换参数进行对称加密,实现交换的鉴别。

DH算法具有两个吸引力的特征:

仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会;

除对全局参数的约定外,密钥交换不需要事先存在的基础结构;

然而,该技术也存在许多不足:

没有提供双方身份的任何信息;

计算密集性,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作;

没办法防止重演攻击;

容易遭受中间人的攻击。第三方C在和A通信时扮演B;和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。中间人的攻击按如下进行:

B在给A的报文中发送他的公开密钥YB。

C截获并解析该报文。C将B的公钥保存下来并给A发送报文,该报文具有B的用户ID但使用C的公钥YC,但仍按照好像是来自B的样子被发送出去。A收到C的报文后,将YC和B的用户ID存储在一块。类似地,C使用YC向B发送好像来自A的报文。

B基于私钥XB和YC计算共享密钥K1,A基于私钥XA和YC计算共享密钥K2,C使用私钥XC和YB计算K1,并使用XC和YA计算K2。

从现在开始,C就可以转发A发给B的报文或转发B发给A的报文,在途中根据需要修改它们的密文。使得A和B都不知道他们在和C共享通信。

2.1、流程分析

1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。

76df4465c3f3eb7316c2ac40ca78f200.png

2.甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您编写这段代码。不过,在开始之前,我需要确认您是否已经安装了 Bouncy Castle 的库。如果没有安装,您需要先安装该库以使用 ECDH 算法。另外,您需要提供一个公钥用于协商密钥。以下是示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.spec.ECGenParameterSpec; import java.security.spec.ECPrivateKeySpec; import java.security.spec.ECPublicKeySpec; import javax.crypto.KeyAgreement; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class ECDHExample { public static void main(String[] args) throws Exception { // 添加 Bouncy Castle 的提供者 Security.addProvider(new BouncyCastleProvider()); // 读取 PEM 格式的私钥 BufferedReader br = new BufferedReader(new FileReader("private_key.pem")); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { if (!line.startsWith("-----")) { sb.append(line.trim()); } } br.close(); // 解析 PEM 格式的私钥 byte[] privateKeyBytes = Base64.getDecoder().decode(sb.toString()); KeyFactory keyFactory = KeyFactory.getInstance("EC", "BC"); PrivateKey privateKey = keyFactory.generatePrivate(new ECPrivateKeySpec(new BigInteger(1, privateKeyBytes), new ECGenParameterSpec("secp256r1"))); // 生成公钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(new ECGenParameterSpec("secp256r1")); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); // 使用 ECDH 算法协商密钥 KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "BC"); keyAgreement.init(privateKey); keyAgreement.doPhase(publicKey, true); byte[] sharedSecret = keyAgreement.generateSecret(); System.out.println("Shared secret: " + Base64.getEncoder().encodeToString(sharedSecret)); } } ``` 请将您的私钥文件保存为 `private_key.pem`,并将其放置在可执行文件的同一目录中。注意,这段代码使用的是 secp256r1 椭圆曲线。如果您使用的是其他曲线,请相应地更改代码中的参数。同时,为了简化代码,我将协商密钥所需的公钥生成代码放在了程序中,您可以将其替换为您自己的公钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值