【问题标题】:How to encrypt a file so that OpenSSL can decrypt it without providing the IV如何加密文件以便 OpenSSL 可以在不提供 IV 的情况下对其进行解密
【发布时间】:2022-08-12 16:20:26
【问题描述】:

我想以与openssl enc 命令相同的方式使用 AES 加密文件,所以当我想解密它时,不需要提供 IV。

    标签: go encryption openssl aes


    【解决方案1】:

    OpenSSL 使用密钥派生函数。在加密阶段,它生成一个随机盐,根据提供的密码和盐计算密钥和 IV,加密文件并将盐存储在文件的标题中盐渍__字首。

    在解密阶段,它还使用派生函数计算密钥和 IV,但这一次它从文件头获取盐。

    package main
    
    import (
        "crypto/aes"
        "crypto/cipher"
        "crypto/rand"
        "crypto/sha256"
        "io"
        "os"
        "golang.org/x/crypto/pbkdf2"
    )
    
    func main() {
    
        keySize := 32;
        // its only for demonstration purpose
        password := []byte("TESTPASSWORD1234TESTPASSWORD1234");
        bReader, err := os.Open("doc.docx")
        defer bReader.Close();
        if err != nil {
            panic(err)
        }
    
        salt := make([]byte, 8)
        if _, err := io.ReadFull(rand.Reader, salt[:]); err != nil {
            panic(err)
        }
    
        computed := pbkdf2.Key(password, salt, 10000, keySize + aes.BlockSize , sha256.New)
        key := computed[:keySize]
        iv := computed[keySize:]
    
        block, err := aes.NewCipher(key)                                    
        if err != nil {
            panic(err)
        }
        stream := cipher.NewOFB(block, iv)
    
        bWriter, err := os.Create("doc-encrypted.docx")
        if err != nil {
            panic(err)
        }
        defer bWriter.Close()
    
        prefix := []byte("Salted__");
        header := append(prefix[:], salt...);
      bWriter.Write(header)
        sWriter := &cipher.StreamWriter{S: stream, W: bWriter}
        if _, err := io.Copy(sWriter, bReader); err != nil {
            panic(err)
        }
    
    }
    
    

    你可以用openssl enc -in doc-encrypted.docx -out doc-decrypted.docx -d -aes-256-ofb -pbkdf2 -pass pass:TESTPASSWORD1234TESTPASSWORD1234解密它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多