import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"log"
)
// 加密密钥,需要保密,确保安全性
var encryptionKey = []byte("0123456789abcdef")
// EncryptPhone 加密手机号
func EncryptPhone(phone string) (string, error) {
block, err := aes.NewCipher(encryptionKey)
if err != nil {
return "", err
}
// 填充手机号到16的倍数长度
plaintext := []byte(phone)
padding := aes.BlockSize - (len(plaintext) % aes.BlockSize)
padText := append(plaintext, bytes.Repeat([]byte{byte(padding)}, padding)...)
ciphertext := make([]byte, len(padText))
mode := cipher.NewCBCEncrypter(block, encryptionKey)
mode.CryptBlocks(ciphertext, padText)
// 使用 base64 编码转换为可存储的字符串
encryptedPhone := base64.StdEncoding.EncodeToString(ciphertext)
return encryptedPhone, nil
}
// DecryptPhone 解密手机号
func DecryptPhone(encryptedPhone string) (string, error) {
ciphertext, err := base64.StdEncoding.DecodeString(encryptedPhone)
if err != nil {
return "", err
}
block, err := aes.NewCipher(encryptionKey)
if err != nil {
return "", err
}
// 解密数据
decrypted := make([]byte, len(ciphertext))
mode := cipher.NewCBCDecrypter(block, encryptionKey)
mode.CryptBlocks(decrypted, ciphertext)
// 去除填充的数据
padding := int(decrypted[len(decrypted)-1])
plaintext := decrypted[:len(decrypted)-padding]
return string(plaintext), nil
}
func main() {
phone := "1234567890"
// 加密手机号
encrypted, err := EncryptPhone(phone)
if err != nil {
log.Fatal(err)
}
fmt.Println("Encrypted Phone:", encrypted)
// 解密手机号
decrypted, err := DecryptPhone(encrypted)
if err != nil {
log.Fatal(err)
}
fmt.Println("Decrypted Phone:", decrypted)
}
在示例中,我们使用AES对称加密算法进行手机号的加密和解密。EncryptPhone函数接受一个手机号作为输入,并返回加密后的手机号。DecryptPhone函数接受一个加密后的手机号作为输入,并返回解密后的手机号。
注意,加密密钥encryptionKey需要保密,并确保安全性。请根据实际需求使用更强大的加密算法和更复杂的密钥管理来提高数据安全性。