Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
J
jiwei-api
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
马天浩
jiwei-api
Commits
7f1123b0
Commit
7f1123b0
authored
Dec 03, 2020
by
matianhao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[资产资源接口] <add> 调用js加解密,接入获取项目信息接口
parent
3d120729
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
336 additions
and
0 deletions
+336
-0
ZczyController.java
...java/com/mth/requestsecret/controller/ZczyController.java
+44
-0
RestTemplateService.java
...va/com/mth/requestsecret/service/RestTemplateService.java
+34
-0
AESUtils.java
src/main/java/com/mth/requestsecret/util/AESUtils.java
+37
-0
des.js
src/main/resources/js/des.js
+221
-0
No files found.
src/main/java/com/mth/requestsecret/controller/ZczyController.java
0 → 100644
View file @
7f1123b0
package
com
.
mth
.
requestsecret
.
controller
;
import
com.mth.requestsecret.service.RestTemplateService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 资产资源接口
*
* @author MaTianHao
* @date 2020/11/23
*/
@RestController
@Slf4j
public
class
ZczyController
{
@Autowired
private
RestTemplateService
restTemplateService
;
/**
* 获取项目信息接口
* 根据时间段获取成交项目信息,时间跨度不能超过5天
*
* @param startTime 开始时间
* @param endTime 结束时间
* @return 解密后字符串
*/
@PostMapping
(
"/getProjectBaseInformation"
)
public
String
getProjectBaseInformation
(
String
startTime
,
String
endTime
)
throws
Exception
{
// api方法签名
String
apiMethod
=
"fGetProjectBaseInformation"
;
// api参数
Map
<
String
,
String
>
param
=
new
HashMap
<>(
2
);
param
.
put
(
"StartTime"
,
startTime
);
param
.
put
(
"EndTime"
,
endTime
);
return
restTemplateService
.
zczySendRequest
(
param
,
apiMethod
);
}
}
src/main/java/com/mth/requestsecret/service/RestTemplateService.java
View file @
7f1123b0
...
...
@@ -65,6 +65,12 @@ public class RestTemplateService {
@Value
(
"${buildhouse.address}"
)
private
String
buildHouseAddress
;
/**
* 资产资源接口地址
*/
@Value
((
"${zczy.address}"
))
private
String
zczyAddress
;
/**
* 瑞成平台接口发送请求
*
...
...
@@ -241,4 +247,32 @@ public class RestTemplateService {
return
responseEntity
;
}
/**
* 资产资源接口 发送请求
*/
public
String
zczySendRequest
(
Map
<
String
,
String
>
paramMap
,
String
apiMethod
)
throws
Exception
{
String
url
=
zczyAddress
+
apiMethod
;
log
.
info
(
"资产资源api:{}"
,
apiMethod
);
log
.
info
(
"api url:{}"
,
url
);
log
.
info
(
"api params:{}"
,
paramMap
);
// 1. 参数加密
paramMap
.
replace
(
"StartTime"
,
AESUtils
.
zczyDes
(
paramMap
.
get
(
"StartTime"
),
"encMe"
));
paramMap
.
replace
(
"EndTime"
,
AESUtils
.
zczyDes
(
paramMap
.
get
(
"EndTime"
),
"encMe"
));
// 2. 构建请求头
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
HttpEntity
httpEntity
=
new
HttpEntity
<>(
paramMap
,
headers
);
// 3. 发送请求
ResponseEntity
<
String
>
responseEntity
=
restTemplate
.
exchange
(
url
,
HttpMethod
.
POST
,
httpEntity
,
String
.
class
);
// 响应解密
String
decryptResponse
=
AESUtils
.
zczyDes
(
responseEntity
.
getBody
(),
"uncMe"
);
String
decryptStr
=
decryptResponse
.
trim
();
log
.
info
(
"api response:{}"
,
decryptStr
);
return
decryptStr
;
}
}
\ No newline at end of file
src/main/java/com/mth/requestsecret/util/AESUtils.java
View file @
7f1123b0
...
...
@@ -9,6 +9,10 @@ import javax.crypto.SecretKeyFactory;
import
javax.crypto.spec.DESedeKeySpec
;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
javax.script.Invocable
;
import
javax.script.ScriptEngine
;
import
javax.script.ScriptEngineManager
;
import
java.io.FileReader
;
import
java.nio.charset.StandardCharsets
;
import
java.security.Key
;
import
java.security.Security
;
...
...
@@ -42,6 +46,12 @@ public class AESUtils {
*/
private
final
static
byte
[]
SGB_IV
=
{(
byte
)
0x12
,
(
byte
)
0x34
,
(
byte
)
0x56
,
(
byte
)
0x78
,
(
byte
)
0x90
,
(
byte
)
0xAB
,
(
byte
)
0xCD
,
(
byte
)
0xEF
};
// 资产资源加密参数
/**
* key
*/
private
final
static
String
ZCZY_KEY
=
"YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4"
;
static
{
Security
.
addProvider
(
new
BouncyCastleProvider
());
}
...
...
@@ -132,6 +142,33 @@ public class AESUtils {
}
}
/**
* 资产资源接口:des加密、解密
*
* @param content 待处理字符串
* @param method 加密:encMe;解密:uncMe
* @return
* @throws Exception
*/
public
static
String
zczyDes
(
String
content
,
String
method
)
throws
Exception
{
ScriptEngineManager
manager
=
new
ScriptEngineManager
();
ScriptEngine
engine
=
manager
.
getEngineByName
(
"javascript"
);
// 读取js文件
FileReader
reader
=
new
FileReader
(
"src/main/resources/js/des.js"
);
engine
.
eval
(
reader
);
String
encryptContent
=
""
;
if
(
engine
instanceof
Invocable
)
{
Invocable
invoke
=
(
Invocable
)
engine
;
// 调用js函数
encryptContent
=
(
String
)
invoke
.
invokeFunction
(
method
,
content
,
ZCZY_KEY
);
}
reader
.
close
();
return
encryptContent
;
}
/**
* 16进制字符串转字节数组
*
...
...
src/main/resources/js/des.js
0 → 100644
View file @
7f1123b0
// class jsencrypt {
function
des
(
beinetkey
,
message
,
encrypt
,
mode
,
iv
)
{
//declaring this locally speeds things up a bit
var
spfunction1
=
new
Array
(
0x1010400
,
0
,
0x10000
,
0x1010404
,
0x1010004
,
0x10404
,
0x4
,
0x10000
,
0x400
,
0x1010400
,
0x1010404
,
0x400
,
0x1000404
,
0x1010004
,
0x1000000
,
0x4
,
0x404
,
0x1000400
,
0x1000400
,
0x10400
,
0x10400
,
0x1010000
,
0x1010000
,
0x1000404
,
0x10004
,
0x1000004
,
0x1000004
,
0x10004
,
0
,
0x404
,
0x10404
,
0x1000000
,
0x10000
,
0x1010404
,
0x4
,
0x1010000
,
0x1010400
,
0x1000000
,
0x1000000
,
0x400
,
0x1010004
,
0x10000
,
0x10400
,
0x1000004
,
0x400
,
0x4
,
0x1000404
,
0x10404
,
0x1010404
,
0x10004
,
0x1010000
,
0x1000404
,
0x1000004
,
0x404
,
0x10404
,
0x1010400
,
0x404
,
0x1000400
,
0x1000400
,
0
,
0x10004
,
0x10400
,
0
,
0x1010004
);
var
spfunction2
=
new
Array
(
-
0x7fef7fe0
,
-
0x7fff8000
,
0x8000
,
0x108020
,
0x100000
,
0x20
,
-
0x7fefffe0
,
-
0x7fff7fe0
,
-
0x7fffffe0
,
-
0x7fef7fe0
,
-
0x7fef8000
,
-
0x80000000
,
-
0x7fff8000
,
0x100000
,
0x20
,
-
0x7fefffe0
,
0x108000
,
0x100020
,
-
0x7fff7fe0
,
0
,
-
0x80000000
,
0x8000
,
0x108020
,
-
0x7ff00000
,
0x100020
,
-
0x7fffffe0
,
0
,
0x108000
,
0x8020
,
-
0x7fef8000
,
-
0x7ff00000
,
0x8020
,
0
,
0x108020
,
-
0x7fefffe0
,
0x100000
,
-
0x7fff7fe0
,
-
0x7ff00000
,
-
0x7fef8000
,
0x8000
,
-
0x7ff00000
,
-
0x7fff8000
,
0x20
,
-
0x7fef7fe0
,
0x108020
,
0x20
,
0x8000
,
-
0x80000000
,
0x8020
,
-
0x7fef8000
,
0x100000
,
-
0x7fffffe0
,
0x100020
,
-
0x7fff7fe0
,
-
0x7fffffe0
,
0x100020
,
0x108000
,
0
,
-
0x7fff8000
,
0x8020
,
-
0x80000000
,
-
0x7fefffe0
,
-
0x7fef7fe0
,
0x108000
);
var
spfunction3
=
new
Array
(
0x208
,
0x8020200
,
0
,
0x8020008
,
0x8000200
,
0
,
0x20208
,
0x8000200
,
0x20008
,
0x8000008
,
0x8000008
,
0x20000
,
0x8020208
,
0x20008
,
0x8020000
,
0x208
,
0x8000000
,
0x8
,
0x8020200
,
0x200
,
0x20200
,
0x8020000
,
0x8020008
,
0x20208
,
0x8000208
,
0x20200
,
0x20000
,
0x8000208
,
0x8
,
0x8020208
,
0x200
,
0x8000000
,
0x8020200
,
0x8000000
,
0x20008
,
0x208
,
0x20000
,
0x8020200
,
0x8000200
,
0
,
0x200
,
0x20008
,
0x8020208
,
0x8000200
,
0x8000008
,
0x200
,
0
,
0x8020008
,
0x8000208
,
0x20000
,
0x8000000
,
0x8020208
,
0x8
,
0x20208
,
0x20200
,
0x8000008
,
0x8020000
,
0x8000208
,
0x208
,
0x8020000
,
0x20208
,
0x8
,
0x8020008
,
0x20200
);
var
spfunction4
=
new
Array
(
0x802001
,
0x2081
,
0x2081
,
0x80
,
0x802080
,
0x800081
,
0x800001
,
0x2001
,
0
,
0x802000
,
0x802000
,
0x802081
,
0x81
,
0
,
0x800080
,
0x800001
,
0x1
,
0x2000
,
0x800000
,
0x802001
,
0x80
,
0x800000
,
0x2001
,
0x2080
,
0x800081
,
0x1
,
0x2080
,
0x800080
,
0x2000
,
0x802080
,
0x802081
,
0x81
,
0x800080
,
0x800001
,
0x802000
,
0x802081
,
0x81
,
0
,
0
,
0x802000
,
0x2080
,
0x800080
,
0x800081
,
0x1
,
0x802001
,
0x2081
,
0x2081
,
0x80
,
0x802081
,
0x81
,
0x1
,
0x2000
,
0x800001
,
0x2001
,
0x802080
,
0x800081
,
0x2001
,
0x2080
,
0x800000
,
0x802001
,
0x80
,
0x800000
,
0x2000
,
0x802080
);
var
spfunction5
=
new
Array
(
0x100
,
0x2080100
,
0x2080000
,
0x42000100
,
0x80000
,
0x100
,
0x40000000
,
0x2080000
,
0x40080100
,
0x80000
,
0x2000100
,
0x40080100
,
0x42000100
,
0x42080000
,
0x80100
,
0x40000000
,
0x2000000
,
0x40080000
,
0x40080000
,
0
,
0x40000100
,
0x42080100
,
0x42080100
,
0x2000100
,
0x42080000
,
0x40000100
,
0
,
0x42000000
,
0x2080100
,
0x2000000
,
0x42000000
,
0x80100
,
0x80000
,
0x42000100
,
0x100
,
0x2000000
,
0x40000000
,
0x2080000
,
0x42000100
,
0x40080100
,
0x2000100
,
0x40000000
,
0x42080000
,
0x2080100
,
0x40080100
,
0x100
,
0x2000000
,
0x42080000
,
0x42080100
,
0x80100
,
0x42000000
,
0x42080100
,
0x2080000
,
0
,
0x40080000
,
0x42000000
,
0x80100
,
0x2000100
,
0x40000100
,
0x80000
,
0
,
0x40080000
,
0x2080100
,
0x40000100
);
var
spfunction6
=
new
Array
(
0x20000010
,
0x20400000
,
0x4000
,
0x20404010
,
0x20400000
,
0x10
,
0x20404010
,
0x400000
,
0x20004000
,
0x404010
,
0x400000
,
0x20000010
,
0x400010
,
0x20004000
,
0x20000000
,
0x4010
,
0
,
0x400010
,
0x20004010
,
0x4000
,
0x404000
,
0x20004010
,
0x10
,
0x20400010
,
0x20400010
,
0
,
0x404010
,
0x20404000
,
0x4010
,
0x404000
,
0x20404000
,
0x20000000
,
0x20004000
,
0x10
,
0x20400010
,
0x404000
,
0x20404010
,
0x400000
,
0x4010
,
0x20000010
,
0x400000
,
0x20004000
,
0x20000000
,
0x4010
,
0x20000010
,
0x20404010
,
0x404000
,
0x20400000
,
0x404010
,
0x20404000
,
0
,
0x20400010
,
0x10
,
0x4000
,
0x20400000
,
0x404010
,
0x4000
,
0x400010
,
0x20004010
,
0
,
0x20404000
,
0x20000000
,
0x400010
,
0x20004010
);
var
spfunction7
=
new
Array
(
0x200000
,
0x4200002
,
0x4000802
,
0
,
0x800
,
0x4000802
,
0x200802
,
0x4200800
,
0x4200802
,
0x200000
,
0
,
0x4000002
,
0x2
,
0x4000000
,
0x4200002
,
0x802
,
0x4000800
,
0x200802
,
0x200002
,
0x4000800
,
0x4000002
,
0x4200000
,
0x4200800
,
0x200002
,
0x4200000
,
0x800
,
0x802
,
0x4200802
,
0x200800
,
0x2
,
0x4000000
,
0x200800
,
0x4000000
,
0x200800
,
0x200000
,
0x4000802
,
0x4000802
,
0x4200002
,
0x4200002
,
0x2
,
0x200002
,
0x4000000
,
0x4000800
,
0x200000
,
0x4200800
,
0x802
,
0x200802
,
0x4200800
,
0x802
,
0x4000002
,
0x4200802
,
0x4200000
,
0x200800
,
0
,
0x2
,
0x4200802
,
0
,
0x200802
,
0x4200000
,
0x800
,
0x4000002
,
0x4000800
,
0x800
,
0x200002
);
var
spfunction8
=
new
Array
(
0x10001040
,
0x1000
,
0x40000
,
0x10041040
,
0x10000000
,
0x10001040
,
0x40
,
0x10000000
,
0x40040
,
0x10040000
,
0x10041040
,
0x41000
,
0x10041000
,
0x41040
,
0x1000
,
0x40
,
0x10040000
,
0x10000040
,
0x10001000
,
0x1040
,
0x41000
,
0x40040
,
0x10040040
,
0x10041000
,
0x1040
,
0
,
0
,
0x10040040
,
0x10000040
,
0x10001000
,
0x41040
,
0x40000
,
0x41040
,
0x40000
,
0x10041000
,
0x1000
,
0x40
,
0x10040040
,
0x1000
,
0x41040
,
0x10001000
,
0x40
,
0x10000040
,
0x10040000
,
0x10040040
,
0x10000000
,
0x40000
,
0x10001040
,
0
,
0x10041040
,
0x40040
,
0x10000040
,
0x10040000
,
0x10001000
,
0x10001040
,
0
,
0x10041040
,
0x41000
,
0x41000
,
0x1040
,
0x1040
,
0x40040
,
0x10000000
,
0x10041000
);
//create the 16 or 48 subkeys we will need
var
keys
=
this
.
des_createKeys
(
beinetkey
);
var
m
=
0
,
i
,
j
,
temp
,
temp2
,
right1
,
right2
,
left
,
right
,
looping
;
var
cbcleft
,
cbcleft2
,
cbcright
,
cbcright2
var
endloop
,
loopinc
;
var
len
=
message
.
length
;
var
chunk
=
0
;
//set up the loops for single and triple des
var
iterations
=
keys
.
length
==
32
?
3
:
9
;
//single or triple des
if
(
iterations
==
3
)
{
looping
=
encrypt
?
new
Array
(
0
,
32
,
2
)
:
new
Array
(
30
,
-
2
,
-
2
);
}
else
{
looping
=
encrypt
?
new
Array
(
0
,
32
,
2
,
62
,
30
,
-
2
,
64
,
96
,
2
)
:
new
Array
(
94
,
62
,
-
2
,
32
,
64
,
2
,
30
,
-
2
,
-
2
);
}
message
+=
'
\
0
\
0
\
0
\
0
\
0
\
0
\
0
\
0'
;
//pad the message out with null bytes
//store the result here
var
result
=
''
;
var
tempresult
=
''
;
if
(
mode
==
1
)
{
//CBC mode
cbcleft
=
(
iv
.
charCodeAt
(
m
++
)
<<
24
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
16
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
8
)
|
iv
.
charCodeAt
(
m
++
);
cbcright
=
(
iv
.
charCodeAt
(
m
++
)
<<
24
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
16
)
|
(
iv
.
charCodeAt
(
m
++
)
<<
8
)
|
iv
.
charCodeAt
(
m
++
);
m
=
0
;
}
//loop through each 64 bit chunk of the message
while
(
m
<
len
)
{
if
(
encrypt
)
{
//加密时按双字节操作
left
=
(
message
.
charCodeAt
(
m
++
)
<<
16
)
|
message
.
charCodeAt
(
m
++
);
right
=
(
message
.
charCodeAt
(
m
++
)
<<
16
)
|
message
.
charCodeAt
(
m
++
);
}
else
{
left
=
(
message
.
charCodeAt
(
m
++
)
<<
24
)
|
(
message
.
charCodeAt
(
m
++
)
<<
16
)
|
(
message
.
charCodeAt
(
m
++
)
<<
8
)
|
message
.
charCodeAt
(
m
++
);
right
=
(
message
.
charCodeAt
(
m
++
)
<<
24
)
|
(
message
.
charCodeAt
(
m
++
)
<<
16
)
|
(
message
.
charCodeAt
(
m
++
)
<<
8
)
|
message
.
charCodeAt
(
m
++
);
}
//for Cipher Block Chaining mode,xor the message with the previous result
if
(
mode
==
1
)
{
if
(
encrypt
)
{
left
^=
cbcleft
;
right
^=
cbcright
;
}
else
{
cbcleft2
=
cbcleft
;
cbcright2
=
cbcright
;
cbcleft
=
left
;
cbcright
=
right
;
}
}
//first each 64 but chunk of the message must be permuted according to IP
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
temp
=
((
left
>>>
16
)
^
right
)
&
0x0000ffff
;
right
^=
temp
;
left
^=
(
temp
<<
16
);
temp
=
((
right
>>>
2
)
^
left
)
&
0x33333333
;
left
^=
temp
;
right
^=
(
temp
<<
2
);
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
left
=
((
left
<<
1
)
|
(
left
>>>
31
));
right
=
((
right
<<
1
)
|
(
right
>>>
31
));
//do this either 1 or 3 times for each chunk of the message
for
(
j
=
0
;
j
<
iterations
;
j
+=
3
)
{
endloop
=
looping
[
j
+
1
];
loopinc
=
looping
[
j
+
2
];
//now go through and perform the encryption or decryption
for
(
i
=
looping
[
j
];
i
!=
endloop
;
i
+=
loopinc
)
{
//for efficiency
right1
=
right
^
keys
[
i
];
right2
=
((
right
>>>
4
)
|
(
right
<<
28
))
^
keys
[
i
+
1
];
//the result is attained by passing these bytes through the S selection functions
temp
=
left
;
left
=
right
;
right
=
temp
^
(
spfunction2
[(
right1
>>>
24
)
&
0x3f
]
|
spfunction4
[(
right1
>>>
16
)
&
0x3f
]
|
spfunction6
[(
right1
>>>
8
)
&
0x3f
]
|
spfunction8
[
right1
&
0x3f
]
|
spfunction1
[(
right2
>>>
24
)
&
0x3f
]
|
spfunction3
[(
right2
>>>
16
)
&
0x3f
]
|
spfunction5
[(
right2
>>>
8
)
&
0x3f
]
|
spfunction7
[
right2
&
0x3f
]);
}
temp
=
left
;
left
=
right
;
right
=
temp
;
//unreverse left and right
}
//for either 1 or 3 iterations
//move then each one bit to the right
left
=
((
left
>>>
1
)
|
(
left
<<
31
));
right
=
((
right
>>>
1
)
|
(
right
<<
31
));
//now perform IP-1,which is IP in the opposite direction
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
temp
=
((
right
>>>
2
)
^
left
)
&
0x33333333
;
left
^=
temp
;
right
^=
(
temp
<<
2
);
temp
=
((
left
>>>
16
)
^
right
)
&
0x0000ffff
;
right
^=
temp
;
left
^=
(
temp
<<
16
);
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
//for Cipher Block Chaining mode,xor the message with the previous result
if
(
mode
==
1
)
{
if
(
encrypt
)
{
cbcleft
=
left
;
cbcright
=
right
;
}
else
{
left
^=
cbcleft2
;
right
^=
cbcright2
;
}
}
if
(
encrypt
)
{
tempresult
+=
String
.
fromCharCode
((
left
>>>
24
),
((
left
>>>
16
)
&
0xff
),
((
left
>>>
8
)
&
0xff
),
(
left
&
0xff
),
(
right
>>>
24
),
((
right
>>>
16
)
&
0xff
),
((
right
>>>
8
)
&
0xff
),
(
right
&
0xff
));
}
else
{
tempresult
+=
String
.
fromCharCode
(((
left
>>>
16
)
&
0xffff
),
(
left
&
0xffff
),
((
right
>>>
16
)
&
0xffff
),
(
right
&
0xffff
));
}
//解密时输出双字节
encrypt
?
chunk
+=
16
:
chunk
+=
8
;
if
(
chunk
==
512
)
{
result
+=
tempresult
;
tempresult
=
''
;
chunk
=
0
;
}
}
//for every 8 characters,or 64 bits in the message
//return the result as an array
return
result
+
tempresult
;
}
//end of des
//des_createKeys
//this takes as input a 64 bit beinetkey(even though only 56 bits are used)
//as an array of 2 integers,and returns 16 48 bit keys
function
des_createKeys
(
beinetkey
)
{
//declaring this locally speeds things up a bit
var
pc2bytes0
=
new
Array
(
0
,
0x4
,
0x20000000
,
0x20000004
,
0x10000
,
0x10004
,
0x20010000
,
0x20010004
,
0x200
,
0x204
,
0x20000200
,
0x20000204
,
0x10200
,
0x10204
,
0x20010200
,
0x20010204
);
var
pc2bytes1
=
new
Array
(
0
,
0x1
,
0x100000
,
0x100001
,
0x4000000
,
0x4000001
,
0x4100000
,
0x4100001
,
0x100
,
0x101
,
0x100100
,
0x100101
,
0x4000100
,
0x4000101
,
0x4100100
,
0x4100101
);
var
pc2bytes2
=
new
Array
(
0
,
0x8
,
0x800
,
0x808
,
0x1000000
,
0x1000008
,
0x1000800
,
0x1000808
,
0
,
0x8
,
0x800
,
0x808
,
0x1000000
,
0x1000008
,
0x1000800
,
0x1000808
);
var
pc2bytes3
=
new
Array
(
0
,
0x200000
,
0x8000000
,
0x8200000
,
0x2000
,
0x202000
,
0x8002000
,
0x8202000
,
0x20000
,
0x220000
,
0x8020000
,
0x8220000
,
0x22000
,
0x222000
,
0x8022000
,
0x8222000
);
var
pc2bytes4
=
new
Array
(
0
,
0x40000
,
0x10
,
0x40010
,
0
,
0x40000
,
0x10
,
0x40010
,
0x1000
,
0x41000
,
0x1010
,
0x41010
,
0x1000
,
0x41000
,
0x1010
,
0x41010
);
var
pc2bytes5
=
new
Array
(
0
,
0x400
,
0x20
,
0x420
,
0
,
0x400
,
0x20
,
0x420
,
0x2000000
,
0x2000400
,
0x2000020
,
0x2000420
,
0x2000000
,
0x2000400
,
0x2000020
,
0x2000420
);
var
pc2bytes6
=
new
Array
(
0
,
0x10000000
,
0x80000
,
0x10080000
,
0x2
,
0x10000002
,
0x80002
,
0x10080002
,
0
,
0x10000000
,
0x80000
,
0x10080000
,
0x2
,
0x10000002
,
0x80002
,
0x10080002
);
var
pc2bytes7
=
new
Array
(
0
,
0x10000
,
0x800
,
0x10800
,
0x20000000
,
0x20010000
,
0x20000800
,
0x20010800
,
0x20000
,
0x30000
,
0x20800
,
0x30800
,
0x20020000
,
0x20030000
,
0x20020800
,
0x20030800
);
var
pc2bytes8
=
new
Array
(
0
,
0x40000
,
0
,
0x40000
,
0x2
,
0x40002
,
0x2
,
0x40002
,
0x2000000
,
0x2040000
,
0x2000000
,
0x2040000
,
0x2000002
,
0x2040002
,
0x2000002
,
0x2040002
);
var
pc2bytes9
=
new
Array
(
0
,
0x10000000
,
0x8
,
0x10000008
,
0
,
0x10000000
,
0x8
,
0x10000008
,
0x400
,
0x10000400
,
0x408
,
0x10000408
,
0x400
,
0x10000400
,
0x408
,
0x10000408
);
var
pc2bytes10
=
new
Array
(
0
,
0x20
,
0
,
0x20
,
0x100000
,
0x100020
,
0x100000
,
0x100020
,
0x2000
,
0x2020
,
0x2000
,
0x2020
,
0x102000
,
0x102020
,
0x102000
,
0x102020
);
var
pc2bytes11
=
new
Array
(
0
,
0x1000000
,
0x200
,
0x1000200
,
0x200000
,
0x1200000
,
0x200200
,
0x1200200
,
0x4000000
,
0x5000000
,
0x4000200
,
0x5000200
,
0x4200000
,
0x5200000
,
0x4200200
,
0x5200200
);
var
pc2bytes12
=
new
Array
(
0
,
0x1000
,
0x8000000
,
0x8001000
,
0x80000
,
0x81000
,
0x8080000
,
0x8081000
,
0x10
,
0x1010
,
0x8000010
,
0x8001010
,
0x80010
,
0x81010
,
0x8080010
,
0x8081010
);
var
pc2bytes13
=
new
Array
(
0
,
0x4
,
0x100
,
0x104
,
0
,
0x4
,
0x100
,
0x104
,
0x1
,
0x5
,
0x101
,
0x105
,
0x1
,
0x5
,
0x101
,
0x105
);
//how many iterations(1 for des,3 for triple des)
var
iterations
=
beinetkey
.
length
>=
24
?
3
:
1
;
//stores the return keys
var
keys
=
new
Array
(
32
*
iterations
);
//now define the left shifts which need to be done
var
shifts
=
new
Array
(
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
0
);
//other variables
var
lefttemp
,
righttemp
,
m
=
0
,
n
=
0
,
temp
;
for
(
var
j
=
0
;
j
<
iterations
;
j
++
)
{
//either 1 or 3 iterations
var
left
=
(
beinetkey
.
charCodeAt
(
m
++
)
<<
24
)
|
(
beinetkey
.
charCodeAt
(
m
++
)
<<
16
)
|
(
beinetkey
.
charCodeAt
(
m
++
)
<<
8
)
|
beinetkey
.
charCodeAt
(
m
++
);
var
right
=
(
beinetkey
.
charCodeAt
(
m
++
)
<<
24
)
|
(
beinetkey
.
charCodeAt
(
m
++
)
<<
16
)
|
(
beinetkey
.
charCodeAt
(
m
++
)
<<
8
)
|
beinetkey
.
charCodeAt
(
m
++
);
temp
=
((
left
>>>
4
)
^
right
)
&
0x0f0f0f0f
;
right
^=
temp
;
left
^=
(
temp
<<
4
);
temp
=
((
right
>>>
-
16
)
^
left
)
&
0x0000ffff
;
left
^=
temp
;
right
^=
(
temp
<<
-
16
);
temp
=
((
left
>>>
2
)
^
right
)
&
0x33333333
;
right
^=
temp
;
left
^=
(
temp
<<
2
);
temp
=
((
right
>>>
-
16
)
^
left
)
&
0x0000ffff
;
left
^=
temp
;
right
^=
(
temp
<<
-
16
);
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
temp
=
((
right
>>>
8
)
^
left
)
&
0x00ff00ff
;
left
^=
temp
;
right
^=
(
temp
<<
8
);
temp
=
((
left
>>>
1
)
^
right
)
&
0x55555555
;
right
^=
temp
;
left
^=
(
temp
<<
1
);
//the right side needs to be shifted and to get the last four bits of the left side
temp
=
(
left
<<
8
)
|
((
right
>>>
20
)
&
0x000000f0
);
//left needs to be put upside down
left
=
(
right
<<
24
)
|
((
right
<<
8
)
&
0xff0000
)
|
((
right
>>>
8
)
&
0xff00
)
|
((
right
>>>
24
)
&
0xf0
);
right
=
temp
;
//now go through and perform these shifts on the left and right keys
for
(
var
i
=
0
;
i
<
shifts
.
length
;
i
++
)
{
//shift the keys either one or two bits to the left
if
(
shifts
[
i
])
{
left
=
(
left
<<
2
)
|
(
left
>>>
26
);
right
=
(
right
<<
2
)
|
(
right
>>>
26
);
}
else
{
left
=
(
left
<<
1
)
|
(
left
>>>
27
);
right
=
(
right
<<
1
)
|
(
right
>>>
27
);
}
left
&=
-
0xf
;
right
&=
-
0xf
;
//now apply PC-2,in such a way that E is easier when encrypting or decrypting
//this conversion will look like PC-2 except only the last 6 bits of each byte are used
//rather than 48 consecutive bits and the order of lines will be according to
//how the S selection functions will be applied:S2,S4,S6,S8,S1,S3,S5,S7
lefttemp
=
pc2bytes0
[
left
>>>
28
]
|
pc2bytes1
[(
left
>>>
24
)
&
0xf
]
|
pc2bytes2
[(
left
>>>
20
)
&
0xf
]
|
pc2bytes3
[(
left
>>>
16
)
&
0xf
]
|
pc2bytes4
[(
left
>>>
12
)
&
0xf
]
|
pc2bytes5
[(
left
>>>
8
)
&
0xf
]
|
pc2bytes6
[(
left
>>>
4
)
&
0xf
];
righttemp
=
pc2bytes7
[
right
>>>
28
]
|
pc2bytes8
[(
right
>>>
24
)
&
0xf
]
|
pc2bytes9
[(
right
>>>
20
)
&
0xf
]
|
pc2bytes10
[(
right
>>>
16
)
&
0xf
]
|
pc2bytes11
[(
right
>>>
12
)
&
0xf
]
|
pc2bytes12
[(
right
>>>
8
)
&
0xf
]
|
pc2bytes13
[(
right
>>>
4
)
&
0xf
];
temp
=
((
righttemp
>>>
16
)
^
lefttemp
)
&
0x0000ffff
;
keys
[
n
++
]
=
lefttemp
^
temp
;
keys
[
n
++
]
=
righttemp
^
(
temp
<<
16
);
}
}
//for each iterations
//return the keys we've created
return
keys
;
}
//end of des_createKeys
// 把字符串转换为16进制字符串
// 如:a变成61(即10进制的97);abc变成616263
function
stringToHex
(
s
)
{
var
r
=
''
;
var
hexes
=
new
Array
(
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
);
for
(
var
i
=
0
;
i
<
(
s
.
length
);
i
++
)
{
r
+=
hexes
[
s
.
charCodeAt
(
i
)
>>
4
]
+
hexes
[
s
.
charCodeAt
(
i
)
&
0xf
];
}
return
r
;
}
// 16进制字符串转换为字符串
// 如:61(即10进制的97)变成a;616263变成abc
function
hexTostring
(
s
)
{
var
r
=
''
;
for
(
var
i
=
0
;
i
<
s
.
length
;
i
+=
2
)
{
var
sxx
=
parseInt
(
s
.
substring
(
i
,
i
+
2
),
16
);
r
+=
String
.
fromCharCode
(
sxx
);
}
return
r
;
}
/// 加密测试函数
/// s 待加密的字符串
/// k 密钥
function
encMe
(
s
,
k
)
{
return
this
.
stringToHex
(
this
.
des
(
k
,
s
,
1
,
0
));
}
/// 解密测试函数
/// s 待解密的字符串
/// k 密钥
function
uncMe
(
s
,
k
)
{
return
this
.
des
(
k
,
this
.
hexTostring
(
s
),
0
,
0
);
}
// }
// class encode extends jsencrypt {
// constructor() {
// super()
// }
// jsencrypt(s, k) {
// return this.stringToHex(this.des(k, s, 1, 0));
// }
// jsdecrypt(s, k) {
// return this.des(k, this.hexTostring(s), 0, 0);
// }
// }
// export default new encode()
\ No newline at end of file
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