- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我知道 ECDH 中的 key 大小取决于椭圆曲线的大小。
如果是256位曲线(secp256k1), key 将为:
Public: 32 bytes * 2 + 1 = 65 (uncompressed)
Private: 32 bytes
384 位曲线 (secp384r1):
Public: 48 bytes * 2 + 1= 97 (uncompressed)
Private: 48 bytes
但是对于521位曲线(secp521r1)情况非常奇怪:
Public: 66 bytes * 2 + 1 = 133 (uncompressed)
Private: 66 bytes or 65 bytes.
我使用 node.js 加密模块来生成此 key 。
为什么521位曲线的私钥值是可变的?
最佳答案
其他曲线的私钥也是可变的,但在编码为字节时它们不太可能表现出这种差异。
公钥被编码为两个静态大小整数,前缀为未压缩点指示符04
。大小与 key 大小(以字节为单位)相同。
私钥实际上并没有预先建立的编码。它是 1..N-1 范围内的单个随机值(或向量),其中 N 是曲线的阶数。现在,如果您将此值编码为可变大小无符号数字,那么通常它将与 key 的大小相同(以字节为单位)。然而,它可能偶然小一个字节、两个、三个或更多字节。当然,它小得多的可能性非常低。
现在 521 位 key 有点奇怪,顺序的第一个最高有效字节不是以设置为 1 的位开始的;它只有最低有效位设置为1。这意味着私有(private)值的最高有效字节(通常称为s
)更有可能是字节更短。
确切的机会当然取决于订单的总值(value):
01FF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFA
51868783 BF2F966B 7FCC0148 F709A5D0
3BB5C9B8 899C47AE BB6FB71E 91386409
但正如您可能猜到的那样,它非常接近 2 中的 1,因为之后有许多位设置为 1。丢失两个字节的概率当然是 512 中的 1,丢失三个字节的概率是 131072 中的 1(等等)。
<小时/>请注意,ECDSA 签名大小也可能会波动。 X9.42 签名方案使用两个 DER 编码的有符号整数。如果最高有效字节的最高有效位设置为 1,则它们被签名的事实可能会引入全部设置为零的字节,否则该值将被解释为负数。事实上,它由两个数字 r 和 s 组成,并且 DER 编码的大小也取决于编码整数的大小,这使得完整编码的大小相当难以预测。
ECDSA 签名的另一种不太常见的(平面)编码使用与公钥相同的静态大小的整数,在这种情况下,它只是 N 字节大小的两倍。
<小时/>ECDH 不存在此问题。通常,共享 secret 是作为 ECDH 计算结果的点的静态编码 X 坐标,或者至少是使用 key 导出函数 (KDF) 从中导出的值。
关于node.js - ECDH 私钥大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54398706/
因此,我尝试使用椭圆曲线 DH 的 OpenSSL EVP 方法执行 key 交换,以派生共享 key 。这对于在 GCM 模式下使用 AES 为自定义协议(protocol)提供强大的安全性是必要的
在我的场景中,Alice 和 Bob 已就使用哪条曲线达成一致。 Alice 生成公钥和私钥 Alice 将公钥发送给 Bob Bob 生成他的 key ,并根据他收到的 Alice 公钥生成 ses
我在 Windows 7 系统上使用 Oracle Java 8 (8u112) 和“适用于 JDK/JRE 8 的 Java 加密扩展 (JCE) 无限强度管辖策略文件”。为了提高我对安全套接字的理
我正在寻找示例 Java 代码来实现 ECDH 加密的密码。我已经找到了获取所需 key 的方法,但仍未找到加密文本的解决方案。如果有人可以提供一些指导,我们将不胜感激。 顺便说一下,我在为 Andr
我对 OpenSSL 库中的 ECDH 有疑问。 在文件'ecdhtest.c'的第159行,我们可以确认私钥的值如下: BN_print(out, a->priv_key); 但是,当我使用 Mak
我知道 ECDH 中的 key 大小取决于椭圆曲线的大小。 如果是256位曲线(secp256k1), key 将为: Public: 32 bytes * 2 + 1 = 65 (uncompres
我正在构建一个实现 ECDSA_METHOD 的 OpenSSL 引擎,其中包括签名创建和签名验证功能。由于 ECDHE 私钥的唯一用途是与签名创建相关,因此不需要从引擎导出 key 并将其呈现在其他
Java Cryptography ArchitectureStandard Algorithm Name Documentation Java 6 的页面列出了 ECDHE 密码套件。因此,我希望它
我正在尝试了解 HTTPS 的工作原理并进行一些实际测试。 我有一个通过 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 加密的 HTTPS 通信捕获的数据。 如果我没理解错的话
我正在尝试使用 ECDH key 实现 CMS 加密。引用 openssl CMS with ECDH EnvelopedData命令行运行完美,但我的程序出现错误 - Error Encryptin
我读过这篇文章document通过ECDH-CURVE25519算法生成 key 对。但是当我在 window.crypto.subtle.generateKey 中指定 ECDH-CURVE2551
我正在将一个方法从 nodeSJ 转换为 Java,但我无法使其正常工作。我一直在尝试计算派生共享 secret 。 希望有人能发现我在将 NodeJS 移植到 Java 时做错了什么。 NodeJS
前言:我不知道这个问题在这里问更合适还是在 Crypto 网站上问更合适。请随意移动或删除或任何适当的 SE 操作。 有人要求我帮助更新一些加密软件。一般来说,该软件已经执行了以下步骤,其中没有一个是
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我目前正在研究 ECDH key 交换实现。我为此使用 P-384 曲线。其他曲线也是可能的,但我认为实现应该非常相似。 客户端(Javascript)和服务器(Java)想要找到一个共享的 secr
我正在开发一个 iOS 应用程序,我想实现 ECDH 以确保安全。我使用这个应用程序(https://github.com/DigitalLeaves/AsymmetricCrypto)生成一对 ke
我正在尝试使用本地证书颁发机构,但我不断收到“ECDH 服务器 key 交换消息上的无效签名”错误。提前为这个问题的复杂性道歉。您可以通过以下方式从 github 获取完整的源代码: git clon
根据 RFC客户端发送使用服务器的 RSA 公钥加密的预主 key 。但是当他们使用 ECDHE 作为非对称算法时,客户端 key 交换消息将包含客户端的公钥。如果是这样的话?客户端何时发送预主 ke
我正在构建一个 Web API,我需要实现 ECDH 来执行端到端加密。在服务器端我有一个 C# 应用程序,在客户端我有一个 Javascript 应用程序。 我能够交换 key 、生成私钥并加密消息
我对 ECDH(椭圆曲线 Diffie-Hellman)加密有一个小问题。我使用 BouncyCaSTLe 库。 这是我生成 key 的函数: public static KeyPair genera
我是一名优秀的程序员,十分优秀!