给定私钥和消息,不确定如何生成ECDSA签名

安德鲁

我正在遵循Apple关于编写CloudKit Web服务请求的指南我遇到的麻烦是“身份验证Web服务请求”下的步骤2:

  1. 用您的私钥计算此消息的ECDSA签名。

在此之前,我生成了一个.pem文件证书,在文本编辑器中打开该文件时会显示我的私钥,因此我也使用字符串格式。

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

因此,假设我有一个私钥(或.pem文件(如果需要))和一条消息作为字符串,那么从我的私钥中计算出消息的ECDSA签名在理论上应该相当简单。但是,这就是我努力的地方。我在网上发现的图书馆似乎采用了更为复杂的方法,其中的移动部件不同,没有引用.pem文件,也没有谈论生成新的公共/私有密钥。

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

马特

看起来目前缺少用于Ruby的OpenSSL EC支持的文档和实际API。特别是,在Ruby <= 2.3.1中,OpenSSL::PKey::EC用于签名和验证的API与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)

正如我在评论中所指出的那样,这在Ruby 2.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是正确的。(另外,我可能完全错了,Apple使用的是完全不同的格式。我很想知道此代码是否对您有用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不确定以编程方式生成的自签名ECDSA证书是否符合WebRTC的使用方式以及指纹计算是否正确

如何从其私钥生成ECDSA公钥?

如何使用 OpenSSL 为 DNSSEC 生成 ECDSA 私钥和公钥?

如何使用在 Hyperledger Fabric 中生成的 ECDSA 私钥和公钥进行加密和解密

如何使用RSA私钥和自签名证书生成p12文件?

如何使用RSA私钥和自签名证书生成p12文件

使用 Python 和 BeautifulSoup 的网页抓取 - 错误消息不确定如何修复

ECDSA私钥和公钥-如何获取SecretKey?

通过SHA224摘要使用ecdsa和私钥进行Golang签名

给定json作为响应,但不确定如何解析

Crypto.sign() 函数使用给定的私钥对消息进行签名

有什么方法可以使用私钥和签名获取签名消息?

生成由私钥签名的数据

如何使用智能卡和PKCS#11重用现有私钥以生成数字签名

Javascript:从私钥生成 ECDSA 公钥

Flutter-如何生成私钥/公钥对以加密消息

分离ECDSA密钥对的公钥和私钥

不确定如何打印?

如何在Go中存储ECDSA私钥

如何从 Java 编写加密的 ECDSA 私钥文件

vuetify v-checkbox中如何检查和不确定?

不确定如何在 python 中使用属性和方法

不确定如何进行与istream和ostream相关的功能

如何确定给定语言环境中给定消息密钥的翻译消息是否存在?

SKAdNetwork-生成签名-如何确定使用哪个版本?

如何在Python密码学中为ECDSA(secp256k1)生成较短的私钥

如何使用EdDSA / Ed448签名算法重新生成私钥?

不确定如何使用`$`功能

不确定如何正确测试