187 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package crypto | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"encoding/base64" | |||
|  | 	"encoding/hex" | |||
|  | 	"fmt" | |||
|  | 	"testing" | |||
|  | ) | |||
|  | 
 | |||
|  | func TestAesEcbMobileEncryption(t *testing.T) { | |||
|  | 	// 测试手机号加密 | |||
|  | 	mobile := "18653052547" | |||
|  | 	key := []byte("ff83609b2b24fc73196aac3d3dfb874f") // 16字节AES-128密钥 | |||
|  | 
 | |||
|  | 	keyStr := hex.EncodeToString(key) | |||
|  | 	// 测试加密 | |||
|  | 	encrypted, err := EncryptMobile(mobile, keyStr) | |||
|  | 	if err != nil { | |||
|  | 		t.Fatalf("手机号加密失败: %v", err) | |||
|  | 	} | |||
|  | 	fmt.Printf("encrypted: %s\n", encrypted) | |||
|  | 	jmStr := "m9EEeW9ZBBJmi1hx1k1uIQ==" | |||
|  | 	// 测试解密 | |||
|  | 	decrypted, err := DecryptMobile(jmStr, keyStr) | |||
|  | 	if err != nil { | |||
|  | 		t.Fatalf("手机号解密失败: %v", err) | |||
|  | 	} | |||
|  | 	fmt.Printf("decrypted: %s\n", decrypted) | |||
|  | 	// 验证结果 | |||
|  | 	if decrypted != mobile { | |||
|  | 		t.Errorf("解密结果不匹配,期望: %s, 实际: %s", mobile, decrypted) | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 测试相同输入产生相同输出(确定性) | |||
|  | 	encrypted2, _ := EncryptMobile(mobile, keyStr) | |||
|  | 	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("无效的密钥大小未被检测出") | |||
|  | 	} | |||
|  | } |