登录
首页 >  Golang >  Go问答

如何为 OpenSSL 提供自动解密文件的加密方式,无需手动提供 IV

来源:stackoverflow

时间:2024-02-11 08:27:21 206浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何为 OpenSSL 提供自动解密文件的加密方式,无需手动提供 IV》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我想用 AES 加密文件,就像 openssl enc 命令一样,所以当我想解密它时,不需要手动提供 IV。


正确答案


为了解密 aes 加密文件,您需要密钥和 iv。 iv 不是秘密,通常存储在加密文件中。

openssl 使用密钥派生函数使用提供的密码和随机盐生成这两个密钥。然后在加密后,它将盐存储在带有 salted__ 前缀的文件头中,因此在解密时它可以使用它与密码一起生成相同的密钥和 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 解密它

理论要掌握,实操不能落!以上关于《如何为 OpenSSL 提供自动解密文件的加密方式,无需手动提供 IV》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>