Golang文件加密与解密问题解决方案

Golang文件加密与解密问题解决方案 链接

我有两个用于加密/解密文件的函数。加密功能正常,但解密功能由于某些原因无法工作。有什么想法吗?

func main() {
    fmt.Println("hello world")
}
6 回复

你能提供那个恐慌的堆栈跟踪信息吗?

更多关于Golang文件加密与解密问题解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Serasar:

出于某种原因

你遇到了什么错误?

panic: 非法 base64 数据位于输入字节 344

我想我明白了。问题在于加密后的数据块比1024字节稍大一些。我认为需要在加密数据块的末尾添加一些标记,然后在解密时根据标记进行移动。但是我该如何搜索这些数据块呢?

goroutine 1 [running]:
main.decodeBase64(0x10e11010, 0x3f0, 0x3f0, 0x10, 0x10e113f0, 0x10)
C:/Dev/golang/src/test/endcrypt_decrypt.go:144 +0x96
main.decrypt(0x111fffa0, 0x20, 0x20, 0x10e11010, 0x3f0, 0x3f0, 0x0, 0x2f4, 0x2f4)
C:/Dev/golang/src/test/endcrypt_decrypt.go:178 +0xfe
main.decryptFile(0x111fffa0, 0x20, 0x20, 0x4ba035, 0xa, 0x4bc223, 0x14)
C:/Dev/golang/src/test/endcrypt_decrypt.go:130 +0x19d
main.main()
C:/Dev/golang/src/test/endcrypt_decrypt.go:52 +0xc3

在文件加密与解密过程中,常见的问题包括密钥不匹配、加密模式错误或填充处理不当。以下是修复后的完整示例,使用AES-256-GCM模式进行文件加密和解密:

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"fmt"
	"io"
	"os"
)

func encryptFile(inputPath, outputPath string, key []byte) error {
	// 读取原始文件
	plaintext, err := os.ReadFile(inputPath)
	if err != nil {
		return err
	}

	// 创建AES cipher
	block, err := aes.NewCipher(key)
	if err != nil {
		return err
	}

	// 创建GCM模式
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return err
	}

	// 生成随机nonce
	nonce := make([]byte, gcm.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		return err
	}

	// 加密数据
	ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)

	// 写入加密文件
	return os.WriteFile(outputPath, ciphertext, 0644)
}

func decryptFile(inputPath, outputPath string, key []byte) error {
	// 读取加密文件
	ciphertext, err := os.ReadFile(inputPath)
	if err != nil {
		return err
	}

	// 创建AES cipher
	block, err := aes.NewCipher(key)
	if err != nil {
		return err
	}

	// 创建GCM模式
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return err
	}

	// 提取nonce和实际密文
	nonceSize := gcm.NonceSize()
	if len(ciphertext) < nonceSize {
		return fmt.Errorf("ciphertext too short")
	}

	nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]

	// 解密数据
	plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
	if err != nil {
		return err
	}

	// 写入解密文件
	return os.WriteFile(outputPath, plaintext, 0644)
}

func main() {
	// 32字节密钥 (AES-256)
	key := []byte("thisis32bitlongpassphraseimusing")
	
	// 加密文件
	err := encryptFile("plaintext.txt", "encrypted.bin", key)
	if err != nil {
		fmt.Printf("加密失败: %v\n", err)
		return
	}
	fmt.Println("文件加密成功")

	// 解密文件
	err = decryptFile("encrypted.bin", "decrypted.txt", key)
	if err != nil {
		fmt.Printf("解密失败: %v\n", err)
		return
	}
	fmt.Println("文件解密成功")
}

关键修复点:

  1. 使用GCM模式提供认证加密
  2. 正确处理nonce(随机数)的生成和提取
  3. 确保加密和解密使用相同的密钥
  4. 添加了完整的错误处理

确保:

  • 密钥长度正确(AES-256需要32字节)
  • 加密和解密使用完全相同的密钥
  • 加密时生成的nonce在解密时正确提取
  • 文件路径和权限正确
回到顶部