Openssl 使用椭圆曲线secp256k1对命令行中的十六进制字符串进行数字签名

Openssl 使用椭圆曲线secp256k1对命令行中的十六进制字符串进行数字签名,openssl,cryptography,command-line-interface,digital-signature,elliptic-curve,Openssl,Cryptography,Command Line Interface,Digital Signature,Elliptic Curve,我正在尝试找出一种最简单的方法,使用一个私钥(也由一个十六进制值字符串表示)对一个十六进制值字符串进行数字签名。我对命令行或脚本持开放态度,但最好使用opensslcli 例如: 要签名的字符串:13331833DDF384DA83ED49296136C70D206AD2B19331BF25D390E69B222165E37 私钥: a675c86089e0622c112379906f5cf19ee336575af1bfa1de558051312db9afdc 希望有这样的命令: $ ope

我正在尝试找出一种最简单的方法,使用一个私钥(也由一个十六进制值字符串表示)对一个十六进制值字符串进行数字签名。我对命令行或脚本持开放态度,但最好使用
openssl
cli

例如:

  • 要签名的字符串:
    13331833DDF384DA83ED49296136C70D206AD2B19331BF25D390E69B222165E37
  • 私钥:
    a675c86089e0622c112379906f5cf19ee336575af1bfa1de558051312db9afdc
希望有这样的命令:

$ openssl sign -msg=1333183ddf384da83ed49296136c70d206ad2b19331bf25d390e69b222165e37 -privkey=a675c86089e0622c112379906f5cf19ee336575af1bfa1de558051312db9afdc

这并不简单,因为您必须以
openssl
支持的格式获取私钥(不支持原始十六进制字符串)。我选择使用.pem格式,因为网上有一些例子(见下图)

最后,我在bash中编写了一个命令行脚本,其中包含一个键和一个十六进制字符串:
$ec\u sign\u hex

#/bin/bash
##命令行解析
#######################
如果[$#-lt 2]];然后
echo“用法:$ec\u符号\u十六进制”
出口1
fi
inputHex=1美元
privKeyHex=2美元
##创建.pem和.pub文件
#############################
pubKeyHex=“$(openssl ec-inform DER-text-noout-in
#!/bin/bash
## Command Line parsing
#######################

if [[ $# -lt 2 ]]; then
    echo "Usage: $ ec_sign_hex <input-hex> <priv-key-hex>"
    exit 1
fi

inputHex=$1
privKeyHex=$2

## Create .pem and .pub files
#############################
pubKeyHex="$(openssl ec -inform DER -text -noout -in <(cat <(echo -n "302e0201010420") <(echo -n "${privKeyHex}") <(echo -n "a00706052b8104000a") | xxd -r -p) 2>/dev/null | tail -6 | head -5 | sed 's/[ :]//g' | tr -d '\n')"
asnFormatKey="30740201010420${privKeyHex}a00706052b8104000aa144034200${pubKeyHex}"
echo "-----BEGIN EC PRIVATE KEY-----" > tmp.pem
echo $asnFormatKey | xxd -r -p | base64 | fold -w 64 >> tmp.pem
echo "-----END EC PRIVATE KEY-----" >> tmp.pem

openssl ec -in tmp.pem -pubout -out tmpPub.pem &>/dev/null

## Sign message
#  sign:
    openssl pkeyutl -sign -inkey tmp.pem -in <(printf $inputHex | xxd -r -p) -out tmp.sig
    echo "Signature"
    echo "####################"
    echo ""
    openssl pkeyutl -sign -inkey tmp.pem -in <(printf $inputHex | xxd -r -p) | xxd -p #-hexdump #| xxd -p
    echo ""
    echo "####################"
#  verify:
    openssl pkeyutl -verify -pubin -inkey tmpPub.pem -sigfile tmp.sig -in <(printf $inputHex | xxd -r -p)

rm tmp.pem tmpPub.pem tmp.sig