Golang文件加密与解密问题解决方案
Golang文件加密与解密问题解决方案 链接
我有两个用于加密/解密文件的函数。加密功能正常,但解密功能由于某些原因无法工作。有什么想法吗?
func main() {
fmt.Println("hello world")
}
6 回复
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("文件解密成功")
}
关键修复点:
- 使用GCM模式提供认证加密
- 正确处理nonce(随机数)的生成和提取
- 确保加密和解密使用相同的密钥
- 添加了完整的错误处理
确保:
- 密钥长度正确(AES-256需要32字节)
- 加密和解密使用完全相同的密钥
- 加密时生成的nonce在解密时正确提取
- 文件路径和权限正确

