问题标签 [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 回答
736 浏览

c# - 在 BouncyCastle 中导入公共/私有 ECDH 密钥

我正在尝试在 BouncyCastle 中导入公共和私有 ECDH 密钥。要导入公钥,我使用下面的 C# 代码,代码工作正常:

公钥: 042e3e5ccf6b9ab04be7a22f3faccfde73c87e87155394a34815408a896ca18a374dac669af3bf6220fc863767f4af47507c5bc221fc4a19874daf39b4074e3eb8

私钥: be3f9bff87973356d04dad279e21535925c3656db011c9ae76b5a7f09ef8d9de

但我找不到导入私钥的解决方案。Colud你请帮我解决这个问题?

0 投票
1 回答
636 浏览

openssl - TLS - 用于 ECDHE 的曲线

我想问一下 TLS 如何决定密钥交换算法(曲线选择)。

客户端和服务器之间的通信是通过 TLS 进行的。服务器与客户端在同一台计算机上运行,​​并且都可以访问相同的证书。客户端和服务器都调用 SSL_CTX_set_cipher_list 将密码设置为 ECDHE-ECDSA-AES128-GCM-SHA256。

通信期间应用的证书和密钥是使用 ecparam name_curve secp521r1 创建的。

当服务器调用 SSL_CTX_set_ecdh_auto 一切正常。但是,当服务器尝试通过调用 SSL_CTX_set1_curves_list 将曲线限制为 secp521r1 时,客户端无法连接。似乎曲线 secp521r1 不用于 ECDHE。

我的问题是为什么?

0 投票
1 回答
716 浏览

android - Android 应用程序中 ECC 密钥的保护

我已经使用 ECC 密钥对完成了一个 Android 应用程序。当我去年开发它时,我想在 Android Keystore 中创建 ECC 密钥。不幸的是,由于ECDH,此 ECC 密钥用于生成会话密钥,并且Android Keystore 不支持ECDH(这就是我在这里所说的:ECDH with key in Android Key Store

我遵循了建议:我在 Android KeyStore 中创建了一个 AES 密钥,并在将 ECC 密钥存储在 SharedPreferences 之前使用它来加密它。Android KeyStore 确保无法提取 AES 密钥,并且只有我的应用程序可以使用它来解密 ECC 密钥。

我现在有一个问题,希望得到您的建议:

如果有人在有根手机上安装我的应用程序,获取 APK,在读取和解密后反编译并修改它以打印 ECC 密钥怎么办?我没有这个技能,但我猜有些黑客有。如果可行,则意味着我使用的保护无效。

在我的情况下,使用 ECDH 是不可协商的,那么我必须使用什么解决方案来保护我的 ECC 密钥对?

谢谢

0 投票
0 回答
181 浏览

c# - 带有 ECDHsaCng 的 ECDH 签名

我正在与使用 AES-CCM 加密的设备通信,我需要使用 ECDH 派生的密钥进行设置。我的机器证书在 TPM 中有一个 ECC 私钥。

我对此有些陌生,所以请多多包涵。

这是我现在正在查看的代码。这是用我的证书签署密钥的正确方法吗?

0 投票
1 回答
81 浏览

ecdsa - 哪些密码库将有助于计算共享点并派生密钥?

我们需要执行一些加密操作,我想知道哪些加密库可以满足我的需要。

以下是上下文:

鉴于我们有以下事实:

  • 存储在HSM中的 EC 私钥
  • EC公钥(公共点)
  • 加密的 AES 密钥
  • 使用 EC 公钥 ECDH 计算的 MAC

我们需要执行以下操作:

  • 使用EC 私钥和 EC 公钥中的 ECKA-DH 算法计算共享点(K~X~,K~Y~)。(见 BSI TR 03111)
  • 使用带有 SHA-256 的 KDF2(x, l)导出K~ENC~ 和 K~MAC~。K~ENC~ 是输出的前 8 个字节。K~MAC~ 是输出的最后 8 个字节。(见 ISO/IEC 18033-2)
  • 针对 MAC ==> MAC = AES-CMAC(加密的 AES 密钥 || ValueA || ValueB,K~MAC~)验证加密的 AES 密钥上的 MAC。
  • 解密加密的 AES 密钥 ==> AES 密钥 = AES-CBC(加密的 AES 密钥,K~ENC~)。

基于私钥存储在 HSM 中的事实,哪些加密库将帮助计算共享点?

Bouncy Castle 可以与 IAIK PKCS#11 包装器一起使用吗?

IAIK-JCE 可以帮助 IAIK 的商业产品吗?

谢谢您的帮助。

此致。

0 投票
0 回答
426 浏览

swift - 计算 ECDH (secp256k1) 共享密钥给出错误结果

I am trying to compute ECDH ( secp256k1 ) shared secret based on private key "5785cb919db4984453826032a411248184536c632096c647f72db4e66a8bd091" and public key "0425a4ef791d8d855077c4d5dd6ca87cbda2f3296939a350e4ea57b3f0235fe1ba4d02cb29f6391675e866944065f9905a30a3e472c45c7ad7afa06143d87efa13"

我快速使用secp256k1

我有“4d6f4351d68351c419408621efddfcfcc0bc10270669af822093fcf22c9ca26c”共享秘密,但正确的秘密应该是“ccf231a0ce74e92d9a94265ab27aa4616a3683af5df5aa65f4a011ad83673b”

0 投票
1 回答
2638 浏览

java - 使用 jose4j 的 ECDH + JWE 加密/解密

我正在尝试在 Android (Java) 中与 JWE 一起实现 ECDH 加密/解密。
我发现jose4jNimbus JOSE库旨在满足我的所有需求,但似乎比我想象的更具挑战性。

如果有人熟悉,那就是 3D Secure 2.0 ......

在下面的规范中:

  • SDK =本地
  • DS = 目录服务器(另一端)

接下来是规格:

  • 给定:P(DS) - EC 公钥(以 PEM 格式提供,可以转换为 PublicKey 或 JWK)
  • 生成一个新的临时密钥对 (Q(SDK), d(SDK))
  • 根据 JWA (RFC7518) 在 Direct Key Agreement 模式下使用曲线 P-256、d(SDK) 和 P(DS) 进行 Diffie-Hellman 密钥交换过程以生成 CEK。此版本规范支持的参数值为:
    • “alg”:ECDH-ES
    • “apv”:目录服务器 ID
    • “epk”:P(DS),inJSONWebKey(JWK)格式{“kty”:“EC”,“crv”:“P-256”}
    • 所有其他参数:不存在
  • CEK:"kty":oct-256bits
  • 生成 128 位随机数据​​作为 IV
  • 使用 CEK 和 JWE 紧凑序列化根据 JWE (RFC7516) 加密 JSON 对象。此版本规范支持的参数值为:
    • “alg”:目录
    • “epk”:Q(SDK)作为{“kty”:“EC”,“crv”:“P-256”}
    • “enc”:“A128CBC-HS256”或“A128GCM”
    • 所有其他参数:不存在
  • 如果算法是 A128CBC-HS256,则使用完整的 CEK,或者如果算法是 A128GCM,则使用 CEK 的最左边 128 位。
  • 删除临时密钥对 (Q(SDK),d(SDK))
  • 将生成的 JWE 作为 SDK 加密数据提供给 3DS 服务器

如果有人已经实现了这个确切的规范并且可以分享代码,那就太棒了!!

在 jose4j 的示例中有一个使用 ECDH 创建 JWT 的示例:
https ://bitbucket.org/b_c/jose4j/wiki/JWT%20Examples (最后一个示例,标题为“生产和使用嵌套的(签名和加密的)JWT ”)。
但是这个例子并不是我所需要的。当我需要加密文本时,它会创建一个令牌。

从上面规范中的 "CEK:"kty":oct-256bits" 开始,我不明白该怎么做。

这是我使用 Nimbus lib 的代码(到目前为止):

这是雨云输出:

nimbus_encrypt: jwe = {"epk":{"kty":"EC","crv":"P-256","x":"AS0GRfAOWIDONXxaPR_4IuNHcDIUJPHbACjG5L7x-nQ","y":"xonFn1vRASKUTdCkFTwsl16LRmSe-bAF8EO4-mh1NYw"} ,"apv":"RjAwMDAwMDAwMQ","enc":"A128CBC-HS256","alg":"ECDH-ES"}

nimbus_encrypt: serializedJwe = eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJBUzBHUmZBT1dJRE9OWHhhUFJfNEl1TkhjRElVSlBIYkFDakc1TDd4LW5RIiwieSI6InhvbkZuMXZSQVNLVVRkQ2tGVHdzbDE2TFJtU2UtYkFGOEVPNC1taDFOWXcifSwiYXB2IjoiUmpBd01EQXdNREF3TVEiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiRUNESC1FUyJ9..Pi48b7uj3UilvVXKewFacg.0sx9OkHxxtZvkVm-IENRFw.bu5GvOAwcZxdxaDKWIBqwA

这是我的代码(到目前为止,使用@Brian-Campbell 的答案)使用 jose4j lib:

这是 jose4j 输出:

jose4j_encrypt: jwe = JsonWebEncryption{"alg":"ECDH-ES","enc":"A128CBC-HS256","apv":"RjAwMDAwMDAwMQ","epk":{"kty":"EC","x" :"prvyhexJXDWvPQmPA1xBjY8mkHEbrEiJ4Dr-7_5YfdQ","y":"fPjw8UdfzgkVTppPSN5o_wprItKLwecoia9yrWi38yo","crv":"P-256"}}

jose4j_encrypt: serializedJwe = eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImFwdiI6IlJqQXdNREF3TURBd01RIiwiZXBrIjp7Imt0eSI6IkVDIiwieCI6InBydnloZXhKWERXdlBRbVBBMXhCalk4bWtIRWJyRWlKNERyLTdfNVlmZFEiLCJ5IjoiZlBqdzhVZGZ6Z2tWVHBwUFNONW9fd3BySXRLTHdlY29pYTl5cldpMzh5byIsImNydiI6IlAtMjU2In19..gxWYwFQSOqLk5HAgs7acdA.mUIHBiWpWSlQaEOJ_EZGYA.eiTe-88fw-Jfuhji_W0rtg

可以看出,最终结果中的“alg”标头是“ECDH-ES”,而不是“dir”。

如果我要实现通信的双方就足够了,但是有了这个规范,这里似乎缺少许多配置......

使用 jose4j 的代码更长,似乎更可配置,但我无法构建足够有价值的东西来发布在这里。

对我来说主要缺少的部分是如何从上面的规范生成 CEK。

谢谢你。

编辑
在上面添加了 jose4j 代码并添加了输出...

0 投票
1 回答
445 浏览

javascript - 如何在 ReactJS 脚本中通过 WebCrypto“importKey”导入 Base64 PublicKey?

我正在尝试使用 Web Crypto API 函数 importKey 导入 Base64 PublicKey。目的是创建一个简单的模式来解析 PublicKey 并启用密码加密。

我尝试使用 importKey 函数的“原始”方法将 PublicKey 作为 Uint8Array 导入 - 请参见以下脚本:

我希望这会生成输入的导入版本 kpub。但是,控制台中没有显示输出 - 当启用错误处理时,我得到一个 DOMException 。

知道我做错了什么吗?

作为替代方案,将 publicKey 转换为 JWK 格式可能更容易。例如,我已确认以下 JWK 在 importKey 函数中按预期工作。但是,如果我要使用它,我很难将输入的 kpub 转换为 x 和 y 坐标:

任何帮助是极大的赞赏。

0 投票
0 回答
39 浏览

java - 如何将字符串转换为 ECDH PublicKey 并检查其连接性

我正在使用JavawithBouncy Castle将服务器端转换string_1ECDH PublicKey,然后将其转换PublicKeystring_2以检查代码的正确性,但是string_1andstring_2不同,我不知道哪里出了问题。

server key和convert key不一样,找不到原因,求帮助!

0 投票
0 回答
435 浏览

openssl - 在 OpenSSL 1.1.1 中实现 ECDH 引擎

我正在尝试编写一个支持 ECDH 的 OpenSSL 引擎。我在 OpenSSL wiki 上关注此页面:https ://wiki.openssl.org/index.php/Creating_an_OpenSSL_Engine_to_use_indigenous_ECDH_ECDSA_and_HASH_Algorithms 。

但是它基于版本 1.0.2,我需要使用 OpenSSL 1.1.1。在 wiki 中,他们使用该ENGINE_set_ECDH(ENGINE *e, ECDH_METHOD * ecdh)函数注册 ECDH 方法,但该函数在 OpenSSL 1.1.1 中不可用。

我查看了文档,但没有找到 1.1.1 版的等效文档。同样的问题也适用于 ENGINE_set_ECDSA 不可用的 ECDSA 方法。我应该如何着手使引擎实现 ECDH,如何替换 ENGINE_set_ECDH 功能?