问题标签 [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 投票
1 回答
36 浏览

vb.net - 如何使用 HSM 提供程序在 VB.net 中生成 ECDH 密钥

在 vb.net 中生成 CngKey 时,我正在尝试使用 HSM 提供程序来执行 ECDH。

'provider' 设置正确(我可以做其他事情,即生成一个 AES 密钥并使用它)。

如果我使用 HSM 原生工具预先生成密钥,Exists() 返回 true,但是当我尝试使用它时,HSM 会响应“不支持此操作”。这可能是它不受支持(文档说它是,但是),或者它不受 CngKey 支持,因为它正在做一些意想不到的事情但是 .net(.Net 本身不支持/没有 .NET 提供程序),或者我没有生成合适的密钥。

为了测试它是否是关键元数据问题(使用等),我正在尝试使用 CngKey.Create 与提供者一起生成密钥:

throws System.ArgumentException "使用的键......必须有一个 ECDiffieHellman 算法组"

并且提供者日志只是说“算法组”是空的。

假设:

  1. Querent 上次在 VB 中工作时是 Windows 3.1。它……继续前进。

因此,如果上述内容完全是“这不是你这样做的方式”,请展示,不要说出来,因为我可能不会明白这个说法。

0 投票
0 回答
272 浏览

c# - Private key in CngKey format using jose-jwt - EccKey.New(x, y, d, CngKeyUsages.KeyAgreement) not working in production but fine in local

I'm trying to read get the x, y and d parameter values from a pem file generated using https://mkjwk.org/ with P 256 curve, Encryption, ECDH-ES+A128KW with X509 set to true. The values for x, y , d are retrieved using below:

But the statement below is throwing exception when executed in remote server with Windows Server 2012 but running fine in local system running on Windows 10:

The exception found in remote is given below:

The requested operation is not supported at System.Security.Cryptography.NCryptNative.ImportKey(SafeNCryptProviderHandle provider, Byte[] keyBlob, String format) at System.Security.Cryptography.CngKey.Import(Byte[] keyBlob, String curveName, CngKeyBlobFormat format, CngProvider provider) at Jose.keys.EccKey.New(Byte[] x, Byte[] y, Byte[] d, CngKeyUsages usage)...

I am using the below library for my purpose: https://github.com/dvsekhvalnov/jose-jwt

0 投票
0 回答
156 浏览

ssl - 使用 ECDH 密钥的 Indy TLS 服务器“无共享密码”

希望有人可以帮助我解决这个问题。简单TIdHTTPServer的 OpenSSL 支持,用于使用基于 ECDH 的密钥解码来自客户端的 TLS 流量。

使用以下命令创建的服务器密钥:

服务器调试日志:

这个问题来看,我似乎需要打电话SSL_CTX_set_ecdh_auto(ctx,1)

SSL 服务器初始化:

我已按照这些说明添加SSL_CTX_set_ecdh_auto()到我的IdSSLOpenSSLHeaders.pas文件中,但如果我尝试SSL_CTX_set_ecdh_auto()从我的代码中添加要调用的条目,我会收到“调用未定义函数‘SSL_CTX_set_ecdh_auto’”错误。

我正在运行 Indy 10.6.2。

TLS 握手

0 投票
0 回答
226 浏览

java - 试图在 android 中获取 ECDH 密钥对,我遇到了这个错误:java.security.NoSuchAlgorithmException: no such algorithm: ECDH for provider BC

主要问题:如何在没有错误的情况下在 android 中获取 ECDH 密钥对。

我想执行 Diffie-Hellman 密钥交换算法。所以我写道:

我得到这个错误:

java.security.NoSuchAlgorithmException:没有这样的算法:提供者 BC 的 ECDH

所以我将 SpongyCastle 添加到 gradle 文件中,然后在 onCreate 中添加了这一行:

这是我的静态方法:

但是我仍然会因为输出类型的不一致而出现错误,这些错误无法通过强制转换为该特定类来修复。

总的来说,我想生成一个密钥对,获取对方的公钥并进行密钥协商。

0 投票
0 回答
20 浏览

openssl - 如何在 .netframework 中实现 OpenSsl NIST Curve ECDH peer

我必须实现 C# 客户端(在 windows .net franework 上),它将与 C++ 服务器(Linux 平台)进行密钥交换。请注意,我已经使用 openssl ECDH 在同一(Linux 上)上实现了服务器端和 C++ 客户端。有人可以帮助我使用为此目的的 .netframework 命名空间和类以及所需的最低 .net 版本。我知道可以使用 bcrypt 模块,但也不能太多。我在服务器端使用 NIST 命名曲线。

0 投票
1 回答
38 浏览

asynchronous - 异步调用短期密钥期间的加密密钥管理

以下是我需要管理的场景。任何有关管理加密密钥的最佳方法的想法都将受到高度赞赏。

Bob,客户端需要从数据提供者 Alice 那里提取一些机密数据。Bob 和 Alice 同意使用 Elliptic Curve Delffie-Hellman 密钥交换协议。因此,每当 Bob 向 Alice 请求一些数据时,首先使用 ECDH 交换密钥。发布 Alice 将准备数据,这需要几秒钟到几分钟才能完成。数据准备好后,Alice 使用从 ECDH 密钥交换中派生的对称密钥对数据进行加密,并向 Bob 发送通知以提取数据。Bob 使用回调 API 从 Alice 那里提取数据并使用密钥解密。发布这个作为 ECDH 的一部分生成的密钥被销毁,因为要求密钥必须是临时的。

所以我的问题是,在 Bob 在初始数据请求和 ECDH 密钥交换之后等待数据到达时,将密钥安全地保存在 Bob 端几秒钟到几分钟的最佳和实用方法是什么?需要注意的是,Bob 可以从移动应用程序或任何受支持设备上的 Web 浏览器发送此类数据请求。

使用其中一个密钥管理系统听起来像是一种选择。但考虑到密钥的寿命很短,因为要求每笔交易都有一个新密钥,并且每天可能有 100 次这样的交易,不确定在这种情况下依赖 KMS 在财务上是否谨慎和实用。

请注意,由于某些原因,数据请求和履行的过程以及上面解释的加密算法是不可协商的。

想法?建议?

0 投票
1 回答
327 浏览

java - 在 Swift 中读取 Java 服务器发送的公钥

我正在尝试从 Java 服务器读取公钥(x509 格式编码)以完成我的椭圆曲线 Diffie Hellman Exchange。我可以毫无问题地将公钥发送到服务器,但现在我想读取服务器发送给 iOS 客户端的公钥。

这就是我回到iOS端的原因。为了处理它,我需要从输入流中读取它,然后将其转换为可用的公钥。这就是我现在在 iOS 端读取密钥的内容:

在这里我可以读到“publicKey”,我知道它里面有一些价值。我怎样才能把它变成一个可用的密钥来生成共享密钥?

TLDR:我想读取来自 Java 服务器 (ECDH) 的公钥,以在 iOS 客户端中生成用于加密的对称密钥。

0 投票
0 回答
78 浏览

android - Android 生成的 KeyPair 比(服务器生成的)openssl 生成的要长

为了生成 ECDH 密钥对,我在下面编写了与使用 open-ssl 的服务器的代码相同的代码。但是我的 Hex 公钥是这样的(176):

并且服务器公钥更短,像这样(130):

代码:

造成这种差异的原因是什么?我使用这一行将公钥转换为字节数组:

我尝试通过以下方式转换 Android 生成的公钥:

但我得到这个错误:

java.io.EOFException:DEF 长度 126 对象被 63 截断 2021-04-01 17:52:56.113 20381-24882/ 在 org.spongycastle.asn1.DefiniteLengthInputStream.toByteArray(DefiniteLengthInputStream.java:103) 2021-04-01 17 :52:56.113 20381-24882/... W/System.err: 在 org.spongycastle.asn1.ASN1InputStream.createPrimitiveDERObject(ASN1InputStream.java:455) 2021-04-01 17:52:56.113 20381-24882/.. . W/System.err: at org.spongycastle.asn1.ASN1InputStream.buildObject(ASN1InputStream.java:190) 2021-04-01 17:52:56.113 20381-24882/... W/System.err: at org. spongycastle.asn1.ASN1InputStream.readObject(ASN1InputStream.java:278) 2021-04-01 17:52:56.113 20381-24882/... W/System.err: at org.spongycastle.asn1.x509.SubjectPublicKeyInfo.parsePublicKey( SubjectPublicKeyInfo.java:112)

0 投票
0 回答
463 浏览

android - Android 试图从公钥字节数组中获取公钥:java.lang.IllegalArgumentException: Invalid point encoding 0x30

我应该接收 HEX 格式的服务器公钥(“ECDH”,“secp256k1”),未压缩(65 字节),在 Android 中生成我自己的X.509格式(88 字节)公钥,然后生成共享秘密,必须是 32 字节。现在,当我想获取服务器公钥时,我遇到了这个错误:

java.security.spec.InvalidKeySpecException:无效的 KeySpec:点不在曲线上

过程: 首先我生成自己的公钥,然后将服务器 HEX 密钥转换为字节数组:serverKey.getBytes(),然后将其放入下面的另一种方法中:

decodeECPublicKey是:

执行时会产生此错误:

java.lang.IllegalArgumentException:无效的点编码 0x30

我究竟做错了什么?

编辑: 好的。错误的部分要serverKey.getBytes()感谢@Topaco。既然我有了,localSecret我想String用 AES-256-CBC 算法加密 a,使用前 16 个字节localSecret作为 iv,第二个字节作为密钥。我已经编写了这段代码,但是当我将结果发送到服务器时,它会产生错误:

0 投票
0 回答
261 浏览

java - 椭圆曲线密码学共享密钥推导

我正在实施 ECDH 并想问应该如何最好地使用从一个人的私钥和另一个人的公钥派生的共享秘密。

我知道使用这个的双方最终都得到了相同的秘密,这很好。一旦攻击者掌握了参与通信的任何两方(Alice 或 Bob)的私钥,该秘密就会被泄露。

在使用某种算法(在我的情况下为 AES)计算密钥协议时,(共享的)秘密似乎总是相同的。

然后你使用秘密并使用 AES/GCM 来加密任何人想要的。

我认为这是有缺陷的,因为您总是使用相同的密钥进行同一合作伙伴之间的通信,从而可以记录秘密通信,并且可能有机会通过破解 AES 或使用的任何东西来获取秘密。

所以我想做的是从中派生密钥,而不是按原样使用整个安全密钥。因此,我不想使用双方都能够独立生成的密钥,而是使用密钥来派生一些密钥,这些密钥通过一种偏移量,双方都使用这种偏移量来创建无限的一次性密钥。

我的问题是通常使用什么密钥派生函数(因为它是基于密钥的)?

我目前实现了一个 SipHash128,因为它保证了我所需要的 - 保持实际的秘密秘密,但允许通过将随机数作为消息(一部分来自设备,一部分来自服务器)来获得无限对称秘密,以通过使用从中派生 sip 哈希共享密钥避免设备始终发送相同的“随机”消息。

PS:我想要一个与 Flutter 和 JavaScript 应用程序对话的 Java 后端。PSS:是的,我有一个计算机科学硕士(一位同事已经在这方面向我提出挑战),但这样做感觉有点愚蠢,但这是/是我能想到的最简单的解决方案。