2025-04-09 17:27:40 +08:00
|
|
|
|
package crypto
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/base64"
|
|
|
|
|
"encoding/hex"
|
|
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestAesEcbMobileEncryption(t *testing.T) {
|
|
|
|
|
// 测试手机号加密
|
2025-06-20 15:11:38 +08:00
|
|
|
|
mobile := "13380082033"
|
2025-04-09 17:27:40 +08:00
|
|
|
|
// 测试加密
|
2025-06-20 15:11:38 +08:00
|
|
|
|
encrypted, err := EncryptMobile(mobile, "ff83609b2b24fc73196aac3d3dfb874f")
|
2025-04-09 17:27:40 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("手机号加密失败: %v", err)
|
|
|
|
|
}
|
2025-06-20 15:11:38 +08:00
|
|
|
|
fmt.Printf("encrypted: %s\n", encrypted)
|
2025-04-09 17:27:40 +08:00
|
|
|
|
// 测试解密
|
2025-06-20 15:11:38 +08:00
|
|
|
|
decrypted, err := DecryptMobile("oEpLcrIpDPN63rOlESXTDg==", "ff83609b2b24fc73196aac3d3dfb874f")
|
2025-04-09 17:27:40 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("手机号解密失败: %v", err)
|
|
|
|
|
}
|
2025-06-20 15:11:38 +08:00
|
|
|
|
fmt.Printf("decrypted: %s\n", decrypted)
|
2025-04-09 17:27:40 +08:00
|
|
|
|
// 验证结果
|
|
|
|
|
if decrypted != mobile {
|
|
|
|
|
t.Errorf("解密结果不匹配,期望: %s, 实际: %s", mobile, decrypted)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试相同输入产生相同输出(确定性)
|
2025-06-20 15:11:38 +08:00
|
|
|
|
encrypted2, _ := EncryptMobile(mobile, "ff83609b2b24fc73196aac3d3dfb874f")
|
2025-04-09 17:27:40 +08:00
|
|
|
|
if encrypted != encrypted2 {
|
|
|
|
|
t.Errorf("AES-ECB不是确定性的,两次加密结果不同: %s vs %s", encrypted, encrypted2)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAesEcbHexEncryption(t *testing.T) {
|
|
|
|
|
// 测试十六进制编码加密
|
|
|
|
|
idCard := "440101199001011234"
|
|
|
|
|
key := []byte("1234567890abcdef") // 16字节AES-128密钥
|
|
|
|
|
|
|
|
|
|
// 测试HEX加密
|
|
|
|
|
encryptedHex, err := EncryptIDCard(idCard, key)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("身份证加密失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试HEX解密
|
|
|
|
|
decrypted, err := DecryptIDCard(encryptedHex, key)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("身份证解密失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证结果
|
|
|
|
|
if decrypted != idCard {
|
|
|
|
|
t.Errorf("解密结果不匹配,期望: %s, 实际: %s", idCard, decrypted)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAesEcbKeyValidation(t *testing.T) {
|
|
|
|
|
// 测试不同长度的密钥
|
|
|
|
|
validKeys := [][]byte{
|
|
|
|
|
make([]byte, 16), // AES-128
|
|
|
|
|
make([]byte, 24), // AES-192
|
|
|
|
|
make([]byte, 32), // AES-256
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
invalidKeys := [][]byte{
|
|
|
|
|
make([]byte, 15),
|
|
|
|
|
make([]byte, 20),
|
|
|
|
|
make([]byte, 33),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
text := []byte("test text")
|
|
|
|
|
|
|
|
|
|
// 测试有效密钥
|
|
|
|
|
for _, key := range validKeys {
|
|
|
|
|
_, err := AesEcbEncrypt(text, key)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Errorf("有效密钥(%d字节)校验失败: %v", len(key), err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试无效密钥
|
|
|
|
|
for _, key := range invalidKeys {
|
|
|
|
|
_, err := AesEcbEncrypt(text, key)
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Errorf("无效密钥(%d字节)未被检测出", len(key))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIsEncrypted(t *testing.T) {
|
|
|
|
|
// 有效的Base64编码字符串
|
|
|
|
|
validBase64 := base64.StdEncoding.EncodeToString([]byte("这是一个足够长的字符串,以通过IsEncrypted检查"))
|
|
|
|
|
|
|
|
|
|
// 无效的字符串
|
|
|
|
|
invalidStrings := []string{
|
|
|
|
|
"",
|
|
|
|
|
"abc",
|
|
|
|
|
"not-base64!@#",
|
|
|
|
|
hex.EncodeToString([]byte("hexstring")),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试有效的加密数据
|
|
|
|
|
if !IsEncrypted(validBase64) {
|
|
|
|
|
t.Errorf("有效的Base64未被识别为加密数据: %s", validBase64)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试无效的数据
|
|
|
|
|
for _, s := range invalidStrings {
|
|
|
|
|
if IsEncrypted(s) {
|
|
|
|
|
t.Errorf("无效字符串被错误识别为加密数据: %s", s)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestDeriveKeyFromPassword(t *testing.T) {
|
|
|
|
|
password := "my-secure-password"
|
|
|
|
|
|
|
|
|
|
// 测试不同长度的派生密钥
|
|
|
|
|
keySizes := []int{16, 24, 32}
|
|
|
|
|
|
|
|
|
|
for _, size := range keySizes {
|
|
|
|
|
key, err := DeriveKeyFromPassword(password, size)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Errorf("从密码派生%d字节密钥失败: %v", size, err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(key) != size {
|
|
|
|
|
t.Errorf("派生的密钥长度错误,期望: %d, 实际: %d", size, len(key))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试相同密码总是产生相同密钥
|
|
|
|
|
key2, _ := DeriveKeyFromPassword(password, size)
|
|
|
|
|
if string(key) != string(key2) {
|
|
|
|
|
t.Errorf("从相同密码派生的密钥不一致")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 使用派生的密钥加密测试
|
|
|
|
|
_, err = AesEcbEncrypt([]byte("test"), key)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Errorf("使用派生的密钥加密失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试无效的密钥大小
|
|
|
|
|
_, err := DeriveKeyFromPassword(password, 18)
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Error("无效的密钥大小未被检测出")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestGenerateAESKey(t *testing.T) {
|
|
|
|
|
// 测试生成不同长度的密钥
|
|
|
|
|
keySizes := []int{16, 24, 32}
|
|
|
|
|
|
|
|
|
|
for _, size := range keySizes {
|
|
|
|
|
key, err := GenerateAESKey(size)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Errorf("生成%d字节密钥失败: %v", size, err)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(key) != size {
|
|
|
|
|
t.Errorf("生成的密钥长度错误,期望: %d, 实际: %d", size, len(key))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 使用生成的密钥加密测试
|
|
|
|
|
_, err = AesEcbEncrypt([]byte("test"), key)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Errorf("使用生成的密钥加密失败: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 测试无效的密钥大小
|
|
|
|
|
_, err := GenerateAESKey(18)
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Error("无效的密钥大小未被检测出")
|
|
|
|
|
}
|
|
|
|
|
}
|