如何使用 EC 公钥加密文件?

如何使用 EC 公钥加密文件?

我已使用 openssl 生成了 EC 公钥/私钥对,命令如下:

openssl ecparam -name brainpoolP512t1 -param_enc explicit -genkey -out mykey.pem
openssl ec -in mykey.pem -pubout -out mykey.pub

如何使用刚刚通过(linux)终端生成的新密钥来加密/解密文件?

答案1

其高层策略如下:

  1. 使用以下方式生成临时 EC 私钥openssl ec
  2. 使用收件人的公钥派生共享秘密openssl pkeyutl
  3. openssl enc使用派生的密钥加密明文
  4. 使用私钥生成 EC 公钥openssl ecparam
  5. 使用以下方法将密文的 HMAC 生成到第三个文件中:openssl dgst
  6. 删除 EC 私钥和共享密钥

该手动流程大致如下:

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

执行加密的脚本大致如下所示:

    #!/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

上述代码应该可以工作,但可能不是最佳的。最终消息由和组成temppubkey.pem,您可以按照自己喜欢的任何方式组合它们。请注意,我选择 AES-256-OFB 并非偶然,而是有意为之,因为 CTR、CCM 和 GCM 模式无法通过命令行使用。进一步注意,我在这里更喜欢 AES-256 而不是标准的 AES-128,因为我们可以简单地将 SHA-256 的输出插入其中。进一步注意,使用全零 IV 在这里是安全的,因为 OF​​B“仅”需要ciphertext.encMAC.bin独特的每个密钥的 IV 和每个密钥都是完全随机的。


至于安全性考虑:此方法将为每个文件生成一个临时私钥,确保所有加密都是唯一的,并且一个共享密钥的泄露不会泄露同一对通信伙伴的所有共享密钥。您可以使用数字签名来确保消息确实来自同一来源。

答案2

相关内容