问题标签 [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.
c# - 在 BouncyCastle 中导入公共/私有 ECDH 密钥
我正在尝试在 BouncyCastle 中导入公共和私有 ECDH 密钥。要导入公钥,我使用下面的 C# 代码,代码工作正常:
公钥: 042e3e5ccf6b9ab04be7a22f3faccfde73c87e87155394a34815408a896ca18a374dac669af3bf6220fc863767f4af47507c5bc221fc4a19874daf39b4074e3eb8
私钥: be3f9bff87973356d04dad279e21535925c3656db011c9ae76b5a7f09ef8d9de
但我找不到导入私钥的解决方案。Colud你请帮我解决这个问题?
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。
我的问题是为什么?
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 密钥对?
谢谢
c# - 带有 ECDHsaCng 的 ECDH 签名
我正在与使用 AES-CCM 加密的设备通信,我需要使用 ECDH 派生的密钥进行设置。我的机器证书在 TPM 中有一个 ECC 私钥。
我对此有些陌生,所以请多多包涵。
这是我现在正在查看的代码。这是用我的证书签署密钥的正确方法吗?
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 的商业产品吗?
谢谢您的帮助。
此致。
swift - 计算 ECDH (secp256k1) 共享密钥给出错误结果
I am trying to compute ECDH ( secp256k1 ) shared secret based on private key "5785cb919db4984453826032a411248184536c632096c647f72db4e66a8bd091" and public key "0425a4ef791d8d855077c4d5dd6ca87cbda2f3296939a350e4ea57b3f0235fe1ba4d02cb29f6391675e866944065f9905a30a3e472c45c7ad7afa06143d87efa13"
我快速使用secp256k1。
我有“4d6f4351d68351c419408621efddfcfcc0bc10270669af822093fcf22c9ca26c”共享秘密,但正确的秘密应该是“ccf231a0ce74e92d9a94265ab27aa4616a3683af5df5aa65f4a011ad83673b”
java - 使用 jose4j 的 ECDH + JWE 加密/解密
我正在尝试在 Android (Java) 中与 JWE 一起实现 ECDH 加密/解密。
我发现jose4j和Nimbus 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 代码并添加了输出...
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 坐标:
任何帮助是极大的赞赏。
java - 如何将字符串转换为 ECDH PublicKey 并检查其连接性
我正在使用Java
withBouncy Castle
将服务器端转换string_1
为ECDH
PublicKey
,然后将其转换PublicKey
为string_2
以检查代码的正确性,但是string_1
andstring_2
不同,我不知道哪里出了问题。
server key和convert key不一样,找不到原因,求帮助!
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 功能?