问题标签 [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.
java - KeyAgreement.generateSecret() 中的本机方法错误
我正在尝试使用 javax.crypto.KeyAgreement 生成共享密钥:
但是在运行程序后我给出了这个错误:
你能帮我解决这个问题并告诉我哪里出错了吗?
node.js - 电子 4+ 中加密模块的 createECDH 不支持 secp256k1
我的项目使用的是electron 3.1.13,下面的代码运行良好。
但是,当我将电子版本升级到 4.0.0+ 时,出现错误。
所以我运行crypto.getCurves()
,结果如下所示。
“secp256k1”不在列表中。:(
我想同时使用高版本的电子和“secp256k1”,有解决方案吗?
谢谢!
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,您有两种方法:
- 你可以只使用共享密钥的 X。然后你有一个 32 字节的字节串。
- 您可以使用共享密钥的 X 和 Y,并像使用公钥一样在其前面加上 0x04。然后你有一个 01 + 32 + 32 字节的字节串 [3) 只是为了完整:你也可以使用 X + Y 作为压缩点)
字节串的长度并不重要,因为在 KDF(通常涉及散列)之后,您总是有一个固定值,例如 32 个字节(如果您使用 sha256)。
但是,如果您选择其中一种方法,KDF 的结果当然会大不相同。所以问题是:正确的方法是什么?
- eciespy 使用方法 2 https://github.com/ecies/py/blob/master/ecies/utils.py#L143
- python cryptography 在他们的 ECDH 中只返回 X:https ://cryptography.io/en/latest/hazmat/primitives/asymmetric/ec/#cryptography.hazmat.primitives.asymmetric.ec.ECDH 。他们没有 ECIES 支持。
- 如果我正确理解 CryptoC++s 文档,他们也只会返回 X:https ://cryptopp.com/wiki/Elliptic_Curve_Diffie-Hellman
- 与 Java BountyCastle 相同,如果我没看错的话 - 结果是一个整数:https ://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/agreement/ DHBasicAgreement.java#L79
- 但您也可以找到带有 X 和 Y 的在线计算器:http ://www-cs-students.stanford.edu/~tjw/jsbn/ecdh.html
因此,我试图在文档中获取更多信息:
- 有 ECIES 的 ISO 提案。他们没有详细描述它(或者我找不到它),但我会将其解释为完整向量 X 和 Y 的方式:https ://www.shoup.net/papers/iso- 2_1.pdf
- 有这篇论文在互联网上被广泛链接,它指的是在第 27 页仅使用 X:http ://www.secg.org/sec1-v2.pdf
所以,结果是:我很困惑。谁能指出我正确的方向,或者这只是你拥有的一定程度的自由(以及在兼容性方面有很多乐趣的理由)?
ios - ios SecKeyCopyKeyExchangeResult sharedInfo 参数
我试图使用 SecKeyCopyKeyExchangeResult 函数从我的本地私钥获取共享密钥并接收服务器的公钥。共享密钥已成功生成,我能够使用 AES 加密解密传入的消息 不久前,服务器开发人员决定将 KDF 添加到密钥生成流程中。我开始研究如何在 iOS 端做到这一点,并发现有一个特殊的参数static let sharedInfo: SecKeyKeyExchangeParameter 要说文档很差,什么都不说......只有我发现的是标题中的这个描述
@constant kSecKeyKeyExchangeParameterSharedInfo 包含 CFDataRef 以及 KDF(密钥派生函数)的附加共享信息。
如果有人处理过这个问题,请帮忙。服务器使用此参数在 scala 上生成 KDF
iOS端代码
node.js - 如何在节点 js 中使用 ECDH 生成曲线 25519 密钥对?
我想用ECDH生成一个Curve25519密钥对用于加密和解密。我正在使用Crypto节点模块来生成密钥对。
但是,我未能使用 ECDH 算法生成密钥对。
节点JS
输出:
这是使用bouncycastle的 Java 代码之一
https://github.com/gsasikumar/forwardsecrecy
Java代码的输出:
任何人都可以指导我吗?
node.js - Node.JS crypto.ECDH.computeSecret() 总是抛出错误
我创建了一个测试程序来测试 Node.JS 文档中的 ECDH 算法。我修改了代码以与我的远程应用程序一起使用,代码如下所示:
但是,每次我ECDH.computeSecret()
从远程脚本运行时,它总是会抛出一个错误。我已经尝试寻找解决方案,但无处可寻。
openssl - C中的DHE和ECDHE实现
我正在尝试使用 OpenSSL 比较 DHE 和 ECDHE 实现,下面给出的是我尝试执行相同操作的代码,但我需要客户端服务器演示程序,其中客户端和服务器可以交换公钥然后生成共享密钥。
我需要在 C 中实现这两种算法的示例,以便我可以在我的项目中使用它。
java - 尝试在 Java 中创建 ECDH 密钥对
我需要将一些简单的 KeyPair 创建从 Javascript 迁移到 Java。使用 NodeJS 加密包,这非常简单:
然后,您可以使用生成的 keyPair 生成公钥和私钥,以与我们的服务器交换数据。
我发现了几个用 Java 编写的代码示例,它们使用 BouncyCastle 生成 ECDH 密钥对,但它们都抛出以下异常:
java.security.InvalidKeyException:没有安装的提供程序支持此密钥:org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey
看起来这应该像在 Node.js 中一样微不足道。我错过了什么?
我尝试了建议的代码,我得到了 [similar] 异常:
java - 从未压缩/原始字节数组构造 Java ECPublic 密钥
这个问题是大量工作的结果,它极大地影响了我们在共享公钥的方式上可能做出的一些决定。
我们有一个内置在 Node 中的后端服务器,它使用未压缩的 base64 编码密钥发布公钥。我们使用这些公钥来创建可用于加密我们的有效负载的密钥。这在使用 ECDH 密钥对的 Node(并使用浏览器的加密包)中是微不足道的,如下所示:
不幸的是,我们正在尝试用其他语言(如 Java)构建密钥交换代码,这绝非易事。Java 似乎只想处理编码的X.509 公钥,因此如果不手动构造密钥,我们就无法创建或解析 base64 未压缩/未编码的密钥。我发现这篇文章展示了如何使用曲线上的 X/Y 坐标对 ECPublicKey 对象进行编码/解码,但我需要预先添加一个 0x04 字节并将偏移量增加 1。我是否缺少更简单的方法来做到这一点,或者我们应该改变我们的节点服务器生成公钥的方式?我担心我们支持其他语言,我们会遇到类似的问题。