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

sta*_*abs 8 encryption

我使用 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)终端生成的新密钥加密/解密文件?

SEJ*_*JPM 5

对此的高级策略如下:

  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
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.pemciphertext.enc和组成MAC.bin,您可以按照自己喜欢的任何方式组合它。请注意,我选择 AES-256-OFB 并非偶然,而是有意为之,因为 CTR、CCM 和 GCM 模式无法通过命令行使用。进一步注意,我更喜欢 AES-256 而不是 AES-128 的标准选择,因为我们可以简单地将 SHA-256 的输出插入那里。更进一步注意,这里使用全零 IV 是安全的,因为 OF​​B“仅”需要每个密钥唯一的IV,并且每个密钥都是完全随机的。


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


小智 -2

首先,一些 OpenSSL 文档:https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations

并且已经用一个很好的代码示例回答了:/sf/ask/80678881/#3449701