当前位置: 首页 > 知识库问答 >
问题:

在给定私钥和消息的情况下,不确定如何生成ECDSA签名

通煜祺
2023-03-14

在此之前,我生成了我的证书,一个。pem文件,当在文本编辑器中打开它时,它会显示我的私钥,所以我也有字符串格式的私钥。

我还遵循了生成它所引用的消息的步骤,现在我将其作为字符串。

因此,假设我有一个私钥(如果需要,也可以使用。pem文件)和一个字符串形式的消息,理论上,用私钥计算得到消息的ECDSA签名应该相当简单。但这就是我挣扎的地方。我在网上找到的库似乎采用了一种复杂得多的方法,有不同的移动部件,没有对。pem文件的引用,并谈到生成新的公钥/私钥。

对此步骤的任何帮助都将不胜感激。

共有1个答案

公冶昆杰
2023-03-14

Ruby的OpenSSL EC支持的文档和实际API目前似乎都相当缺乏。特别是,在Ruby<=2.3.1中,OpenSSL::pkey::ec不遵循与RSA和DSA密钥相同的API进行签名和验证。您想要做的,但目前不能使用EC键,是这样的(这里的所有代码都假设您在某个地方调用了require'openssl'):

# Get the key, here I'm reading the file
priv_key = OpenSSL::PKey.read(File.read('eckey.pem')) 

# This should be the appropriately formatted string
data = "some data to sign"

# The hash algorithm, I assume SHA256 is being used
digest = OpenSSL::Digest::SHA256.new

# This doesn't work in 2.3.1, but does in 2.4.0-preview1
signature = priv_key.sign(digest, data)

正如我在注释中所指出的,这在Ruby2.4.0-Preview1中确实有效,但对您来说可能用处不大。

要让它与当前的Ruby一起工作,您需要执行以下操作:

# As before:
priv_key = OpenSSL::PKey.read(File.read('eckey.pem'))
data = "some data to sign"

signature = priv_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(data))

这两种技术都给您一个二进制字符串。我认为在添加它作为请求头之前,您需要对其进行base64编码。

提取公钥以检查签名验证也有点棘手(尽管您可以使用openssl命令行并读取文件)。public_key方法返回OpenSSL::PKey::EC::Point对象,而不是实际的密钥,因此我们需要从私钥重新创建一个。verify方法在Ruby 2.3.1上确实有效:

pub = OpenSSL::PKey::EC.new(priv_key.group)
pub.public_key = priv_key.public_key

data = "some data to sign"
digest = OpenSSL::Digest::SHA256.new

puts pub.verify(digest, sig, data)

Apple页面似乎没有指定要使用的哈希算法,但从我所看到的来看,SHA-256似乎是正确的。(我也可能完全搞错了,苹果公司使用的是一种完全不同的格式。我很想知道这段代码是否有效)。

 类似资料:
  • 我有一个私钥(ecdsa,secp256r1)。 如何在没有充气城堡的情况下从Java中制作公钥?

  • 我试图生成私钥和公钥对。我想使用私钥签署我的JWT,并将公钥发送给第三方来解码我的JWT。 在mac os终端上,我生成了如下密钥: ssh-keygen-m PEM-t rsa-b 2048 现在我有了pkey吗 rsa_private=OpenSSL::PKey::rsa。新建(File.read(“/path/to/private/key/pkey”)) 你是私人的。要\u s “----开

  • 以下网站经常被引用,而且我认为是准确的: https://gobittest.appspot.com/Address 我试图在Golang中重现这些步骤,但第一步就失败了:-( 有人能给我提供一个Golang片段,给定ECDSA私钥,返回公钥吗?我想我可能具体指的是上述站点示例中的私钥指数和公钥指数。 i、 例如,给定随机生成的(十六进制编码的)私钥(指数?)<代码>E83385AF76B2B19

  • 我是新到cryptopp,并一直在努力为ECDSA签名创建私钥。 我有一个十六进制编码的私有指数。这存储为字符串。 我想用它来使用ECDSA签署文本块。我的代码看起来有点像这样 此代码在 Visual Studio 中生成以下错误,当我尝试执行 privateKey.load(...) 我猜我正在做一些有点愚蠢的事情...任何帮助都会很棒??? PS我在GMAC一代中使用ECDH时遇到了类似的问题

  • 我一直在试图确定如何检测点异常给定窗口异常。 更详细地说,我知道每个30天窗口是否包含异常。例如,窗口1从2009年1月1日开始,窗口2从2009年1月2日开始,依此类推。 现在我正试图利用这些知识来确定这些异常发生的日期。如果我在2009年5月1日至2009年8月1日期间出现异常,我的窗口将从2009年1月8日最后一天的窗口发出窗口信号,从2009年5日开始。 我只是不明白如何使用窗口找到出现异

  • 考虑以下代码: 这里无论有什么值,

  • 问题内容: 我试图从私钥生成公共ECDSA密钥,但是在Internet上如何进行此操作方面,我还没有找到太多帮助。几乎所有内容都是根据公共密钥规范生成公共密钥的,我不知道该如何获得。到目前为止,这是我汇总的内容: 但是,在运行时,出现以下错误: 我究竟做错了什么?有没有更好/更简便的方法可以做到这一点? 编辑:我设法获得一些代码进行编译,但不能正常工作: 当我运行它时,它会生成一个publicKe

  • 我正试图使用弹跳城堡来生成ECDSA密钥。从Java的角度来看,代码似乎工作得很好;但是,当我转储文件并试图验证数据时,OpenSSL不喜欢数据的格式。 经过一些研究,我认为bouncy castle正在将私钥编码为公钥。 null