【发布时间】:2020-05-13 12:44:05
【问题描述】:
我正在尝试使用openssl 签署现有摘要。
假设我已经有一个摘要“mydigest”。话虽如此,我不想使用:
echo -n "mydigest" | openssl dgst -sha256 -sign key.pem | openssl enc -A -base64
我有 ECDSA 而不是 rsa,所以我认为我不应该使用按原样使用输入的rsautl。
所以我的假设是我需要按原样(mydigest)接受输入并使用我的 ECDSA 私钥对其进行签名的东西。
我尝试了以下以查看使用不同哈希算法创建的哈希大小是否对签名结果有任何影响:
echo -n "mydigest" | openssl pkeyutl -sign -inkey key.pem | openssl enc -A -base64
和
echo -n "my-very-very-very-long-digest" | openssl pkeyutl -sign -inkey key.pem | openssl enc -A -base64
但就输出长度而言,两个命令的输出大小相同。我会假设对于大型 my-very..-long-digest 它应该返回更大的输出(因为它应该按原样获取输入而不缩短(散列)。
=========================================
编辑。
也许下面的示例将有助于理解我的要求。这是 bouncycastle 的一个例子。
// sign something
String messageToSign = "something_to_sign";
ECDomainParameters domain = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN());
ECDSASigner signer = new ECDSASigner();
signer.init(true, new ECPrivateKeyParameters(privateKey, domain));
MessageDigest digest = MessageDigest.getInstance("Keccak-256");
byte[] hash = digest.digest(messageToSign.getBytes(StandardCharsets.UTF_8));
BigInteger[] signature = signer.generateSignature(hash);
假设我有以下内容:
- 散列。
- 键。
现在我想用openssl 创建签名,它应该将hash 和keys 作为输入而不创建散列。基本上我想替换
BigInteger[] signature = signer.generateSignature(hash);
在带有 openssl 的示例中。
openssl * ????? *
我假设结果的大小应该表明我用于散列的散列(具有不同的摘要大小)算法是否对结果有任何影响。
【问题讨论】:
-
很难理解你在问什么。您的所有示例,包括 RSA,首先将所有输入(无论多大)散列到固定长度的输出中,然后再将公钥原语应用于它。无论输入是 1 字节还是 1 PB,输出的大小都是相同的。
-
@PresidentJamesK.Polk 感谢您的评论。我在 OP 中添加了一个示例。长话短说,我只想使用 openssl 替换 BigInteger[] signature = signer.generateSignature(hash);使用命令行 openssl。但是,也许这是不可能的:) .... 我还检查了帖子:superuser.com/a/943973。因此,如果我有
-pkeyopt digest:$hash,它将不会在 rfc3447 的第 9.2 节中执行 EMSA-PKCS1-v1_5-ENCODE 的第 1 步——这基本上是散列? -
我明白了,谢谢你的例子。我想我希望 openssl 命令以相同的格式返回签名。当然,它们不会返回相同的签名,因为 ECDSA 包含一个随机组件。
-
这是我可以通过 openssl 命令行获得的最接近的结果:
echo -n "mydigest" | openssl pkeyutl -inkey ecdsa1-priv.pem -sign -asn1parse
标签: openssl rsa bouncycastle sign ecdsa