aes.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package aes
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/hmac"
  6. "crypto/rand"
  7. "crypto/sha256"
  8. "io"
  9. "os"
  10. )
  11. // 加密密钥和签名密钥
  12. var AesKey = []byte("AESKey1234567890")
  13. var hmacKey = []byte("HMACKey1234567890")
  14. func EncryptFile(filePath string, aesKey []byte, hmacKey []byte) ([]byte, []byte, error) {
  15. // 读取文件内容
  16. fileContent, err := os.ReadFile(filePath)
  17. if err != nil {
  18. return nil, nil, err
  19. }
  20. // 创建 AES 加密块
  21. block, err := aes.NewCipher(AesKey)
  22. if err != nil {
  23. return nil, nil, err
  24. }
  25. // 创建 AES 加密模式
  26. gcm, err := cipher.NewGCM(block)
  27. if err != nil {
  28. return nil, nil, err
  29. }
  30. // 生成随机 nonce
  31. nonce := make([]byte, gcm.NonceSize())
  32. if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
  33. return nil, nil, err
  34. }
  35. // 加密文件内容
  36. encryptedFileContent := gcm.Seal(nil, nonce, fileContent, nil)
  37. // 计算 HMAC 签名
  38. h := hmac.New(sha256.New, hmacKey)
  39. _, err = h.Write(encryptedFileContent)
  40. if err != nil {
  41. return nil, nil, err
  42. }
  43. signature := h.Sum(nil)
  44. return encryptedFileContent, signature, nil
  45. }