问题标签 [elliptic-curve]
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.
cryptography - 如何在椭圆曲线上使用雅可比坐标系计算点加法
我正在编写一个椭圆曲线密码学的小项目,当我使用仿射坐标系时程序运行良好,这意味着每个点由 2 个坐标(x',y')表示。
现在我试图用雅可比坐标系替换仿射坐标系,其中每个点由 3 个坐标 (x,y,z) 表示,x' = x/z² 和 y' = y/z³。
我想知道如何将仿射坐标转换为雅可比坐标**。在某些教程中,人们使用公式:(x,y) = (x,y,1),这意味着 z 坐标始终设置为 1。但我不确定它是否正确。
然后对于椭圆曲线上的点加法,计算 P(x1,y1,z1) + Q(x2,y2,z2) = R(x3,y3,z3)。我在我的程序中使用了以下公式:
但是当我测试我的程序时,我得到了一些负坐标,例如(-2854978200,-5344897546224,578)。当我尝试使用公式 (x'=x/z²,y'=y/z³) 将结果转换回仿射坐标系时,我得到 (-8545, -27679),实际上 x 坐标是 -8545.689。 ... jacobian x 坐标不能被 z² 整除。
如果坐标不是整数怎么办?如果他们是消极的?我尝试使用曲线的字段大小进行 MOD,但结果也不正确。
所以使用雅可比坐标的点(x,y,1)
是正确的,但不是唯一的。所有满足的点(a^2.x,a^3.y,a)
都是等价的。在我的程序中,曲线是在素数字段中定义的,所以当我计算时,u1, u2, s1, s2 ...
我应该将 MOD p 应用于每个变量?
而对于将最终结果转换回仿射坐标,例如 x 坐标,实际上它不是除法,而是模逆?例如,我的曲线是在有限素数域中定义的p=11
,并且我有一个使用雅可比坐标的点(15,3,2)
,要将雅可比 x 坐标转换为仿射 x 坐标,我必须计算2^2 = 4 => x = 4^-1 mod p => x = 3
和15.3 mod p = 1
,所以仿射 x 坐标为 1,对吗?
雅可比坐标的目的是避免加法过程中的分裂。但正如 Thomas Pornin 所说,当我们计算 时P1 + P2 = P3
,有一些特殊情况需要处理。
- P1 和 P2 都是无限的:
P3=infinite
. - P1 是无限的:
P3=P2
. - P2 是无限的:
P3=P1
. - P1 和 P2 具有相同的 x 坐标,但不同的 y 坐标或两个 y 坐标都等于 0:
P3=infinite
。 - P1 和 P2 有不同的 x 坐标:
Addition formula
。 - P1 和 P2 具有相同的坐标:
Doubling formula
。
这是我的 C 函数的原型:
point
是表示在仿射坐标系中定义的点的结构,jacobian
对于雅可比系统。
问题是当我处理那些特殊情况时,尤其是第四个,我仍然将两个点都转换回仿射坐标,或者我无法比较它们的坐标,这意味着我仍然需要计算除法。
android - 通过 SMS 发送公钥
我目前正在尝试使用 ECDH 和 BouncyCastle 为 Android 开发一个加密应用程序。到目前为止,我已经实现的是根据下面的代码在应用程序上生成公钥和私钥。
我的下一个任务是通过 SMS 发送公钥。我想了解可以使用哪些方法来完成工作。目前我正在尝试通过将生成的密钥分配给一个字符串然后我将字符串发送出去但我仍然无法让它正常工作。
任何帮助将不胜感激
谢谢,节日快乐!
elliptic-curve - 使用 ECC 添加随机数和私钥
我已经使用 ECC 生成了密钥。我需要添加随机数和密钥,即x=r+s
. 这是我的代码:
现在我需要添加x=numNoRange+privkey
;但我无法添加它。对新想法有什么建议吗?
.net - 从 BouncyCastle 导出 EC 私钥并导入 CngKey 或 ECDsaCng?
我使用 BouncyCastle 为椭圆曲线 DSA 签名创建了密钥对,并设法使用符合 RFC4050 的 XMLString 将公钥导入ECDsaCng。现在我也想移动私钥并且没有设法找到解决方案。我得到的最接近的是使用 CngKey.Import。
CngKey.Import 支持 PKCS#8 格式,因此如果您可以将密钥转换为有效的 pkcs8,那么它应该可以工作。不幸的是,下面的代码并不完全有效。
这会引发异常:
System.Security.Cryptography.CryptographicException:遇到 ASN1 错误标记值。
据我所知,GetDerEncoded 应该返回一个有效的 Pkcs8 blob。
如何在 ECDsaCng 对象中使用通过 BouncyCastle 创建的私钥?
java - 如何从对象 java 中检索值
我需要知道如何访问对象的值..例如在我的代码中
int y=numNoRange+p;//其中p是privatekey的值..这里还有我需要添加privatekey值的数字,但是private是对象,所以我需要知道如何从对象中检索值..谢谢..
java - Java中基于配对的密码学的好库
我正在寻找一个可以执行基于配对的密码学 (PBC)的好库。我能找到的一个是jPBC
别人用了什么?以及他们的经历?
opengl - SVG文件的变形。贝塞尔曲线?
我有一个 SVG 文件。这个文件显示了卡通人物(2D 人物)的轮廓。我的问题是,我可以制作一个程序,它允许用户与轮廓交互并使其变形。例如,用鼠标拉出人物手臂的轮廓,手臂变大。
我想贝塞尔曲线和椭圆弧是一个解决方案。我也想知道我是否使用 OPENGL,我可能会更灵活地做到这一点。
java - flexiProvider 的不同 BrainpoolP521r1 参数。为什么?
我正在尝试使用 flexiProvider 生成 ECC 公钥对。我注意到 flexiProvider 的 BrainpoolP521r1 中的 p 和 q 等参数的值与许多站点中指定的值不同。指定的值是 Q= AADD.... 但我得到的是 Q=8948... 知道为什么 flexiProvider 不使用指定的值以及是否具有不同的值会影响安全性。我是 ECC 的新手。任何帮助将不胜感激。
java - 如何将公钥转换为 BigInteger
我需要将公钥转换为 BigInteger。在下面的代码中,我提取了私钥并将其存储为BigInteger
. 但是,当我对公众采用相同的方法时,它就不起作用了。
node.js - 使用椭圆曲线密钥创建服务器和客户端时使用 Node JS TLS 密码和密码选项(无共享密码套件错误)
关于这个问题,我试图在 node.js 中启动一个 TLS 服务器,以反映我在 OpenSSL 中创建的那个。我已经从命令行使用 OpenSSL 测试了客户端和服务器,它们成功建立了连接。当我尝试将服务器移植到 node.js(并且仍然使用 OpenSSL 客户端连接到它)时,我收到“无共享密码”错误。我想知道在使用该passphrase
选项时是否需要做一些特别的事情tls.createServer()
下面是我分别针对服务器和客户端的成功 OpenSSL 命令,请注意 passphrase.txt 文件包含一行密码:
如果我使用附加参数为客户端和/或服务器指定密码,我也可以建立成功的连接-cipher 'ECDHE-ECDSA-AES128-GCM-SHA256'
。我正在使用由 CA 生成openssl ecparam
并签名的椭圆曲线密钥,该 CA 是使用openssl ca
我在上一个问题中讨论的。
用 node.js 编写的服务器代码如下所示:
在命令行上调用上述代码node tlsServer.js
并尝试连接 OpenSSL 客户端后,我收到以下消息。
服务器:
客户:
我正在使用节点 v0.6.15。当我在发送到的选项列表中取消注释ciphers
、requestCert
和时,错误不会改变。我也有客户端的 node.js cersion,当我尝试连接到节点服务器时,我得到一个套接字挂起代码 ECONNRESET,在尝试连接到 OpenSSL 服务器时出现以下错误:rejectUnauthorized
tls.createServer()
提前感谢您的帮助和想法!