问题标签 [ecdh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
84 浏览

java - KeyAgreement.generateSecret() 中的本机方法错误

我正在尝试使用 javax.crypto.KeyAgreement 生成共享密钥:

但是在运行程序后我给出了这个错误:

你能帮我解决这个问题并告诉我哪里出错了吗?

0 投票
1 回答
135 浏览

node.js - 电子 4+ 中加密模块的 createECDH 不支持 secp256k1

我的项目使用的是electron 3.1.13,下面的代码运行良好。

但是,当我将电子版本升级到 4.0.0+ 时,出现错误。

所以我运行crypto.getCurves(),结果如下所示。

“secp256k1”不在列表中。:(

我想同时使用高版本的电子和“secp256k1”,有解决方案吗?

谢谢!

0 投票
1 回答
355 浏览

elliptic-curve - ECIES:KDF的正确ECDH输入方式?安全效果?

为了完全理解 ECIES 并使用我最喜欢的库,我自己实现了 ECIES 的某些部分。这样做并比较结果会导致我不太清楚的一点:KDF 的输入到底是什么?

ECDH的结果是一个向量,但是你用什么来做KDF呢?它只是 X 值,还是 X + Y(可能带有前置 04)?您可以在野外找到这两个概念,并且为了互操作性,哪种方式是正确的方式真的很有趣(如果有正确的方式 - 我知道 ECIE 更像是一个概念并且有几个自由度)。

解释(如果我在特定点上错了,请纠正我)。如果我谈论字节长度,这将指的是具有 256 位 EC 密钥的 ECIES。

所以,首先,大局:这是 ECIES 流程,我说的是第 2 步 -> 第 3 步:

在此处输入图像描述

接收者的公钥是向量 V,发送者的临时私钥是标量 u,密钥协商函数 KA 是 ECDH,它基本上是 V * u 的乘积。结果,您得到了一个共享密钥,它也是一个向量——我们称之为“共享密钥”。

然后获取发送者的公钥,将其与共享密钥连接,并将其用作密钥派生函数 KDF 的输入。

但是:如果您想将此向量用于密钥派生函数 KDF,您有两种方法:

  1. 你可以只使用共享密钥的 X。然后你有一个 32 字节的字节串。
  2. 您可以使用共享密钥的 X 和 Y,并像使用公钥一样在其前面加上 0x04。然后你有一个 01 + 32 + 32 字节的字节串 [3) 只是为了完整:你也可以使用 X + Y 作为压缩点)

字节串的长度并不重要,因为在 KDF(通常涉及散列)之后,您总是有一个固定值,例如 32 个字节(如果您使用 sha256)。

但是,如果您选择其中一种方法,KDF 的结果当然会大不相同。所以问题是:正确的方法是什么?

因此,我试图在文档中获取更多信息:

所以,结果是:我很困惑。谁能指出我正确的方向,或者这只是你拥有的一定程度的自由(以及在兼容性方面有很多乐趣的理由)?

0 投票
1 回答
174 浏览

ios - ios SecKeyCopyKeyExchangeResult sharedInfo 参数

我试图使用 SecKeyCopyKeyExchangeResult 函数从我的本地私钥获取共享密钥并接收服务器的公钥。共享密钥已成功生成,我能够使用 AES 加密解密传入的消息 不久前,服务器开发人员决定将 KDF 添加到密钥生成流程中。我开始研究如何在 iOS 端做到这一点,并发现有一个特殊的参数static let sharedInfo: SecKeyKeyExchangeParameter 要说文档很差,什么都不说......只有我发现的是标题中的这个描述

@constant kSecKeyKeyExchangeParameterSharedInfo 包含 CFDataRef 以及 KDF(密钥派生函数)的附加共享信息。

如果有人处理过这个问题,请帮忙。服务器使用此参数在 scala 上生成 KDF

iOS端代码

0 投票
0 回答
879 浏览

node.js - 如何在节点 js 中使用 ECDH 生成曲线 25519 密钥对?

我想用ECDH生成一个Curve25519密钥对用于加密和解密。我正在使用Crypto节点模块来生成密钥对。

但是,我未能使用 ECDH 算法生成密钥对。

节点JS

输出:

这是使用bouncycastle的 Java 代码之一

https://github.com/gsasikumar/forwardsecrecy

Java代码的输出:

任何人都可以指导我吗?

0 投票
1 回答
65 浏览

java - 为什么我的 Java 套接字接收的数组大小比发送的大?

我正在创建一个客户端/服务器程序来使用 256 位 AES 执行加密。我从 ECDH 派生我的密钥。我发送我用来表示各种键和字符串的字节数组的大小。我遇到的问题是,当我尝试将加密字符串的大小从客户端发送到服务器时,我的服务器说我发送的大小比实际发送的要大得多。发送大小适用于需要发送的所有其他字节数组。客户端发送的加密字符串大小为 16 字节。服务器接收一个大小为 276032497 字节的整数。我检查过我实际上是从客户端发送 16 个字节。

知道问题可能是什么吗?

在此处输入图像描述 在此处输入图像描述

服务器代码:

客户端代码:

0 投票
1 回答
128 浏览

node.js - Node.JS crypto.ECDH.computeSecret() 总是抛出错误

我创建了一个测试程序来测试 Node.JS 文档中的 ECDH 算法。我修改了代码以与我的远程应用程序一起使用,代码如下所示:

但是,每次我ECDH.computeSecret()从远程脚本运行时,它总是会抛出一个错误。我已经尝试寻找解决方案,但无处可寻。

0 投票
0 回答
77 浏览

openssl - C中的DHE和ECDHE实现

我正在尝试使用 OpenSSL 比较 DHE 和 ECDHE 实现,下面给出的是我尝试执行相同操作的代码,但我需要客户端服务器演示程序,其中客户端和服务器可以交换公钥然后生成共享密钥。

我需要在 C 中实现这两种算法的示例,以便我可以在我的项目中使用它。

0 投票
1 回答
900 浏览

java - 尝试在 Java 中创建 ECDH 密钥对

我需要将一些简单的 KeyPair 创建从 Javascript 迁移到 Java。使用 NodeJS 加密包,这非常简单:

然后,您可以使用生成的 keyPair 生成公钥和私钥,以与我们的服务器交换数据。

我发现了几个用 Java 编写的代码示例,它们使用 BouncyCastle 生成 ECDH 密钥对,但它们都抛出以下异常:

java.security.InvalidKeyException:没有安装的提供程序支持此密钥:org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey

看起来这应该像在 Node.js 中一样微不足道。我错过了什么?

我尝试了建议的代码,我得到了 [similar] 异常:

0 投票
0 回答
50 浏览

java - 从未压缩/原始字节数组构造 Java ECPublic 密钥

这个问题是大量工作的结果,它极大地影响了我们在共享公钥的方式上可能做出的一些决定。

我们有一个内置在 Node 中的后端服务器,它使用未压缩的 base64 编码密钥发布公钥。我们使用这些公钥来创建可用于加密我们的有效负载的密钥。这在使用 ECDH 密钥对的 Node(并使用浏览器的加密包)中是微不足道的,如下所示:

不幸的是,我们正在尝试用其他语言(如 Java)构建密钥交换代码,这绝非易事。Java 似乎只想处理编码的X.509 公钥,因此如果不手动构造密钥,我们就无法创建或解析 base64 未压缩/未编码的密钥。我发现这篇文章展示了如何使用曲线上的 X/Y 坐标对 ECPublicKey 对象进行编码/解码,但我需要预先添加一个 0x04 字节并将偏移量增加 1。我是否缺少更简单的方法来做到这一点,或者我们应该改变我们的节点服务器生成公钥的方式?我担心我们支持其他语言,我们会遇到类似的问题。