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
3f6fc03e
Commit
3f6fc03e
authored
Jan 30, 2023
by
AfirSraftGarrier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
回退一些代码
parent
d9b4a048
Changes
12
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1867 additions
and
1 deletion
+1867
-1
pom.xml
license/pom.xml
+0
-1
BaseTest.java
license/src/test/java/iot/sixiang/license/BaseTest.java
+0
-0
DeviceControllerTest.java
.../iot/sixiang/license/controller/DeviceControllerTest.java
+326
-0
AuthData.java
...c/test/java/iot/sixiang/license/object/data/AuthData.java
+15
-0
PmsUseServiceTest.java
...t/java/iot/sixiang/license/service/PmsUseServiceTest.java
+26
-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
+0
-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/pom.xml
View file @
3f6fc03e
...
...
@@ -169,7 +169,6 @@
</dependencies>
<build>
<finalName>
license
</finalName>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
...
...
license/src/test/java/iot/sixiang/license/BaseTest.java
0 → 100644
View file @
3f6fc03e
license/src/test/java/iot/sixiang/license/controller/DeviceControllerTest.java
0 → 100644
View file @
3f6fc03e
This diff is collapsed.
Click to expand it.
license/src/test/java/iot/sixiang/license/object/data/AuthData.java
0 → 100644
View file @
3f6fc03e
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
0 → 100644
View file @
3f6fc03e
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
0 → 100644
View file @
3f6fc03e
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 @
3f6fc03e
license/src/test/java/iot/sixiang/license/util/PubUtils.java
0 → 100644
View file @
3f6fc03e
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 @
3f6fc03e
This diff is collapsed.
Click to expand it.
license/src/test/java/iot/sixiang/license/util/sm4/SM4.java
0 → 100644
View file @
3f6fc03e
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
0 → 100644
View file @
3f6fc03e
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 @
3f6fc03e
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