crypto.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package crypto
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "crypto/sha256"
  7. "golang.org/x/crypto/scrypt"
  8. "io"
  9. )
  10. func GenerateEncryptKey(data []byte) []byte {
  11. sk, err := scrypt.Key(data, nil, 32768, 8, 1, 32)
  12. if err != nil {
  13. panic(err)
  14. }
  15. sum := sha256.Sum256(append(data, sk...))
  16. return sum[:]
  17. }
  18. func Hash256(data []byte) []byte {
  19. sum := sha256.Sum256(data)
  20. return sum[:]
  21. }
  22. func Encrypt(data []byte, key []byte) ([]byte, error) {
  23. block, err := aes.NewCipher(key)
  24. if err != nil {
  25. panic(err)
  26. }
  27. ciphertext := make([]byte, aes.BlockSize+len(data))
  28. iv := ciphertext[:aes.BlockSize]
  29. if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  30. panic(err)
  31. }
  32. stream := cipher.NewCTR(block, iv)
  33. stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
  34. return ciphertext, nil
  35. }
  36. func Decrypt(encryptedData []byte, key []byte) ([]byte, error) {
  37. block, err := aes.NewCipher(key)
  38. if err != nil {
  39. panic(err)
  40. }
  41. data := make([]byte, len(encryptedData[aes.BlockSize:]))
  42. iv := encryptedData[:aes.BlockSize]
  43. stream := cipher.NewCTR(block, iv)
  44. stream.XORKeyStream(data, encryptedData[aes.BlockSize:])
  45. return data, nil
  46. }