我使用 openssl 和以下命令生成了一个 EC 公钥/私钥对:
openssl ecparam -name brainpoolP512t1 -param_enc explicit -genkey -out mykey.pem
openssl ec -in mykey.pem -pubout -out mykey.pub
Run Code Online (Sandbox Code Playgroud)
如何使用我刚刚使用(linux)终端生成的新密钥加密/解密文件?
对此的高级策略如下:
openssl ecopenssl pkeyutlopenssl enc使用派生的密钥加密明文openssl ecparamopenssl dgst这个的手动流程应该大致如下:
openssl ec -genkey -param_enc explicit -out temppriv.pem -name brainpool512r1
openssl pkeyutl -derive -inkey temppriv.pem -peerkey RecipientsPublicKey.pem -out SharedSecret.bin
openssl dgst -sha256 -out HashedSharedSecret SharedSecret.bin
openssl enc -aes-256-ofb -iv "00000000000000000000000000000000" -K "<Enter Hex From HashedSharedSecret here>" -in YourPlaintextFile -out ciphertext.enc
openssl ecparam -in tempprivkey.pem -pubout -out temppubkey.pem
openssl dgst -sha256 -hmac "<Enter Hex From HashedSharedSecret here>" -out MAC.bin ciphertext.enc
#strip the everything non-hex using your editor from MAC.bin
rm SharedSecret.bin
rm tempprivkey.pem
Run Code Online (Sandbox Code Playgroud)
执行加密的脚本大致如下所示:
#!/bin/sh
EphemeralPrivateKey=$(openssl ecparam -genkey -param_enc explicit -name brainpool512r1) #generate the ephmeral private key
PrivateKeyBuffer=$(mktemp) #allocate a file to bufer the private key for the derive operation
PeerPublicKey="$1"
PlainTextFile="$2"
EphemeralPublicKeyFile="$3"
CipherTextFile="$4"
MACFile="$5"
echo -n "$EphemeralPrivateKey" > $PrivateKeyBuffer #buffer the private key
ProcessedDerivedSharedSecret=$(openssl pkeyutl -derive -inkey $PrivateKeyBuffer -peerkey $PeerPublicKey|openssl dgst -sha256) #derive the symmetric key using SHA-256 from the established secret
rm $PrivateKeyBuffer #remove the temporary file
ProcessedDerivedSharedSecret=${ProcessedDerivedSharedSecret#*= } #strip the (stdin)=
openssl enc -aes-256-ofb -iv "0000000000000000000000000000000" -K "$ProcessedDerivedSharedSecret" -in "$PlainTextFile" -out "$CipherTextFile" #encrypt using 0 IV and SHA-256 as key
MACValue=$(openssl dgst -sha256 -hmac "$ProcessedDerivedSharedSecret" "$CipherTextFile") #MAC it
MACValue=${MACValue#*= } #strip the (stdin)=
echo -n "$MACValue" > $MACFile #write the MAC
echo -n "$EphemeralPrivateKey" | openssl ec -param_enc explicit -pubout -out "$EphemeralPublicKeyFile" #write the ephemeral public key
Run Code Online (Sandbox Code Playgroud)
上面的代码应该可以工作,但可能不是最佳的。最终消息由temppubkey.pem、ciphertext.enc和组成MAC.bin,您可以按照自己喜欢的任何方式组合它。请注意,我选择 AES-256-OFB 并非偶然,而是有意为之,因为 CTR、CCM 和 GCM 模式无法通过命令行使用。进一步注意,我更喜欢 AES-256 而不是 AES-128 的标准选择,因为我们可以简单地将 SHA-256 的输出插入那里。更进一步注意,这里使用全零 IV 是安全的,因为 OFB“仅”需要每个密钥唯一的IV,并且每个密钥都是完全随机的。
至于安全方面的考虑:此方法会为每个文件生成一个临时私钥,确保所有加密都是唯一的,并且一个共享机密的泄漏不会泄漏同一对通信伙伴的所有共享机密。您可以使用数字签名来确保消息实际上来自同一来源。
小智 -2
首先,一些 OpenSSL 文档:https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations
并且已经用一个很好的代码示例回答了:/sf/ask/80678881/#3449701
| 归档时间: |
|
| 查看次数: |
11111 次 |
| 最近记录: |