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
39d50ddd
Commit
39d50ddd
authored
Dec 05, 2022
by
ma
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-yx' of
http://120.77.240.215:9701/tianlai3/ioc_sixiang_license
into for-yx
parents
66286c10
37b49467
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
0 additions
and
1946 deletions
+0
-1946
BaseTest.java
license/src/test/java/iot/sixiang/license/BaseTest.java
+0
-20
DeviceControllerTest.java
.../iot/sixiang/license/controller/DeviceControllerTest.java
+0
-326
AuthData.java
...c/test/java/iot/sixiang/license/object/data/AuthData.java
+0
-15
PmsUseServiceTest.java
...t/java/iot/sixiang/license/service/PmsUseServiceTest.java
+0
-26
ByteHelper.java
...se/src/test/java/iot/sixiang/license/util/ByteHelper.java
+0
-223
HmacShaUtils.java
.../src/test/java/iot/sixiang/license/util/HmacShaUtils.java
+0
-59
PubUtils.java
license/src/test/java/iot/sixiang/license/util/PubUtils.java
+0
-190
ByteUtil.java
.../src/test/java/iot/sixiang/license/util/sm4/ByteUtil.java
+0
-616
SM4.java
license/src/test/java/iot/sixiang/license/util/sm4/SM4.java
+0
-300
SM4Context.java
...rc/test/java/iot/sixiang/license/util/sm4/SM4Context.java
+0
-15
SM4Utils.java
.../src/test/java/iot/sixiang/license/util/sm4/SM4Utils.java
+0
-156
No files found.
license/src/test/java/iot/sixiang/license/BaseTest.java
deleted
100644 → 0
View file @
66286c10
package
iot
.
sixiang
.
license
;
import
com.alibaba.fastjson.JSON
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.ActiveProfiles
;
/**
* Created by M=54G
* Date 9/14/22 3:08 PM
* Description
*/
@SpringBootTest
@ActiveProfiles
({
"test-acc"
})
@Slf4j
public
class
BaseTest
{
protected
void
log
(
Object
object
)
{
log
.
info
(
JSON
.
toJSONString
(
object
));
}
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/controller/DeviceControllerTest.java
deleted
100644 → 0
View file @
66286c10
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.SM4
;
import
iot.sixiang.license.util.sm4.SM4Context
;
import
lombok.SneakyThrows
;
import
org.junit.jupiter.api.Test
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.net.Socket
;
import
java.util.Random
;
/**
* Created by M=54G
* Date 11/11/22 9:54 AM
* Description
*/
public
class
DeviceControllerTest
{
@Test
void
terminalDeviceSign
()
{
String
appId
=
"7j26zr7en9fiyoyvjz"
;
String
sn
=
"8HOE8JH4EFSEV28534"
;
// String snBind = "snabcd";
String
appKey
=
"2"
;
String
string
=
"app_id="
+
appId
+
"&sn="
+
sn
;
String
sign
=
HmacUtil
.
encrypt
(
string
,
appKey
,
HmacUtil
.
HMAC_SHA1
);
System
.
out
.
println
(
"token appId:"
+
appId
);
System
.
out
.
println
(
"token sn:"
+
sn
);
System
.
out
.
println
(
"token sign:"
+
sign
);
}
@Test
void
tokenSign
()
{
String
appId
=
"ebsh71dp5t1ck948l5"
;
String
sn
=
"ERE54S619LNYMPKVN9"
;
String
snBind
=
"snabcd"
;
String
appKey
=
"110801"
;
String
string
=
"app_id="
+
appId
+
"&sn="
+
sn
+
"&sn_bind="
+
snBind
;
String
sign
=
HmacUtil
.
encrypt
(
string
,
appKey
,
HmacUtil
.
HMAC_SHA1
);
System
.
out
.
println
(
"token appId:"
+
appId
);
System
.
out
.
println
(
"token sn:"
+
sn
);
System
.
out
.
println
(
"token sign:"
+
sign
);
}
@Test
void
auth
()
{
String
appId
=
"ebsh71dp5t1ck948l5"
;
String
sn
=
"ERE54S619LNYMPKVN9"
;
String
snBind
=
"snabcd"
;
String
appKey
=
"110801"
;
//byte[] baseKeyBytes = "nAOq38p4bGQyF4FG".getBytes();
//System.out.println(baseKeyBytes.length);
byte
[]
allBytes
=
getAuthSendBytes
(
appId
,
sn
,
snBind
,
appKey
);
System
.
out
.
println
(
bytes2Hex
(
allBytes
));
}
@Test
void
testSocket
()
{
String
serverIp
=
"112.74.57.111"
;
int
serverPort
=
18889
;
String
appId
=
"ebsh71dp5t1ck948l5"
;
String
sn
=
"ERE54S619LNYMPKVN9"
;
String
snBind
=
"ZA2207G5NQ"
;
String
appKey
=
"110801"
;
socket
(
serverIp
,
serverPort
,
appId
,
sn
,
snBind
,
appKey
);
}
@Test
void
yxSocket
()
{
String
serverIp
=
"14.116.221.61"
;
int
serverPort
=
18889
;
String
appId
=
"mny3i9pgg0xxs520qf"
;
String
sn
=
"IU23404BR1CQJOC63Q"
;
String
snBind
=
"snabcd"
;
String
appKey
=
"20221114"
;
socket
(
serverIp
,
serverPort
,
appId
,
sn
,
snBind
,
appKey
);
}
@SneakyThrows
void
socket
(
String
serverIp
,
int
serverPort
,
String
appId
,
String
sn
,
String
snBind
,
String
appKey
)
{
Socket
socket
=
new
Socket
(
serverIp
,
serverPort
);
socket
.
setKeepAlive
(
true
);
System
.
out
.
println
(
"connect success..."
);
// 事先组装好要发送的鉴权信息
byte
[]
authSendBytes
=
getAuthSendBytes
(
appId
,
sn
,
snBind
,
appKey
);
OutputStream
outputStream
=
socket
.
getOutputStream
();
InputStream
inputStream
=
socket
.
getInputStream
();
// 鉴权
sendAndReceive
(
socket
,
outputStream
,
inputStream
,
"auth"
,
authSendBytes
);
Thread
.
sleep
(
1000
);
// 鉴权后做动作
String
request
=
"55AA340090000156F43D4D806827D1BB8F78C00D2B5488479CEB172C5D477C4D3023CE7B111621D4AD2C11ACAC4D876A3AC66A82F5F19000EF"
;
byte
[]
actionSendBytes
=
hex2Byte
(
request
);
byte
[]
actionResultBytes
=
sendAndReceive
(
socket
,
outputStream
,
inputStream
,
"action"
,
actionSendBytes
);
//String result = "55AA1500A40035414E7DB5B3EDE72BC6BA44203F52EA0000005B";
//String result = "55aa1500a4008926834e684c4c6911b02304b3a0ce9c00000000";
//Assert.assertEquals(bytes2Hex(actionResultBytes), result);
inputStream
.
close
();
outputStream
.
close
();
socket
.
close
();
}
@SneakyThrows
private
byte
[]
sendAndReceive
(
Socket
socket
,
OutputStream
outputStream
,
InputStream
inputStream
,
String
tag
,
byte
[]
requestBytes
)
{
System
.
out
.
println
(
tag
+
" send:"
+
bytes2Hex
(
requestBytes
));
outputStream
.
write
(
requestBytes
);
outputStream
.
flush
();
byte
[]
bytes
=
new
byte
[
1024
];
int
count
=
inputStream
.
read
(
bytes
);
while
(
count
<
0
)
{
Thread
.
sleep
(
200
);
count
=
inputStream
.
read
(
bytes
);
}
byte
[]
resultBytes
=
new
byte
[
count
];
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
resultBytes
[
i
]
=
bytes
[
i
];
}
System
.
out
.
println
(
tag
+
" receive:"
+
bytes2Hex
(
resultBytes
));
return
requestBytes
;
}
private
byte
[]
getAuthSendBytes
(
String
appId
,
String
sn
,
String
snBind
,
String
appKey
)
{
byte
[]
stxBytes
=
{(
byte
)
0x55
,
(
byte
)
0xaa
};
// 这部分生成内容
// 用于SM4
byte
[]
randomBytes
=
new
byte
[
16
];
Random
random
=
new
Random
();
for
(
int
i
=
0
;
i
<
randomBytes
.
length
;
i
++)
{
randomBytes
[
i
]
=
(
byte
)
(
random
.
nextInt
());
}
byte
[]
sm4KeyBytes
=
new
byte
[
16
];
byte
[]
baseKeyBytes
=
"nAOq38p4bGQyF4FG"
.
getBytes
();
for
(
int
i
=
0
;
i
<
randomBytes
.
length
;
i
++)
{
sm4KeyBytes
[
i
]
=
(
byte
)
(
randomBytes
[
i
]
^
baseKeyBytes
[
i
]);
}
String
string
=
"app_id="
+
appId
+
"&sn="
+
sn
+
"&sn_bind="
+
snBind
;
String
sign
=
HmacUtil
.
encrypt
(
string
,
appKey
,
HmacUtil
.
HMAC_SHA1
);
// 组装
AuthData
authData
=
new
AuthData
();
authData
.
setApp_id
(
appId
);
authData
.
setSn
(
sn
);
authData
.
setSign
(
sign
);
byte
[]
dataBytes
=
encryptData_ECB
(
JSON
.
toJSONString
(
authData
),
sm4KeyBytes
);
dataBytes
=
byteMerger
(
randomBytes
,
dataBytes
);
int
length
=
dataBytes
.
length
+
stxBytes
.
length
;
byte
[]
lenBytes
=
{(
byte
)
length
,
(
byte
)
(
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
]);
}
return
byteMerger
(
stxBytes
,
lenBytes
,
new
byte
[]{
cmdByte
,
ackByte
},
dataBytes
,
new
byte
[]{
endByte
});
}
public
byte
[]
encryptData_ECB
(
String
string
,
byte
[]
keyBytes
)
{
try
{
SM4Context
ctx
=
new
SM4Context
();
ctx
.
mode
=
SM4
.
SM4_ENCRYPT
;
SM4
sm4
=
new
SM4
();
sm4
.
sm4_setkey_enc
(
ctx
,
keyBytes
);
byte
[]
encrypted
=
sm4_crypt_ecb
(
sm4
,
ctx
,
string
.
getBytes
(
"UTF-8"
));
return
encrypted
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
public
byte
[]
sm4_crypt_ecb
(
SM4
sm4
,
SM4Context
ctx
,
byte
[]
input
)
throws
Exception
{
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
.
sm4_one_round
(
ctx
.
sk
,
in
,
out
);
bous
.
write
(
out
);
}
byte
[]
output
=
bous
.
toByteArray
();
bins
.
close
();
bous
.
close
();
return
output
;
}
@Test
void
authDevice
()
{
}
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
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
;
}
//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) 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();
//}
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/object/data/AuthData.java
deleted
100644 → 0
View file @
66286c10
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
app_id
;
private
String
sn
;
private
String
sign
;
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/service/PmsUseServiceTest.java
deleted
100644 → 0
View file @
66286c10
package
iot
.
sixiang
.
license
.
service
;
import
iot.sixiang.license.BaseTest
;
import
org.junit.jupiter.api.Test
;
import
javax.annotation.Resource
;
/**
* Created by M=54G
* Date 11/23/22 3:39 PM
* Description
*/
public
class
PmsUseServiceTest
extends
BaseTest
{
@Resource
private
PmsUseService
pmsUseService
;
@Test
void
addLog
()
{
log
(
pmsUseService
.
createUseLog
(
"abcd"
));
}
@Test
void
updateLog
()
{
pmsUseService
.
success
(
1
);
}
}
\ No newline at end of file
license/src/test/java/iot/sixiang/license/util/ByteHelper.java
deleted
100644 → 0
View file @
66286c10
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
deleted
100644 → 0
View file @
66286c10
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
deleted
100644 → 0
View file @
66286c10
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
deleted
100644 → 0
View file @
66286c10
package
iot
.
sixiang
.
license
.
util
.
sm4
;
import
java.math.BigInteger
;
public
class
ByteUtil
{
/**
* 整形转换成网络传输的字节流(字节数组)型数据
*
* @param num 一个整型数据
* @return 4个字节的自己数组
*/
public
static
byte
[]
intToBytes
(
int
num
)
{
byte
[]
bytes
=
new
byte
[
4
];
bytes
[
0
]
=
(
byte
)
(
0xff
&
(
num
>>
0
));
bytes
[
1
]
=
(
byte
)
(
0xff
&
(
num
>>
8
));
bytes
[
2
]
=
(
byte
)
(
0xff
&
(
num
>>
16
));
bytes
[
3
]
=
(
byte
)
(
0xff
&
(
num
>>
24
));
return
bytes
;
}
/**
* 四个字节的字节数据转换成一个整形数据
*
* @param bytes 4个字节的字节数组
* @return 一个整型数据
*/
public
static
int
byteToInt
(
byte
[]
bytes
)
{
int
num
=
0
;
int
temp
;
temp
=
(
0x000000ff
&
(
bytes
[
0
]))
<<
0
;
num
=
num
|
temp
;
temp
=
(
0x000000ff
&
(
bytes
[
1
]))
<<
8
;
num
=
num
|
temp
;
temp
=
(
0x000000ff
&
(
bytes
[
2
]))
<<
16
;
num
=
num
|
temp
;
temp
=
(
0x000000ff
&
(
bytes
[
3
]))
<<
24
;
num
=
num
|
temp
;
return
num
;
}
/**
* 长整形转换成网络传输的字节流(字节数组)型数据
*
* @param num 一个长整型数据
* @return 4个字节的自己数组
*/
public
static
byte
[]
longToBytes
(
long
num
)
{
byte
[]
bytes
=
new
byte
[
8
];
for
(
int
i
=
0
;
i
<
8
;
i
++)
{
bytes
[
i
]
=
(
byte
)
(
0xff
&
(
num
>>
(
i
*
8
)));
}
return
bytes
;
}
/**
* 大数字转换字节流(字节数组)型数据
*
* @param n
* @return
*/
public
static
byte
[]
byteConvert32Bytes
(
BigInteger
n
)
{
byte
tmpd
[]
=
(
byte
[])
null
;
if
(
n
==
null
)
{
return
null
;
}
if
(
n
.
toByteArray
().
length
==
33
)
{
tmpd
=
new
byte
[
32
];
System
.
arraycopy
(
n
.
toByteArray
(),
1
,
tmpd
,
0
,
32
);
}
else
if
(
n
.
toByteArray
().
length
==
32
)
{
tmpd
=
n
.
toByteArray
();
}
else
{
tmpd
=
new
byte
[
32
];
for
(
int
i
=
0
;
i
<
32
-
n
.
toByteArray
().
length
;
i
++)
{
tmpd
[
i
]
=
0
;
}
System
.
arraycopy
(
n
.
toByteArray
(),
0
,
tmpd
,
32
-
n
.
toByteArray
().
length
,
n
.
toByteArray
().
length
);
}
return
tmpd
;
}
/**
* 换字节流(字节数组)型数据转大数字
*
* @param b
* @return
*/
public
static
BigInteger
byteConvertInteger
(
byte
[]
b
)
{
if
(
b
[
0
]
<
0
)
{
byte
[]
temp
=
new
byte
[
b
.
length
+
1
];
temp
[
0
]
=
0
;
System
.
arraycopy
(
b
,
0
,
temp
,
1
,
b
.
length
);
return
new
BigInteger
(
temp
);
}
return
new
BigInteger
(
b
);
}
/**
* 根据字节数组获得值(十六进制数字)
*
* @param bytes
* @return
*/
public
static
String
getHexString
(
byte
[]
bytes
)
{
return
getHexString
(
bytes
,
true
);
}
/**
* 根据字节数组获得值(十六进制数字)
*
* @param bytes
* @param upperCase
* @return
*/
public
static
String
getHexString
(
byte
[]
bytes
,
boolean
upperCase
)
{
String
ret
=
""
;
for
(
int
i
=
0
;
i
<
bytes
.
length
;
i
++)
{
ret
+=
Integer
.
toString
((
bytes
[
i
]
&
0xff
)
+
0x100
,
16
).
substring
(
1
);
}
return
upperCase
?
ret
.
toUpperCase
()
:
ret
;
}
/**
* 打印十六进制字符串
*
* @param bytes
*/
public
static
void
printHexString
(
byte
[]
bytes
)
{
for
(
int
i
=
0
;
i
<
bytes
.
length
;
i
++)
{
String
hex
=
Integer
.
toHexString
(
bytes
[
i
]
&
0xFF
);
if
(
hex
.
length
()
==
1
)
{
hex
=
'0'
+
hex
;
}
System
.
out
.
print
(
"0x"
+
hex
.
toUpperCase
()
+
","
);
}
System
.
out
.
println
(
""
);
}
/**
* Convert hex string to byte[]
*
* @param hexString the hex string
* @return byte[]
*/
public
static
byte
[]
hexStringToBytes
(
String
hexString
)
{
if
(
hexString
==
null
||
hexString
.
equals
(
""
))
{
return
null
;
}
hexString
=
hexString
.
toUpperCase
();
int
length
=
hexString
.
length
()
/
2
;
char
[]
hexChars
=
hexString
.
toCharArray
();
byte
[]
d
=
new
byte
[
length
];
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
int
pos
=
i
*
2
;
d
[
i
]
=
(
byte
)
(
charToByte
(
hexChars
[
pos
])
<<
4
|
charToByte
(
hexChars
[
pos
+
1
]));
}
return
d
;
}
/**
* Convert char to byte
*
* @param c char
* @return byte
*/
public
static
byte
charToByte
(
char
c
)
{
return
(
byte
)
"0123456789ABCDEF"
.
indexOf
(
c
);
}
/**
* 用于建立十六进制字符的输出的小写字符数组
*/
private
static
final
char
[]
DIGITS_LOWER
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
};
/**
* 用于建立十六进制字符的输出的大写字符数组
*/
private
static
final
char
[]
DIGITS_UPPER
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
/**
* 将字节数组转换为十六进制字符数组
*
* @param data byte[]
* @return 十六进制char[]
*/
public
static
char
[]
encodeHex
(
byte
[]
data
)
{
return
encodeHex
(
data
,
true
);
}
/**
* 将字节数组转换为十六进制字符数组
*
* @param data byte[]
* @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
* @return 十六进制char[]
*/
public
static
char
[]
encodeHex
(
byte
[]
data
,
boolean
toLowerCase
)
{
return
encodeHex
(
data
,
toLowerCase
?
DIGITS_LOWER
:
DIGITS_UPPER
);
}
/**
* 将字节数组转换为十六进制字符数组
*
* @param data byte[]
* @param toDigits 用于控制输出的char[]
* @return 十六进制char[]
*/
protected
static
char
[]
encodeHex
(
byte
[]
data
,
char
[]
toDigits
)
{
int
l
=
data
.
length
;
char
[]
out
=
new
char
[
l
<<
1
];
// two characters form the hex value.
for
(
int
i
=
0
,
j
=
0
;
i
<
l
;
i
++)
{
out
[
j
++]
=
toDigits
[(
0xF0
&
data
[
i
])
>>>
4
];
out
[
j
++]
=
toDigits
[
0x0F
&
data
[
i
]];
}
return
out
;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param data byte[]
* @return 十六进制String
*/
public
static
String
encodeHexString
(
byte
[]
data
)
{
return
encodeHexString
(
data
,
true
);
}
/**
* 将字节数组转换为十六进制字符串
*
* @param data byte[]
* @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
* @return 十六进制String
*/
public
static
String
encodeHexString
(
byte
[]
data
,
boolean
toLowerCase
)
{
return
encodeHexString
(
data
,
toLowerCase
?
DIGITS_LOWER
:
DIGITS_UPPER
);
}
/**
* 将字节数组转换为十六进制字符串
*
* @param data byte[]
* @param toDigits 用于控制输出的char[]
* @return 十六进制String
*/
protected
static
String
encodeHexString
(
byte
[]
data
,
char
[]
toDigits
)
{
return
new
String
(
encodeHex
(
data
,
toDigits
));
}
/**
* 将十六进制字符数组转换为字节数组
*
* @param data 十六进制char[]
* @return byte[]
* @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
*/
public
static
byte
[]
decodeHex
(
char
[]
data
)
{
int
len
=
data
.
length
;
if
((
len
&
0x01
)
!=
0
)
{
throw
new
RuntimeException
(
"Odd number of characters."
);
}
byte
[]
out
=
new
byte
[
len
>>
1
];
// two characters form the hex value.
for
(
int
i
=
0
,
j
=
0
;
j
<
len
;
i
++)
{
int
f
=
toDigit
(
data
[
j
],
j
)
<<
4
;
j
++;
f
=
f
|
toDigit
(
data
[
j
],
j
);
j
++;
out
[
i
]
=
(
byte
)
(
f
&
0xFF
);
}
return
out
;
}
/**
* 将十六进制字符转换成一个整数
*
* @param ch 十六进制char
* @param index 十六进制字符在字符数组中的位置
* @return 一个整数
* @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常
*/
protected
static
int
toDigit
(
char
ch
,
int
index
)
{
int
digit
=
Character
.
digit
(
ch
,
16
);
if
(
digit
==
-
1
)
{
throw
new
RuntimeException
(
"Illegal hexadecimal character "
+
ch
+
" at index "
+
index
);
}
return
digit
;
}
/**
* 数字字符串转ASCII码字符串
*
* @param String 字符串
* @return ASCII字符串
*/
public
static
String
StringToAsciiString
(
String
content
)
{
String
result
=
""
;
int
max
=
content
.
length
();
for
(
int
i
=
0
;
i
<
max
;
i
++)
{
char
c
=
content
.
charAt
(
i
);
String
b
=
Integer
.
toHexString
(
c
);
result
=
result
+
b
;
}
return
result
;
}
/**
* 十六进制转字符串
*
* @param hexString 十六进制字符串
* @param encodeType 编码类型4:Unicode,2:普通编码
* @return 字符串
*/
public
static
String
hexStringToString
(
String
hexString
,
int
encodeType
)
{
String
result
=
""
;
int
max
=
hexString
.
length
()
/
encodeType
;
for
(
int
i
=
0
;
i
<
max
;
i
++)
{
char
c
=
(
char
)
hexStringToAlgorism
(
hexString
.
substring
(
i
*
encodeType
,
(
i
+
1
)
*
encodeType
));
result
+=
c
;
}
return
result
;
}
/**
* 十六进制字符串装十进制
*
* @param hex 十六进制字符串
* @return 十进制数值
*/
public
static
int
hexStringToAlgorism
(
String
hex
)
{
hex
=
hex
.
toUpperCase
();
int
max
=
hex
.
length
();
int
result
=
0
;
for
(
int
i
=
max
;
i
>
0
;
i
--)
{
char
c
=
hex
.
charAt
(
i
-
1
);
int
algorism
=
0
;
if
(
c
>=
'0'
&&
c
<=
'9'
)
{
algorism
=
c
-
'0'
;
}
else
{
algorism
=
c
-
55
;
}
result
+=
Math
.
pow
(
16
,
max
-
i
)
*
algorism
;
}
return
result
;
}
/**
* 十六转二进制
*
* @param hex 十六进制字符串
* @return 二进制字符串
*/
public
static
String
hexStringToBinary
(
String
hex
)
{
hex
=
hex
.
toUpperCase
();
String
result
=
""
;
int
max
=
hex
.
length
();
for
(
int
i
=
0
;
i
<
max
;
i
++)
{
char
c
=
hex
.
charAt
(
i
);
switch
(
c
)
{
case
'0'
:
result
+=
"0000"
;
break
;
case
'1'
:
result
+=
"0001"
;
break
;
case
'2'
:
result
+=
"0010"
;
break
;
case
'3'
:
result
+=
"0011"
;
break
;
case
'4'
:
result
+=
"0100"
;
break
;
case
'5'
:
result
+=
"0101"
;
break
;
case
'6'
:
result
+=
"0110"
;
break
;
case
'7'
:
result
+=
"0111"
;
break
;
case
'8'
:
result
+=
"1000"
;
break
;
case
'9'
:
result
+=
"1001"
;
break
;
case
'A'
:
result
+=
"1010"
;
break
;
case
'B'
:
result
+=
"1011"
;
break
;
case
'C'
:
result
+=
"1100"
;
break
;
case
'D'
:
result
+=
"1101"
;
break
;
case
'E'
:
result
+=
"1110"
;
break
;
case
'F'
:
result
+=
"1111"
;
break
;
}
}
return
result
;
}
/**
* ASCII码字符串转数字字符串
*
* @param String ASCII字符串
* @return 字符串
*/
public
static
String
AsciiStringToString
(
String
content
)
{
String
result
=
""
;
int
length
=
content
.
length
()
/
2
;
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
String
c
=
content
.
substring
(
i
*
2
,
i
*
2
+
2
);
int
a
=
hexStringToAlgorism
(
c
);
char
b
=
(
char
)
a
;
String
d
=
String
.
valueOf
(
b
);
result
+=
d
;
}
return
result
;
}
/**
* 将十进制转换为指定长度的十六进制字符串
*
* @param algorism int 十进制数字
* @param maxLength int 转换后的十六进制字符串长度
* @return String 转换后的十六进制字符串
*/
public
static
String
algorismToHexString
(
int
algorism
,
int
maxLength
)
{
String
result
=
""
;
result
=
Integer
.
toHexString
(
algorism
);
if
(
result
.
length
()
%
2
==
1
)
{
result
=
"0"
+
result
;
}
return
patchHexString
(
result
.
toUpperCase
(),
maxLength
);
}
/**
* 字节数组转为普通字符串(ASCII对应的字符)
*
* @param bytearray byte[]
* @return String
*/
public
static
String
byteToString
(
byte
[]
bytearray
)
{
String
result
=
""
;
char
temp
;
int
length
=
bytearray
.
length
;
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
temp
=
(
char
)
bytearray
[
i
];
result
+=
temp
;
}
return
result
;
}
/**
* 二进制字符串转十进制
*
* @param binary 二进制字符串
* @return 十进制数值
*/
public
static
int
binaryToAlgorism
(
String
binary
)
{
int
max
=
binary
.
length
();
int
result
=
0
;
for
(
int
i
=
max
;
i
>
0
;
i
--)
{
char
c
=
binary
.
charAt
(
i
-
1
);
int
algorism
=
c
-
'0'
;
result
+=
Math
.
pow
(
2
,
max
-
i
)
*
algorism
;
}
return
result
;
}
/**
* 十进制转换为十六进制字符串
*
* @param algorism int 十进制的数字
* @return String 对应的十六进制字符串
*/
public
static
String
algorismToHEXString
(
int
algorism
)
{
String
result
=
""
;
result
=
Integer
.
toHexString
(
algorism
);
if
(
result
.
length
()
%
2
==
1
)
{
result
=
"0"
+
result
;
}
result
=
result
.
toUpperCase
();
return
result
;
}
/**
* HEX字符串前补0,主要用于长度位数不足。
*
* @param str String 需要补充长度的十六进制字符串
* @param maxLength int 补充后十六进制字符串的长度
* @return 补充结果
*/
static
public
String
patchHexString
(
String
str
,
int
maxLength
)
{
String
temp
=
""
;
for
(
int
i
=
0
;
i
<
maxLength
-
str
.
length
();
i
++)
{
temp
=
"0"
+
temp
;
}
str
=
(
temp
+
str
).
substring
(
0
,
maxLength
);
return
str
;
}
/**
* 将一个字符串转换为int
*
* @param s String 要转换的字符串
* @param defaultInt int 如果出现异常,默认返回的数字
* @param radix int 要转换的字符串是什么进制的,如16 8 10.
* @return int 转换后的数字
*/
public
static
int
parseToInt
(
String
s
,
int
defaultInt
,
int
radix
)
{
int
i
=
0
;
try
{
i
=
Integer
.
parseInt
(
s
,
radix
);
}
catch
(
NumberFormatException
ex
)
{
i
=
defaultInt
;
}
return
i
;
}
/**
* 将一个十进制形式的数字字符串转换为int
*
* @param s String 要转换的字符串
* @param defaultInt int 如果出现异常,默认返回的数字
* @return int 转换后的数字
*/
public
static
int
parseToInt
(
String
s
,
int
defaultInt
)
{
int
i
=
0
;
try
{
i
=
Integer
.
parseInt
(
s
);
}
catch
(
NumberFormatException
ex
)
{
i
=
defaultInt
;
}
return
i
;
}
/**
* 十六进制串转化为byte数组
*
* @return the array of byte
*/
public
static
byte
[]
hexToByte
(
String
hex
)
throws
IllegalArgumentException
{
if
(
hex
.
length
()
%
2
!=
0
)
{
throw
new
IllegalArgumentException
();
}
char
[]
arr
=
hex
.
toCharArray
();
byte
[]
b
=
new
byte
[
hex
.
length
()
/
2
];
for
(
int
i
=
0
,
j
=
0
,
l
=
hex
.
length
();
i
<
l
;
i
++,
j
++)
{
String
swap
=
""
+
arr
[
i
++]
+
arr
[
i
];
int
byteint
=
Integer
.
parseInt
(
swap
,
16
)
&
0xFF
;
b
[
j
]
=
new
Integer
(
byteint
).
byteValue
();
}
return
b
;
}
/**
* 字节数组转换为十六进制字符串
*
* @param b byte[] 需要转换的字节数组
* @return String 十六进制字符串
*/
public
static
String
byteToHex
(
byte
b
[])
{
if
(
b
==
null
)
{
throw
new
IllegalArgumentException
(
"Argument b ( byte array ) is null! "
);
}
String
hs
=
""
;
String
stmp
=
""
;
for
(
int
n
=
0
;
n
<
b
.
length
;
n
++)
{
stmp
=
Integer
.
toHexString
(
b
[
n
]
&
0xff
);
if
(
stmp
.
length
()
==
1
)
{
hs
=
hs
+
"0"
+
stmp
;
}
else
{
hs
=
hs
+
stmp
;
}
}
return
hs
.
toUpperCase
();
}
public
static
byte
[]
subByte
(
byte
[]
input
,
int
startIndex
,
int
length
)
{
byte
[]
bt
=
new
byte
[
length
];
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
bt
[
i
]
=
input
[
i
+
startIndex
];
}
return
bt
;
}
}
license/src/test/java/iot/sixiang/license/util/sm4/SM4.java
deleted
100644 → 0
View file @
66286c10
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
)];
}
}
public
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
deleted
100644 → 0
View file @
66286c10
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
deleted
100644 → 0
View file @
66286c10
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