Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
ioc_sixiang_license
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zengtianlai3
ioc_sixiang_license
Commits
dc3dc14b
Commit
dc3dc14b
authored
Nov 14, 2022
by
AfirSraftGarrier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
格式并加些打印
parent
3cca62fa
Changes
9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1803 additions
and
0 deletions
+1803
-0
DeviceControllerTest.java
.../iot/sixiang/license/controller/DeviceControllerTest.java
+229
-0
AuthData.java
...c/test/java/iot/sixiang/license/object/data/AuthData.java
+15
-0
ByteHelper.java
...se/src/test/java/iot/sixiang/license/util/ByteHelper.java
+223
-0
HmacShaUtils.java
.../src/test/java/iot/sixiang/license/util/HmacShaUtils.java
+59
-0
PubUtils.java
license/src/test/java/iot/sixiang/license/util/PubUtils.java
+190
-0
ByteUtil.java
.../src/test/java/iot/sixiang/license/util/sm4/ByteUtil.java
+616
-0
SM4.java
license/src/test/java/iot/sixiang/license/util/sm4/SM4.java
+300
-0
SM4Context.java
...rc/test/java/iot/sixiang/license/util/sm4/SM4Context.java
+15
-0
SM4Utils.java
.../src/test/java/iot/sixiang/license/util/sm4/SM4Utils.java
+156
-0
No files found.
license/src/test/java/iot/sixiang/license/controller/DeviceControllerTest.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
controller
;
import
com.alibaba.fastjson2.JSON
;
import
iot.sixiang.license.object.data.AuthData
;
import
iot.sixiang.license.util.HmacUtil
;
import
iot.sixiang.license.util.sm4.SM4Utils
;
import
org.junit.jupiter.api.Test
;
/**
* Created by M=54G
* Date 11/11/22 9:54 AM
* Description
*/
public
class
DeviceControllerTest
{
@Test
void
auth
()
{
String
appId
=
"ebsh71dp5t1ck948l5"
;
String
sn
=
"ERE54S619LNYMPKVN9"
;
String
appKey
=
"110801"
;
//showSendData(appId, sn, appKey);
goDo
(
"hellogo"
);
}
private
void
showSendData
(
String
appId
,
String
sn
,
String
appKey
)
{
byte
[]
stxBytes
=
{(
byte
)
0x55
,
(
byte
)
0xaa
};
String
string
=
"app_id="
+
appId
+
"&sn="
+
sn
;
String
sign
=
HmacUtil
.
encrypt
(
string
,
appKey
,
HmacUtil
.
HMAC_SHA1
);
AuthData
authData
=
new
AuthData
();
authData
.
setAppId
(
appId
);
authData
.
setSn
(
sn
);
authData
.
setSign
(
sign
);
byte
[]
dataBytes
=
JSON
.
toJSONString
(
authData
).
getBytes
();
int
length
=
dataBytes
.
length
+
stxBytes
.
length
;
byte
[]
lenBytes
=
{(
byte
)
(
0xff
&
length
),
(
byte
)
(
0xff
&
(
length
>>
8
))};
byte
cmdByte
=
(
byte
)
0x01
;
byte
ackByte
=
(
byte
)
0x00
;
byte
endByte
=
(
byte
)
0x00
;
// 加密最后字段
endByte
=
(
byte
)
(
endByte
^
cmdByte
);
endByte
=
(
byte
)
(
endByte
^
ackByte
);
for
(
int
i
=
0
;
i
<
length
-
2
;
i
++)
{
endByte
=
(
byte
)
(
endByte
^
dataBytes
[
i
]);
}
byte
[]
allBytes
=
byteMerger
(
stxBytes
,
lenBytes
,
new
byte
[]{
cmdByte
,
ackByte
},
dataBytes
,
new
byte
[]{
endByte
});
System
.
out
.
println
(
bytes2Hex
(
allBytes
));
}
private
void
goDo
(
String
string
)
{
SM4Utils
sm4
=
new
SM4Utils
();
String
secret
=
"9ec55e355f1e829e"
;
// 设置 密钥 16长度的字符
sm4
.
setSecretKey
(
secret
);
// 设置 向量 16长度的字符
// sm4.setIv("ee6855f0ea29e9e2");
// 设置待加密的文本
String
plainText
=
string
;
// 声明密钥和向量是否是32长度的十六进制的字符串,如果true则需要设置密钥向量都是十六进制的32长度字符串。Util.byteToHex("b7b3gSMFWd9a67i1".getBytes())
// sm4.setHexString(false);
// 进行加密
String
encryptString
=
sm4
.
encryptData_ECB
(
plainText
);
System
.
out
.
println
(
"原文:"
+
string
);
System
.
out
.
println
(
"密文: "
+
encryptString
);
}
@Test
void
authDevice
()
{
byte
[]
stxBytes
=
{(
byte
)
0x55
,
(
byte
)
0xaa
};
// 数据处理过程
// 先随机16组
///**
// * 取随机数生成新key
// */
//for(i=0;i<4;i++)
//{
//*((unsigned int *)(&rand_data[i*4]))=rand()&0xffffffff;
//}
//
//for(i=0;i<16;i++)
//{
// new_key[i]=rand_data[i]^base_key[i];
//}
AuthData
authData
=
new
AuthData
();
authData
.
setAppId
(
"sdfd"
);
authData
.
setSn
(
"sdf"
);
authData
.
setSign
(
"sdf"
);
byte
[]
dataBytes
=
JSON
.
toJSONString
(
authData
).
getBytes
();
int
length
=
dataBytes
.
length
+
stxBytes
.
length
;
byte
[]
lenBytes
=
{(
byte
)
(
0xff
&
length
),
(
byte
)
(
0xff
&
(
length
>>
8
))};
byte
cmdByte
=
(
byte
)
0x01
;
byte
ackByte
=
(
byte
)
0x00
;
byte
endByte
=
(
byte
)
0x00
;
// 加密最后字段
endByte
=
(
byte
)
(
endByte
^
cmdByte
);
endByte
=
(
byte
)
(
endByte
^
ackByte
);
for
(
int
i
=
0
;
i
<
length
-
2
;
i
++)
{
endByte
=
(
byte
)
(
endByte
^
dataBytes
[
i
]);
}
byte
[]
allBytes
=
byteMerger
(
stxBytes
,
lenBytes
,
new
byte
[]{
cmdByte
,
ackByte
},
dataBytes
,
new
byte
[]{
endByte
});
System
.
out
.
println
(
bytes2Hex
(
allBytes
));
}
public
static
byte
[]
byteMerger
(
byte
[]...
byteList
)
{
int
lengthByte
=
0
;
for
(
int
i
=
0
;
i
<
byteList
.
length
;
i
++)
{
lengthByte
+=
byteList
[
i
].
length
;
}
byte
[]
allByte
=
new
byte
[
lengthByte
];
int
countLength
=
0
;
for
(
int
i
=
0
;
i
<
byteList
.
length
;
i
++)
{
byte
[]
b
=
byteList
[
i
];
System
.
arraycopy
(
b
,
0
,
allByte
,
countLength
,
b
.
length
);
countLength
+=
b
.
length
;
}
return
allByte
;
}
public
static
String
bytes2Hex
(
byte
[]
bytes
)
{
if
(
bytes
==
null
)
{
return
null
;
}
StringBuilder
builder
=
new
StringBuilder
();
// 遍历byte[]数组,将每个byte数字转换成16进制字符,再拼接起来成字符串
for
(
int
i
=
0
;
i
<
bytes
.
length
;
i
++)
{
// 每个byte转换成16进制字符时,bytes[i] & 0xff如果高位是0,输出将会去掉,所以+0x100(在更高位加1),再截取后两位字符
builder
.
append
(
Integer
.
toString
((
bytes
[
i
]
&
0xff
)
+
0x100
,
16
).
substring
(
1
));
}
return
builder
.
toString
();
}
//public static void main(String[] args) {
// byte[] stxbyte = {(byte) 0x7E};
// byte[] typebyte = {(byte) 0x01};
// RespDevDataDto build = RespDevDataDto.builder().seqNo("0")
// .deviceSn("FSDF32FFZV").command("decodeconnectnorth")
// .timeStamp("1652233401604")
// .data(toStringHex("55AA34009000AB752BE54B0B05796E4C5E60060D99B79A37A534B4D081A6184C105FD7EABDBFE5ECE7EF08F933ED415CCD6DA82157059000FE")).build();
// String serverRespSign = DecodeHmacShaUtils.terminalReqSign(build);
// build.setSign(serverRespSign);
// byte[] resultbyte = JSONProvider.toJSONString(build).getBytes();
// Integer len = resultbyte.length + typebyte.length;
// String strlen = Integer.toString(len, 16);
// byte[] lenbyte = ByteHelper.hexStrToBytes(strlen, 2);
// byte[] databyte = ByteHelper.byteMerger(stxbyte, lenbyte, typebyte, resultbyte);
// System.out.println(byte2Hex(databyte));
// //7e0100017b22636f6d6d616e64223a226465636f6465636f6e6e6563746e6f727468222c2264617461223a2255efbfbd345c7530303030efbfbd5c7530303030efbfbd752befbfbd4b5c75303030425c7530303035796e4c5e605c75303030365c72efbfbdefbfbdefbfbd37efbfbd34efbfbdd081efbfbd5c75303031384c5c75303031305fefbfbdeabdbfefbfbdefbfbdefbfbdefbfbd5c62efbfbd33efbfbd415c5cefbfbd6defbfbd21575c7530303035efbfbd5c7530303030efbfbd222c22646576696365536e223a2246534446333246465a56222c227365714e6f223a2230222c227369676e223a2244344245393930333539343346454331323345354132414534443145353231304236413541463635222c2274696d655374616d70223a2231363532323333343031363034227d
//}
// 转化十六进制编码为字符串
public
static
String
toStringHex
(
String
s
)
{
byte
[]
baKeyword
=
new
byte
[
s
.
length
()
/
2
];
for
(
int
i
=
0
;
i
<
baKeyword
.
length
;
i
++)
{
try
{
baKeyword
[
i
]
=
(
byte
)
(
0xff
&
Integer
.
parseInt
(
s
.
substring
(
i
*
2
,
i
*
2
+
2
),
16
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
try
{
s
=
new
String
(
baKeyword
,
"utf-8"
);
//UTF-16le:Not
}
catch
(
Exception
e1
)
{
e1
.
printStackTrace
();
}
return
s
;
}
//public static String bytes2hex(byte[] bytes) {
// StringBuilder sb = new StringBuilder();
// String tmp;
// sb.append("[");
// for (byte b : bytes) {
// // 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制
// //tmp = Integer.toHexString(b);
// tmp = Integer.toString((b & 0xff) + 0x100, 16).substring(1);
// if (tmp.length() == 1) {
// tmp = "0" + tmp;//只有一位的前面补个0
// }
// sb.append(tmp).append(",");//每个字节用空格断开
// }
// sb.delete(sb.length() - 1, sb.length());//删除最后一个字节后面对于的空格
// sb.append("]");
// return sb.toString();
//}
///**
// * 将16进制字符转换成byte[]数组。与byte2Hex功能相反。
// *
// * @param string 16进制字符串
// * @return byte[]数组
// */
//public static byte[] hex2Byte(String string) {
// if (string == null || string.length() < 1) {
// return null;
// }
// // 因为一个byte生成两个字符,长度对应1:2,所以byte[]数组长度是字符串长度一半
// byte[] bytes = new byte[string.length() / 2];
// // 遍历byte[]数组,遍历次数是字符串长度一半
// for (int i = 0; i < string.length() / 2; i++) {
// // 截取没两个字符的前一个,将其转为int数值
// int high = Integer.parseInt(string.substring(i * 2, i * 2 + 1), 16);
// // 截取没两个字符的后一个,将其转为int数值
// int low = Integer.parseInt(string.substring(i * 2 + 1, i * 2 + 2), 16);
// // 高位字符对应的int值*16+低位的int值,强转成byte数值即可
// // 如dd,高位13*16+低位13=221(强转成byte二进制11011101,对应十进制-35)
// bytes[i] = (byte) (high * 16 + low);
// }
// return bytes;
//}
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/object/data/AuthData.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
object
.
data
;
import
lombok.Data
;
/**
* Created by M=54G
* Date 11/11/22 10:08 AM
* Description
*/
@Data
public
class
AuthData
{
private
String
appId
;
private
String
sn
;
private
String
sign
;
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/util/ByteHelper.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
;
import
org.apache.http.util.TextUtils
;
public
class
ByteHelper
{
/**
* src:源数组
* srcPos:源数组要复制的起始位置
* dest:目的数组
* destPos:目的数组放置的起始位置
* length:要复制的长度
*
* @param src
* @param begin
* @param count
* @return
*/
public
static
byte
[]
subBytes
(
byte
[]
src
,
int
begin
,
int
count
)
{
byte
[]
bs
=
new
byte
[
count
];
System
.
arraycopy
(
src
,
begin
,
bs
,
0
,
count
);
return
bs
;
}
/**
* 字节码转化十六进制
*
* @author xzb
*/
public
static
String
fromBytesToHex
(
byte
[]
resultBytes
)
{
StringBuilder
builder
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
resultBytes
.
length
;
i
++)
{
if
(
Integer
.
toHexString
(
0xFF
&
resultBytes
[
i
]).
length
()
==
1
)
{
builder
.
append
(
"0"
).
append
(
Integer
.
toHexString
(
0xFF
&
resultBytes
[
i
]));
}
else
{
builder
.
append
(
Integer
.
toHexString
(
0xFF
&
resultBytes
[
i
]));
}
}
return
builder
.
toString
();
}
/**
* byte[] 转为16进制String
*/
public
static
String
Bytes2HexString
(
byte
[]
b
)
{
String
ret
=
""
;
for
(
int
i
=
0
;
i
<
b
.
length
;
i
++)
{
String
hex
=
Integer
.
toHexString
(
b
[
i
]
&
0xFF
);
if
(
hex
.
length
()
==
1
)
{
hex
=
'0'
+
hex
;
}
ret
+=
hex
.
toUpperCase
();
}
return
ret
;
}
/**
* 转化十六进制编码为字符串
*
* @param s
* @return
*/
public
static
String
toStringHex
(
String
s
)
{
byte
[]
baKeyword
=
new
byte
[
s
.
length
()
/
2
];
for
(
int
i
=
0
;
i
<
baKeyword
.
length
;
i
++)
{
try
{
baKeyword
[
i
]
=
(
byte
)
(
0xff
&
Integer
.
parseInt
(
s
.
substring
(
i
*
2
,
i
*
2
+
2
),
16
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
try
{
s
=
new
String
(
baKeyword
,
"utf-8"
);
//UTF-16le:Not
}
catch
(
Exception
e1
)
{
e1
.
printStackTrace
();
}
return
s
;
}
/***
* 合并数组
* @param byteList
* @return
*/
public
static
byte
[]
byteMerger
(
byte
[]...
byteList
)
{
int
lengthByte
=
0
;
for
(
int
i
=
0
;
i
<
byteList
.
length
;
i
++)
{
lengthByte
+=
byteList
[
i
].
length
;
}
byte
[]
allByte
=
new
byte
[
lengthByte
];
int
countLength
=
0
;
for
(
int
i
=
0
;
i
<
byteList
.
length
;
i
++)
{
byte
[]
b
=
byteList
[
i
];
System
.
arraycopy
(
b
,
0
,
allByte
,
countLength
,
b
.
length
);
countLength
+=
b
.
length
;
}
return
allByte
;
}
/**
* 字符串转16进制
*
* @param string
* @return
*/
public
static
String
stringToHexString
(
String
string
)
{
char
[]
c
=
new
char
[
string
.
length
()];
c
=
string
.
toCharArray
();
String
hesStr
=
""
;
for
(
int
i
=
0
;
i
<
c
.
length
;
i
++)
{
hesStr
=
hesStr
+
Integer
.
toHexString
(
c
[
i
]);
}
return
hesStr
;
}
/**
* 字符串转化成为16进制字符串
*
* @param s
* @return
*/
public
static
String
strTo16
(
String
s
)
{
String
str
=
""
;
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
int
ch
=
(
int
)
s
.
charAt
(
i
);
String
s4
=
Integer
.
toHexString
(
ch
);
str
=
str
+
s4
;
}
return
str
;
}
/**
* hex字符串转byte数组
*
* @param inHex 待转换的Hex字符串
* @return 转换后的byte数组结果
*/
public
static
byte
[]
hexToByteArray
(
String
inHex
,
int
len
)
{
int
hexlen
=
inHex
.
length
();
byte
[]
result
;
if
(
hexlen
%
2
==
1
)
{
//奇数
hexlen
++;
result
=
new
byte
[(
hexlen
/
2
)];
inHex
=
"0"
+
inHex
;
}
else
{
//偶数
result
=
new
byte
[(
hexlen
/
2
)];
}
int
j
=
0
;
for
(
int
i
=
0
;
i
<
hexlen
;
i
+=
2
)
{
result
[
j
]
=
hexToByte
(
inHex
.
substring
(
i
,
i
+
2
));
j
++;
}
return
result
;
}
public
static
long
bytes2long
(
byte
[]
bs
)
throws
Exception
{
int
bytes
=
bs
.
length
;
if
(
bytes
>
1
)
{
if
((
bytes
%
2
)
!=
0
||
bytes
>
8
)
{
throw
new
Exception
(
"not support"
);
}
}
switch
(
bytes
)
{
case
0
:
return
0
;
case
1
:
return
(
long
)
((
bs
[
0
]
&
0xff
));
case
2
:
return
(
long
)
((
bs
[
0
]
&
0xff
)
<<
8
|
(
bs
[
1
]
&
0xff
));
case
4
:
return
(
long
)
((
bs
[
0
]
&
0xff
L
)
<<
24
|
(
bs
[
1
]
&
0xff
L
)
<<
16
|
(
bs
[
2
]
&
0xff
L
)
<<
8
|
(
bs
[
3
]
&
0xff
L
));
case
8
:
return
(
long
)
((
bs
[
0
]
&
0xff
L
)
<<
56
|
(
bs
[
1
]
&
0xff
L
)
<<
48
|
(
bs
[
2
]
&
0xff
L
)
<<
40
|
(
bs
[
3
]
&
0xff
L
)
<<
32
|
(
bs
[
4
]
&
0xff
L
)
<<
24
|
(
bs
[
5
]
&
0xff
L
)
<<
16
|
(
bs
[
6
]
&
0xff
L
)
<<
8
|
(
bs
[
7
]
&
0xff
L
));
default
:
throw
new
Exception
(
"not support"
);
}
//return 0;
}
public
static
long
bytes2long
(
byte
[]
bs
,
int
offset
)
{
return
(
long
)
((
bs
[
7
+
offset
]
&
0xff
L
)
<<
56
|
(
bs
[
6
+
offset
]
&
0xff
L
)
<<
48
|
(
bs
[
5
+
offset
]
&
0xff
L
)
<<
40
|
(
bs
[
4
+
offset
]
&
0xff
L
)
<<
32
|
(
bs
[
3
+
offset
]
&
0xff
L
)
<<
24
|
(
bs
[
2
+
offset
]
&
0xff
L
)
<<
16
|
(
bs
[
1
+
offset
]
&
0xff
L
)
<<
8
|
(
bs
[
0
+
offset
]
&
0xff
L
));
}
public
static
byte
[]
hexStrToBytes
(
String
hexStr
,
int
len
)
{
if
(
TextUtils
.
isEmpty
(
hexStr
)
||
hexStr
.
length
()
==
0
)
{
return
null
;
}
if
(
hexStr
.
length
()
%
2
==
1
)
{
hexStr
=
"0"
+
hexStr
;
}
byte
[]
result
=
new
byte
[
len
];
char
[]
chars
=
hexStr
.
toCharArray
();
int
hexlen
=
hexStr
.
length
();
if
(
hexlen
>
len
)
hexlen
=
len
;
for
(
int
i
=
0
;
i
<
hexlen
-
1
;
i
++)
{
result
[
i
]
=
(
byte
)
(
charToByte
(
chars
[
i
])
<<
4
|
charToByte
(
chars
[
i
+
1
]));
}
return
result
;
}
private
static
byte
charToByte
(
char
c
)
{
String
chars
=
"0123456789ABCDEF"
;
byte
b
=
(
byte
)
chars
.
indexOf
(
c
);
return
b
;
}
/**
* Hex字符串转byte
*
* @param inHex 待转换的Hex字符串
* @return 转换后的byte
*/
public
static
byte
hexToByte
(
String
inHex
)
{
return
(
byte
)
Integer
.
parseInt
(
inHex
,
16
);
}
}
license/src/test/java/iot/sixiang/license/util/HmacShaUtils.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
;
import
javax.crypto.Mac
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.nio.charset.StandardCharsets
;
/**
* Title: HmacShaUtils
* Description:
*
* @author YFW
* @version V1.0
* @date 2022-03-14
*/
public
class
HmacShaUtils
{
private
static
final
String
HMAC_ALGORITHM
=
"hmacsha1"
;
private
static
final
String
secretKey
=
"90d2fca50ea8ed5472c5776c9fc53699"
;
/**
* 使用HMAC_ALGORITHM加密。
*
* @param content,明文。
* @param secret,密钥。
* @return 密文。
*/
public
static
String
encrypt
(
String
content
,
String
secret
)
{
if
(
PubUtils
.
isNull
(
secret
))
secret
=
secretKey
;
try
{
byte
[]
text
=
content
.
getBytes
(
StandardCharsets
.
UTF_8
);
byte
[]
key
=
secret
.
getBytes
(
StandardCharsets
.
UTF_8
);
SecretKeySpec
secretKey
=
new
SecretKeySpec
(
key
,
HMAC_ALGORITHM
);
Mac
mac
=
Mac
.
getInstance
(
secretKey
.
getAlgorithm
());
mac
.
init
(
secretKey
);
return
byte2hex
(
mac
.
doFinal
(
text
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
/**
* 二进制转十六进制字符串。
*
* @param b,二进制数组。
* @return 十六进制字符串。
*/
public
static
String
byte2hex
(
byte
[]
b
)
{
StringBuffer
sb
=
new
StringBuffer
();
for
(
int
n
=
0
;
b
!=
null
&&
n
<
b
.
length
;
n
++)
{
String
stmp
=
Integer
.
toHexString
(
b
[
n
]
&
0XFF
);
if
(
stmp
.
length
()
==
1
)
{
sb
.
append
(
'0'
);
}
sb
.
append
(
stmp
);
}
return
sb
.
toString
().
toUpperCase
();
}
}
license/src/test/java/iot/sixiang/license/util/PubUtils.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
;
import
lombok.AccessLevel
;
import
lombok.NoArgsConstructor
;
import
java.util.Collection
;
import
java.util.UUID
;
/**
* Title: PubUtils
* Description: 公共实体类
*
* @author YFW
* @version V1.0
* @date 2020-07-28
*/
@NoArgsConstructor
(
access
=
AccessLevel
.
PRIVATE
)
public
class
PubUtils
{
/**
* The constant STRING_NULL.
*/
private
final
static
String
STRING_NULL
=
"-"
;
/**
* 匹配手机号码, 支持+86和86开头
*/
private
static
final
String
REGX_MOBILENUM
=
"^((\\+86)|(86))?(13|15|17|18)\\d{9}$"
;
/**
* 匹配手机号码, 支持+86和86开头
*/
private
static
final
String
REGX_MOBILENUM_NEW
=
"^((\\+86)|(86))?(1)\\d{10}$"
;
/**
* 匹配邮箱帐号
*/
private
static
final
String
REGX_EMAIL
=
"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"
;
/**
* 匹配设备标签,支持字母、数字、汉字和英文逗号,但不能以英文逗号结尾
*/
private
static
final
String
REGX_TAGS
=
"[a-zA-Z0-9,\\u4E00-\\u9FA5]*[^,]"
;
/**
* 匹配手机号码(先支持13, 15, 17, 18开头的手机号码).
*
* @param inputStr the input str
*
* @return the boolean
*/
public
static
Boolean
isMobileNumber
(
String
inputStr
)
{
return
!
PubUtils
.
isNull
(
inputStr
)
&&
inputStr
.
matches
(
REGX_MOBILENUM
);
}
public
static
Boolean
isMobileNumberNew
(
String
inputStr
)
{
return
!
PubUtils
.
isNull
(
inputStr
)
&&
inputStr
.
matches
(
REGX_MOBILENUM_NEW
);
}
/**
* 判断一个或多个对象是否为空
*
* @param values 可变参数, 要判断的一个或多个对象
*
* @return 只有要判断的一个对象都为空则返回true, 否则返回false boolean
*/
public
static
boolean
isNull
(
Object
...
values
)
{
if
(!
PubUtils
.
isNotNullAndNotEmpty
(
values
))
{
return
true
;
}
for
(
Object
value
:
values
)
{
boolean
flag
;
if
(
value
instanceof
Object
[])
{
flag
=
!
isNotNullAndNotEmpty
((
Object
[])
value
);
}
else
if
(
value
instanceof
Collection
<?>)
{
flag
=
!
isNotNullAndNotEmpty
((
Collection
<?>)
value
);
}
else
if
(
value
instanceof
String
)
{
flag
=
isOEmptyOrNull
(
value
);
}
else
{
flag
=
(
null
==
value
);
}
if
(
flag
)
{
return
true
;
}
}
return
false
;
}
/**
* Is o empty or null boolean.
*
* @param o the o
*
* @return boolean boolean
*/
private
static
boolean
isOEmptyOrNull
(
Object
o
)
{
return
o
==
null
||
isSEmptyOrNull
(
o
.
toString
());
}
/**
* Is s empty or null boolean.
*
* @param s the s
*
* @return boolean boolean
*/
private
static
boolean
isSEmptyOrNull
(
String
s
)
{
return
trimAndNullAsEmpty
(
s
).
length
()
<=
0
;
}
/**
* Trim and null as empty string.
*
* @param s the s
*
* @return java.lang.String string
*/
private
static
String
trimAndNullAsEmpty
(
String
s
)
{
if
(
s
!=
null
&&
!
s
.
trim
().
equals
(
STRING_NULL
))
{
return
s
.
trim
();
}
else
{
return
""
;
}
// return s == null ? "" : s.trim();
}
/**
* 判断对象数组是否为空并且数量大于0
*
* @param value the value
*
* @return boolean
*/
private
static
Boolean
isNotNullAndNotEmpty
(
Object
[]
value
)
{
boolean
bl
=
false
;
if
(
null
!=
value
&&
0
<
value
.
length
)
{
bl
=
true
;
}
return
bl
;
}
/**
* 判断对象集合(List,Set)是否为空并且数量大于0
*
* @param value the value
*
* @return boolean
*/
private
static
Boolean
isNotNullAndNotEmpty
(
Collection
<?>
value
)
{
boolean
bl
=
false
;
if
(
null
!=
value
&&
!
value
.
isEmpty
())
{
bl
=
true
;
}
return
bl
;
}
/**
* Is email boolean.
*
* @param str the str
*
* @return the boolean
*/
public
static
boolean
isEmail
(
String
str
)
{
boolean
bl
=
true
;
if
(
isSEmptyOrNull
(
str
)
||
!
str
.
matches
(
REGX_EMAIL
))
{
bl
=
false
;
}
return
bl
;
}
/**
* Is tags boolean.
*
* @param str the str
*
* @return the boolean
*/
public
static
boolean
isTags
(
String
str
)
{
boolean
bl
=
true
;
if
(
isSEmptyOrNull
(
str
)
||
!
str
.
matches
(
REGX_TAGS
))
{
bl
=
false
;
}
return
bl
;
}
/**
* Uuid string.
*
* @return the string
*/
public
synchronized
static
String
uuid
()
{
return
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
}
}
license/src/test/java/iot/sixiang/license/util/sm4/ByteUtil.java
0 → 100644
View file @
dc3dc14b
This diff is collapsed.
Click to expand it.
license/src/test/java/iot/sixiang/license/util/sm4/SM4.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
.
sm4
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
public
class
SM4
{
public
static
final
int
SM4_ENCRYPT
=
1
;
public
static
final
int
SM4_DECRYPT
=
0
;
private
long
GET_ULONG_BE
(
byte
[]
b
,
int
i
)
{
long
n
=
(
long
)
(
b
[
i
]
&
0xff
)
<<
24
|
(
long
)
((
b
[
i
+
1
]
&
0xff
)
<<
16
)
|
(
long
)
((
b
[
i
+
2
]
&
0xff
)
<<
8
)
|
(
long
)
(
b
[
i
+
3
]
&
0xff
)
&
0xffffffff
L
;
return
n
;
}
private
void
PUT_ULONG_BE
(
long
n
,
byte
[]
b
,
int
i
)
{
b
[
i
]
=
(
byte
)
(
int
)
(
0xFF
&
n
>>
24
);
b
[
i
+
1
]
=
(
byte
)
(
int
)
(
0xFF
&
n
>>
16
);
b
[
i
+
2
]
=
(
byte
)
(
int
)
(
0xFF
&
n
>>
8
);
b
[
i
+
3
]
=
(
byte
)
(
int
)
(
0xFF
&
n
);
}
private
long
SHL
(
long
x
,
int
n
)
{
return
(
x
&
0xFFFFFFFF
)
<<
n
;
}
private
long
ROTL
(
long
x
,
int
n
)
{
return
SHL
(
x
,
n
)
|
x
>>
(
32
-
n
);
}
private
void
SWAP
(
long
[]
sk
,
int
i
)
{
long
t
=
sk
[
i
];
sk
[
i
]
=
sk
[(
31
-
i
)];
sk
[(
31
-
i
)]
=
t
;
}
public
static
final
byte
[]
SboxTable
=
{(
byte
)
0xd6
,
(
byte
)
0x90
,
(
byte
)
0xe9
,
(
byte
)
0xfe
,
(
byte
)
0xcc
,
(
byte
)
0xe1
,
0x3d
,
(
byte
)
0xb7
,
0x16
,
(
byte
)
0xb6
,
0x14
,
(
byte
)
0xc2
,
0x28
,
(
byte
)
0xfb
,
0x2c
,
0x05
,
0x2b
,
0x67
,
(
byte
)
0x9a
,
0x76
,
0x2a
,
(
byte
)
0xbe
,
0x04
,
(
byte
)
0xc3
,
(
byte
)
0xaa
,
0x44
,
0x13
,
0x26
,
0x49
,
(
byte
)
0x86
,
0x06
,
(
byte
)
0x99
,
(
byte
)
0x9c
,
0x42
,
0x50
,
(
byte
)
0xf4
,
(
byte
)
0x91
,
(
byte
)
0xef
,
(
byte
)
0x98
,
0x7a
,
0x33
,
0x54
,
0x0b
,
0x43
,
(
byte
)
0xed
,
(
byte
)
0xcf
,
(
byte
)
0xac
,
0x62
,
(
byte
)
0xe4
,
(
byte
)
0xb3
,
0x1c
,
(
byte
)
0xa9
,
(
byte
)
0xc9
,
0x08
,
(
byte
)
0xe8
,
(
byte
)
0x95
,
(
byte
)
0x80
,
(
byte
)
0xdf
,
(
byte
)
0x94
,
(
byte
)
0xfa
,
0x75
,
(
byte
)
0x8f
,
0x3f
,
(
byte
)
0xa6
,
0x47
,
0x07
,
(
byte
)
0xa7
,
(
byte
)
0xfc
,
(
byte
)
0xf3
,
0x73
,
0x17
,
(
byte
)
0xba
,
(
byte
)
0x83
,
0x59
,
0x3c
,
0x19
,
(
byte
)
0xe6
,
(
byte
)
0x85
,
0x4f
,
(
byte
)
0xa8
,
0x68
,
0x6b
,
(
byte
)
0x81
,
(
byte
)
0xb2
,
0x71
,
0x64
,
(
byte
)
0xda
,
(
byte
)
0x8b
,
(
byte
)
0xf8
,
(
byte
)
0xeb
,
0x0f
,
0x4b
,
0x70
,
0x56
,
(
byte
)
0x9d
,
0x35
,
0x1e
,
0x24
,
0x0e
,
0x5e
,
0x63
,
0x58
,
(
byte
)
0xd1
,
(
byte
)
0xa2
,
0x25
,
0x22
,
0x7c
,
0x3b
,
0x01
,
0x21
,
0x78
,
(
byte
)
0x87
,
(
byte
)
0xd4
,
0x00
,
0x46
,
0x57
,
(
byte
)
0x9f
,
(
byte
)
0xd3
,
0x27
,
0x52
,
0x4c
,
0x36
,
0x02
,
(
byte
)
0xe7
,
(
byte
)
0xa0
,
(
byte
)
0xc4
,
(
byte
)
0xc8
,
(
byte
)
0x9e
,
(
byte
)
0xea
,
(
byte
)
0xbf
,
(
byte
)
0x8a
,
(
byte
)
0xd2
,
0x40
,
(
byte
)
0xc7
,
0x38
,
(
byte
)
0xb5
,
(
byte
)
0xa3
,
(
byte
)
0xf7
,
(
byte
)
0xf2
,
(
byte
)
0xce
,
(
byte
)
0xf9
,
0x61
,
0x15
,
(
byte
)
0xa1
,
(
byte
)
0xe0
,
(
byte
)
0xae
,
0x5d
,
(
byte
)
0xa4
,
(
byte
)
0x9b
,
0x34
,
0x1a
,
0x55
,
(
byte
)
0xad
,
(
byte
)
0x93
,
0x32
,
0x30
,
(
byte
)
0xf5
,
(
byte
)
0x8c
,
(
byte
)
0xb1
,
(
byte
)
0xe3
,
0x1d
,
(
byte
)
0xf6
,
(
byte
)
0xe2
,
0x2e
,
(
byte
)
0x82
,
0x66
,
(
byte
)
0xca
,
0x60
,
(
byte
)
0xc0
,
0x29
,
0x23
,
(
byte
)
0xab
,
0x0d
,
0x53
,
0x4e
,
0x6f
,
(
byte
)
0xd5
,
(
byte
)
0xdb
,
0x37
,
0x45
,
(
byte
)
0xde
,
(
byte
)
0xfd
,
(
byte
)
0x8e
,
0x2f
,
0x03
,
(
byte
)
0xff
,
0x6a
,
0x72
,
0x6d
,
0x6c
,
0x5b
,
0x51
,
(
byte
)
0x8d
,
0x1b
,
(
byte
)
0xaf
,
(
byte
)
0x92
,
(
byte
)
0xbb
,
(
byte
)
0xdd
,
(
byte
)
0xbc
,
0x7f
,
0x11
,
(
byte
)
0xd9
,
0x5c
,
0x41
,
0x1f
,
0x10
,
0x5a
,
(
byte
)
0xd8
,
0x0a
,
(
byte
)
0xc1
,
0x31
,
(
byte
)
0x88
,
(
byte
)
0xa5
,
(
byte
)
0xcd
,
0x7b
,
(
byte
)
0xbd
,
0x2d
,
0x74
,
(
byte
)
0xd0
,
0x12
,
(
byte
)
0xb8
,
(
byte
)
0xe5
,
(
byte
)
0xb4
,
(
byte
)
0xb0
,
(
byte
)
0x89
,
0x69
,
(
byte
)
0x97
,
0x4a
,
0x0c
,
(
byte
)
0x96
,
0x77
,
0x7e
,
0x65
,
(
byte
)
0xb9
,
(
byte
)
0xf1
,
0x09
,
(
byte
)
0xc5
,
0x6e
,
(
byte
)
0xc6
,
(
byte
)
0x84
,
0x18
,
(
byte
)
0xf0
,
0x7d
,
(
byte
)
0xec
,
0x3a
,
(
byte
)
0xdc
,
0x4d
,
0x20
,
0x79
,
(
byte
)
0xee
,
0x5f
,
0x3e
,
(
byte
)
0xd7
,
(
byte
)
0xcb
,
0x39
,
0x48
};
public
static
final
int
[]
FK
=
{
0xa3b1bac6
,
0x56aa3350
,
0x677d9197
,
0xb27022dc
};
public
static
final
int
[]
CK
=
{
0x00070e15
,
0x1c232a31
,
0x383f464d
,
0x545b6269
,
0x70777e85
,
0x8c939aa1
,
0xa8afb6bd
,
0xc4cbd2d9
,
0xe0e7eef5
,
0xfc030a11
,
0x181f262d
,
0x343b4249
,
0x50575e65
,
0x6c737a81
,
0x888f969d
,
0xa4abb2b9
,
0xc0c7ced5
,
0xdce3eaf1
,
0xf8ff060d
,
0x141b2229
,
0x30373e45
,
0x4c535a61
,
0x686f767d
,
0x848b9299
,
0xa0a7aeb5
,
0xbcc3cad1
,
0xd8dfe6ed
,
0xf4fb0209
,
0x10171e25
,
0x2c333a41
,
0x484f565d
,
0x646b7279
};
private
byte
sm4Sbox
(
byte
inch
)
{
int
i
=
inch
&
0xFF
;
byte
retVal
=
SboxTable
[
i
];
return
retVal
;
}
private
long
sm4Lt
(
long
ka
)
{
long
bb
=
0L
;
long
c
=
0L
;
byte
[]
a
=
new
byte
[
4
];
byte
[]
b
=
new
byte
[
4
];
PUT_ULONG_BE
(
ka
,
a
,
0
);
b
[
0
]
=
sm4Sbox
(
a
[
0
]);
b
[
1
]
=
sm4Sbox
(
a
[
1
]);
b
[
2
]
=
sm4Sbox
(
a
[
2
]);
b
[
3
]
=
sm4Sbox
(
a
[
3
]);
bb
=
GET_ULONG_BE
(
b
,
0
);
c
=
bb
^
ROTL
(
bb
,
2
)
^
ROTL
(
bb
,
10
)
^
ROTL
(
bb
,
18
)
^
ROTL
(
bb
,
24
);
return
c
;
}
private
long
sm4F
(
long
x0
,
long
x1
,
long
x2
,
long
x3
,
long
rk
)
{
return
x0
^
sm4Lt
(
x1
^
x2
^
x3
^
rk
);
}
private
long
sm4CalciRK
(
long
ka
)
{
long
bb
=
0L
;
long
rk
=
0L
;
byte
[]
a
=
new
byte
[
4
];
byte
[]
b
=
new
byte
[
4
];
PUT_ULONG_BE
(
ka
,
a
,
0
);
b
[
0
]
=
sm4Sbox
(
a
[
0
]);
b
[
1
]
=
sm4Sbox
(
a
[
1
]);
b
[
2
]
=
sm4Sbox
(
a
[
2
]);
b
[
3
]
=
sm4Sbox
(
a
[
3
]);
bb
=
GET_ULONG_BE
(
b
,
0
);
rk
=
bb
^
ROTL
(
bb
,
13
)
^
ROTL
(
bb
,
23
);
return
rk
;
}
private
void
sm4_setkey
(
long
[]
SK
,
byte
[]
key
)
{
long
[]
MK
=
new
long
[
4
];
long
[]
k
=
new
long
[
36
];
int
i
=
0
;
MK
[
0
]
=
GET_ULONG_BE
(
key
,
0
);
MK
[
1
]
=
GET_ULONG_BE
(
key
,
4
);
MK
[
2
]
=
GET_ULONG_BE
(
key
,
8
);
MK
[
3
]
=
GET_ULONG_BE
(
key
,
12
);
k
[
0
]
=
MK
[
0
]
^
(
long
)
FK
[
0
];
k
[
1
]
=
MK
[
1
]
^
(
long
)
FK
[
1
];
k
[
2
]
=
MK
[
2
]
^
(
long
)
FK
[
2
];
k
[
3
]
=
MK
[
3
]
^
(
long
)
FK
[
3
];
for
(;
i
<
32
;
i
++)
{
k
[(
i
+
4
)]
=
(
k
[
i
]
^
sm4CalciRK
(
k
[(
i
+
1
)]
^
k
[(
i
+
2
)]
^
k
[(
i
+
3
)]
^
(
long
)
CK
[
i
]));
SK
[
i
]
=
k
[(
i
+
4
)];
}
}
private
void
sm4_one_round
(
long
[]
sk
,
byte
[]
input
,
byte
[]
output
)
{
int
i
=
0
;
long
[]
ulbuf
=
new
long
[
36
];
ulbuf
[
0
]
=
GET_ULONG_BE
(
input
,
0
);
ulbuf
[
1
]
=
GET_ULONG_BE
(
input
,
4
);
ulbuf
[
2
]
=
GET_ULONG_BE
(
input
,
8
);
ulbuf
[
3
]
=
GET_ULONG_BE
(
input
,
12
);
while
(
i
<
32
)
{
ulbuf
[(
i
+
4
)]
=
sm4F
(
ulbuf
[
i
],
ulbuf
[(
i
+
1
)],
ulbuf
[(
i
+
2
)],
ulbuf
[(
i
+
3
)],
sk
[
i
]);
i
++;
}
PUT_ULONG_BE
(
ulbuf
[
35
],
output
,
0
);
PUT_ULONG_BE
(
ulbuf
[
34
],
output
,
4
);
PUT_ULONG_BE
(
ulbuf
[
33
],
output
,
8
);
PUT_ULONG_BE
(
ulbuf
[
32
],
output
,
12
);
}
private
byte
[]
padding
(
byte
[]
input
,
int
mode
)
{
if
(
input
==
null
)
{
return
null
;
}
byte
[]
ret
=
(
byte
[])
null
;
if
(
mode
==
SM4_ENCRYPT
)
{
int
p
=
16
-
input
.
length
%
16
;
ret
=
new
byte
[
input
.
length
+
p
];
System
.
arraycopy
(
input
,
0
,
ret
,
0
,
input
.
length
);
for
(
int
i
=
0
;
i
<
p
;
i
++)
{
ret
[
input
.
length
+
i
]
=
(
byte
)
p
;
}
}
else
{
int
p
=
input
[
input
.
length
-
1
];
ret
=
new
byte
[
input
.
length
-
p
];
System
.
arraycopy
(
input
,
0
,
ret
,
0
,
input
.
length
-
p
);
}
return
ret
;
}
public
void
sm4_setkey_enc
(
SM4Context
ctx
,
byte
[]
key
)
throws
Exception
{
if
(
ctx
==
null
)
{
throw
new
Exception
(
"ctx is null!"
);
}
if
(
key
==
null
||
key
.
length
!=
16
)
{
throw
new
Exception
(
"key error!"
);
}
ctx
.
mode
=
SM4_ENCRYPT
;
sm4_setkey
(
ctx
.
sk
,
key
);
}
public
void
sm4_setkey_dec
(
SM4Context
ctx
,
byte
[]
key
)
throws
Exception
{
if
(
ctx
==
null
)
{
throw
new
Exception
(
"ctx is null!"
);
}
if
(
key
==
null
||
key
.
length
!=
16
)
{
throw
new
Exception
(
"key error!"
);
}
int
i
=
0
;
ctx
.
mode
=
SM4_DECRYPT
;
sm4_setkey
(
ctx
.
sk
,
key
);
for
(
i
=
0
;
i
<
16
;
i
++)
{
SWAP
(
ctx
.
sk
,
i
);
}
}
public
byte
[]
sm4_crypt_ecb
(
SM4Context
ctx
,
byte
[]
input
)
throws
Exception
{
if
(
input
==
null
)
{
throw
new
Exception
(
"input is null!"
);
}
if
((
ctx
.
isPadding
)
&&
(
ctx
.
mode
==
SM4_ENCRYPT
))
{
input
=
padding
(
input
,
SM4_ENCRYPT
);
}
int
length
=
input
.
length
;
ByteArrayInputStream
bins
=
new
ByteArrayInputStream
(
input
);
ByteArrayOutputStream
bous
=
new
ByteArrayOutputStream
();
for
(;
length
>
0
;
length
-=
16
)
{
byte
[]
in
=
new
byte
[
16
];
byte
[]
out
=
new
byte
[
16
];
bins
.
read
(
in
);
sm4_one_round
(
ctx
.
sk
,
in
,
out
);
bous
.
write
(
out
);
}
byte
[]
output
=
bous
.
toByteArray
();
if
(
ctx
.
isPadding
&&
ctx
.
mode
==
SM4_DECRYPT
)
{
output
=
padding
(
output
,
SM4_DECRYPT
);
}
bins
.
close
();
bous
.
close
();
return
output
;
}
public
byte
[]
sm4_crypt_cbc
(
SM4Context
ctx
,
byte
[]
iv
,
byte
[]
input
)
throws
Exception
{
if
(
iv
==
null
||
iv
.
length
!=
16
)
{
throw
new
Exception
(
"iv error!"
);
}
if
(
input
==
null
)
{
throw
new
Exception
(
"input is null!"
);
}
if
(
ctx
.
isPadding
&&
ctx
.
mode
==
SM4_ENCRYPT
)
{
input
=
padding
(
input
,
SM4_ENCRYPT
);
}
int
i
=
0
;
int
length
=
input
.
length
;
ByteArrayInputStream
bins
=
new
ByteArrayInputStream
(
input
);
ByteArrayOutputStream
bous
=
new
ByteArrayOutputStream
();
if
(
ctx
.
mode
==
SM4_ENCRYPT
)
{
for
(;
length
>
0
;
length
-=
16
)
{
byte
[]
in
=
new
byte
[
16
];
byte
[]
out
=
new
byte
[
16
];
byte
[]
out1
=
new
byte
[
16
];
bins
.
read
(
in
);
for
(
i
=
0
;
i
<
16
;
i
++)
{
out
[
i
]
=
((
byte
)
(
in
[
i
]
^
iv
[
i
]));
}
sm4_one_round
(
ctx
.
sk
,
out
,
out1
);
System
.
arraycopy
(
out1
,
0
,
iv
,
0
,
16
);
bous
.
write
(
out1
);
}
}
else
{
byte
[]
temp
=
new
byte
[
16
];
for
(;
length
>
0
;
length
-=
16
)
{
byte
[]
in
=
new
byte
[
16
];
byte
[]
out
=
new
byte
[
16
];
byte
[]
out1
=
new
byte
[
16
];
bins
.
read
(
in
);
System
.
arraycopy
(
in
,
0
,
temp
,
0
,
16
);
sm4_one_round
(
ctx
.
sk
,
in
,
out
);
for
(
i
=
0
;
i
<
16
;
i
++)
{
out1
[
i
]
=
((
byte
)
(
out
[
i
]
^
iv
[
i
]));
}
System
.
arraycopy
(
temp
,
0
,
iv
,
0
,
16
);
bous
.
write
(
out1
);
}
}
byte
[]
output
=
bous
.
toByteArray
();
if
(
ctx
.
isPadding
&&
ctx
.
mode
==
SM4_DECRYPT
)
{
output
=
padding
(
output
,
SM4_DECRYPT
);
}
bins
.
close
();
bous
.
close
();
return
output
;
}
}
license/src/test/java/iot/sixiang/license/util/sm4/SM4Context.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
.
sm4
;
public
class
SM4Context
{
public
int
mode
;
public
long
[]
sk
;
public
boolean
isPadding
;
public
SM4Context
()
{
this
.
mode
=
1
;
this
.
isPadding
=
true
;
this
.
sk
=
new
long
[
32
];
}
}
license/src/test/java/iot/sixiang/license/util/sm4/SM4Utils.java
0 → 100644
View file @
dc3dc14b
package
iot
.
sixiang
.
license
.
util
.
sm4
;
import
java.util.Base64
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
public
class
SM4Utils
{
public
String
getSecretKey
()
{
return
secretKey
;
}
public
void
setSecretKey
(
String
secretKey
)
{
this
.
secretKey
=
secretKey
;
}
public
boolean
isHexString
()
{
return
hexString
;
}
public
void
setHexString
(
boolean
hexString
)
{
this
.
hexString
=
hexString
;
}
private
String
secretKey
=
""
;
public
String
getIv
()
{
return
iv
;
}
public
void
setIv
(
String
iv
)
{
this
.
iv
=
iv
;
}
private
String
iv
=
""
;
private
boolean
hexString
=
false
;
public
SM4Utils
()
{
}
public
String
encryptData_ECB
(
String
plainText
)
{
try
{
SM4Context
ctx
=
new
SM4Context
();
ctx
.
isPadding
=
true
;
ctx
.
mode
=
SM4
.
SM4_ENCRYPT
;
byte
[]
keyBytes
;
if
(
hexString
)
{
keyBytes
=
ByteUtil
.
hexStringToBytes
(
secretKey
);
}
else
{
keyBytes
=
secretKey
.
getBytes
();
}
SM4
sm4
=
new
SM4
();
sm4
.
sm4_setkey_enc
(
ctx
,
keyBytes
);
byte
[]
encrypted
=
sm4
.
sm4_crypt_ecb
(
ctx
,
plainText
.
getBytes
(
"UTF-8"
));
String
cipherText
=
Base64
.
getEncoder
().
encodeToString
(
encrypted
);
if
(
cipherText
!=
null
&&
cipherText
.
trim
().
length
()
>
0
)
{
Pattern
p
=
Pattern
.
compile
(
"\\s*|\t|\r|\n"
);
Matcher
m
=
p
.
matcher
(
cipherText
);
cipherText
=
m
.
replaceAll
(
""
);
}
return
cipherText
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
public
String
decryptData_ECB
(
String
cipherText
)
{
try
{
SM4Context
ctx
=
new
SM4Context
();
ctx
.
isPadding
=
true
;
ctx
.
mode
=
SM4
.
SM4_DECRYPT
;
byte
[]
keyBytes
;
if
(
hexString
)
{
keyBytes
=
ByteUtil
.
hexStringToBytes
(
secretKey
);
}
else
{
keyBytes
=
secretKey
.
getBytes
();
}
SM4
sm4
=
new
SM4
();
sm4
.
sm4_setkey_dec
(
ctx
,
keyBytes
);
byte
[]
decrypted
=
sm4
.
sm4_crypt_ecb
(
ctx
,
Base64
.
getDecoder
().
decode
(
cipherText
));
return
new
String
(
decrypted
,
"UTF-8"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
public
String
encryptData_CBC
(
String
plainText
)
{
try
{
SM4Context
ctx
=
new
SM4Context
();
ctx
.
isPadding
=
true
;
ctx
.
mode
=
SM4
.
SM4_ENCRYPT
;
byte
[]
keyBytes
;
byte
[]
ivBytes
;
if
(
hexString
)
{
keyBytes
=
ByteUtil
.
hexStringToBytes
(
secretKey
);
ivBytes
=
ByteUtil
.
hexStringToBytes
(
iv
);
}
else
{
keyBytes
=
secretKey
.
getBytes
();
ivBytes
=
iv
.
getBytes
();
}
SM4
sm4
=
new
SM4
();
sm4
.
sm4_setkey_enc
(
ctx
,
keyBytes
);
byte
[]
encrypted
=
sm4
.
sm4_crypt_cbc
(
ctx
,
ivBytes
,
plainText
.
getBytes
(
"UTF-8"
));
String
cipherText
=
Base64
.
getEncoder
().
encodeToString
(
encrypted
);
if
(
cipherText
!=
null
&&
cipherText
.
trim
().
length
()
>
0
)
{
Pattern
p
=
Pattern
.
compile
(
"\\s*|\t|\r|\n"
);
Matcher
m
=
p
.
matcher
(
cipherText
);
cipherText
=
m
.
replaceAll
(
""
);
}
return
cipherText
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
public
String
decryptData_CBC
(
String
cipherText
)
{
try
{
SM4Context
ctx
=
new
SM4Context
();
ctx
.
isPadding
=
true
;
ctx
.
mode
=
SM4
.
SM4_DECRYPT
;
byte
[]
keyBytes
;
byte
[]
ivBytes
;
if
(
hexString
)
{
keyBytes
=
ByteUtil
.
hexStringToBytes
(
secretKey
);
ivBytes
=
ByteUtil
.
hexStringToBytes
(
iv
);
}
else
{
keyBytes
=
secretKey
.
getBytes
();
ivBytes
=
iv
.
getBytes
();
}
SM4
sm4
=
new
SM4
();
sm4
.
sm4_setkey_dec
(
ctx
,
keyBytes
);
byte
[]
decrypted
=
sm4
.
sm4_crypt_cbc
(
ctx
,
ivBytes
,
Base64
.
getDecoder
().
decode
(
cipherText
));
return
new
String
(
decrypted
,
"UTF-8"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment