github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/sm4soft/sm4_test.go (about) 1 // Copyright 2022 s1ren@github.com/hxx258456. 2 3 /* 4 sm4soft 是sm4的纯软实现,基于tjfoc国密算法库`tjfoc/gmsm`做了少量修改。 5 对应版权声明: thrid_licenses/github.com/tjfoc/gmsm/版权声明 6 */ 7 8 package sm4soft 9 10 import ( 11 "fmt" 12 "reflect" 13 "testing" 14 ) 15 16 func TestSM4(t *testing.T) { 17 // 定义密钥,16字节 18 key := []byte("abcdef1234567890") 19 fmt.Printf("key字节数组 : %v\n", key) 20 fmt.Printf("key字符串 : %s\n", key) 21 22 // 将key写入key.pem 23 err := WriteKeyToPemFile("testdata/key.pem", key, nil) 24 if err != nil { 25 t.Fatalf("WriteKeyToPem error") 26 } 27 // 读取key.pem 28 key, err = ReadKeyFromPemFile("testdata/key.pem", nil) 29 fmt.Printf("读取到的key字节数组 : %v\n", key) 30 fmt.Printf("读取到的key字符串 : %s\n", key) 31 if err != nil { 32 t.Fatal(err) 33 } 34 35 // 定义数据 36 // data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10} 37 data := []byte("天行健君子以自强不息") 38 fmt.Printf("data字节数组 : %v\n", data) 39 fmt.Printf("data十六进制 : %x\n", data) 40 fmt.Printf("data字符串 : %s\n", data) 41 42 // ECB模式加密 43 ecbMsg, err := Sm4Ecb(key, data, true) 44 if err != nil { 45 t.Errorf("sm4 enc error:%s", err) 46 return 47 } 48 fmt.Printf("ecbMsg 16进制 : %x\n", ecbMsg) 49 // ECB模式解密 50 ecbDec, err := Sm4Ecb(key, ecbMsg, false) 51 if err != nil { 52 t.Errorf("sm4 dec error:%s", err) 53 return 54 } 55 fmt.Printf("ecbDec : %s\n", ecbDec) 56 if !testCompare(data, ecbDec) { 57 t.Errorf("sm4 self enc and dec failed") 58 } 59 60 // 定义初始化向量,16字节 61 // iv := []byte("0000000000000000") 62 iv := []byte("1234def567890abc") 63 // err = SetIVDefault(iv) 64 fmt.Printf("err = %v\n", err) 65 fmt.Printf("iv字节数组 : %v\n", iv) 66 fmt.Printf("iv16进制 : %x\n", iv) 67 fmt.Printf("iv字符串 : %s\n", iv) 68 69 // CBC模式加密 70 cbcMsg, err := Sm4Cbc(key, iv, data, true) 71 if err != nil { 72 t.Errorf("sm4 enc error:%s", err) 73 } 74 fmt.Printf("cbcMsg 16进制 : %x\n", cbcMsg) 75 // CBC模式解密 76 cbcDec, err := Sm4Cbc(key, iv, cbcMsg, false) 77 if err != nil { 78 t.Errorf("sm4 dec error:%s", err) 79 return 80 } 81 fmt.Printf("cbcDec : %s\n", cbcDec) 82 if !testCompare(data, cbcDec) { 83 t.Errorf("sm4 self enc and dec failed") 84 } 85 86 // CFB模式加密 87 cfbMsg, err := Sm4CFB(key, iv, data, true) 88 if err != nil { 89 t.Errorf("sm4 enc error:%s", err) 90 } 91 fmt.Printf("cfbMsg 16进制 : %x\n", cfbMsg) 92 // CFB模式解密 93 cfbDec, err := Sm4CFB(key, iv, cfbMsg, false) 94 if err != nil { 95 t.Errorf("sm4 dec error:%s", err) 96 return 97 } 98 fmt.Printf("cfbDec : %s\n", cfbDec) 99 100 // OFB模式加密 101 ofbMsg, err := Sm4OFB(key, iv, data, true) 102 if err != nil { 103 t.Errorf("sm4 enc error:%s", err) 104 } 105 fmt.Printf("ofbMsg 16进制 : %x\n", ofbMsg) 106 // OFB模式解密 107 ofbDec, err := Sm4OFB(key, iv, ofbMsg, false) 108 if err != nil { 109 t.Errorf("sm4 dec error:%s", err) 110 return 111 } 112 fmt.Printf("ofbDec : %s\n", ofbDec) 113 } 114 115 func TestNewCipher(t *testing.T) { 116 key := []byte("1234567890abcdef") 117 // 直接用NewCipher只能对16字节的数据加密 118 data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10} 119 // data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32} 120 c, err := NewCipher(key) 121 if err != nil { 122 t.Fatal(err) 123 } 124 d0 := make([]byte, 16) 125 c.Encrypt(d0, data) 126 d1 := make([]byte, 16) 127 c.Decrypt(d1, d0) 128 } 129 130 func BenchmarkSM4(t *testing.B) { 131 t.ReportAllocs() 132 key := []byte("1234567890abcdef") 133 data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10} 134 err := WriteKeyToPemFile("key.pem", key, nil) 135 if err != nil { 136 t.Fatalf("WriteKeyToPem error") 137 } 138 key, err = ReadKeyFromPemFile("key.pem", nil) 139 if err != nil { 140 t.Fatal(err) 141 } 142 c, err := NewCipher(key) 143 if err != nil { 144 t.Fatal(err) 145 } 146 147 for i := 0; i < t.N; i++ { 148 d0 := make([]byte, 16) 149 c.Encrypt(d0, data) 150 d1 := make([]byte, 16) 151 c.Decrypt(d1, d0) 152 } 153 } 154 155 func TestErrKeyLen(t *testing.T) { 156 fmt.Printf("\n--------------test key len------------------") 157 key := []byte("1234567890abcdefg") 158 _, err := NewCipher(key) 159 if err != nil { 160 fmt.Println("\nError key len !") 161 } 162 key = []byte("1234") 163 _, err = NewCipher(key) 164 if err != nil { 165 fmt.Println("Error key len !") 166 } 167 fmt.Println("------------------end----------------------") 168 } 169 170 func testCompare(key1, key2 []byte) bool { 171 if len(key1) != len(key2) { 172 return false 173 } 174 for i, v := range key1 { 175 if i == 1 { 176 fmt.Println("type of v", reflect.TypeOf(v)) 177 } 178 a := key2[i] 179 if a != v { 180 return false 181 } 182 } 183 return true 184 }