提交 f2492310 编写于 作者: VK1688's avatar VK1688

【优化】与java和php等服务端通信的加密解密示例

上级 accf31e9
## 2.1.0(2023-05-12)
- 【优化】与java和php服务端通信的加密解密示例
## 2.0.7(2023-04-13)
- 【优化】appleiap支付的订单调用getOrder接口时做兼容性处理
## 2.0.6(2023-04-12)
......
{
"id": "uni-pay",
"displayName": "uni-pay",
"version": "2.0.7",
"version": "2.1.0",
"description": "更简单的支付接口调用方式、拉齐不同支付平台",
"keywords": [
"unipay",
......
......@@ -26,8 +26,10 @@ util.aes = {};
* aes加密
* @param {Object} data 待加密的原文
* @param {Object} key 密钥,如不传,自动取config
* @param {String} mode 默认为aes192支持64位或64以上密钥 其他可选(aes-128-ecb 兼容java等其他后端语言)
* 调用示例
let encrypted = crypto.aes.encrypt({
mode: "aes192",
data: "", // 待加密的原文
});
*/
......@@ -35,22 +37,26 @@ util.aes.encrypt = function(obj) {
let {
data, // 待加密的原文
key, // 密钥,如不传,自动取config
mode = "aes192",
} = obj;
if (!key) key = config.notifyKey;
if (typeof data === "object") data = JSON.stringify(data);
const cipher = crypto.createCipher('aes192', key);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');
// encrypted 为加密后的内容
return encrypted;
if (mode === "aes-128-ecb") {
// aes-128-ecb算法
return encryptUseAes128Ecb(data, key);
} else {
return encryptUseAes192(data, key);
}
};
/**
* aes解密
* @param {Object} data 待解密的原文
* @param {Object} key 密钥,如不传,自动取config
* @param {String} mode 默认为aes192支持64位或64以上密钥 其他可选(aes-128-ecb 兼容java等其他后端语言)
* 调用示例
let decrypted = crypto.aes.decrypt({
mode: "aes192",
data: "", // 待解密的原文
});
*/
......@@ -58,6 +64,7 @@ util.aes.decrypt = function(obj) {
let {
data, // 待解密的原文
key, // 密钥,如不传,自动取config
mode = "aes192",
} = obj;
if (typeof data === "undefined") {
throw "待解密原文不能为空";
......@@ -65,6 +72,31 @@ util.aes.decrypt = function(obj) {
if (!key) key = config.notifyKey;
// 解密
let decrypted;
if (mode === "aes-128-ecb") {
// aes-128-ecb算法
return decryptUseAes128Ecb(data, key);
} else {
return decryptUseAes192(data, key);
}
// decrypted 为解密后的内容,即最开始需要加密的原始数据文本data
return decrypted;
};
module.exports = util;
// aes192算法 - 加密
function encryptUseAes192(data, key) {
const cipher = crypto.createCipher('aes192', key);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');
// encrypted 为加密后的内容
return encrypted;
}
// aes192算法 - 解密
function decryptUseAes192(data, key) {
// aes192 算法
let decrypted;
try {
const decipher = crypto.createDecipher('aes192', key);
decrypted = decipher.update(data, 'hex', 'utf8');
......@@ -77,6 +109,51 @@ util.aes.decrypt = function(obj) {
}
// decrypted 为解密后的内容,即最开始需要加密的原始数据文本data
return decrypted;
};
}
module.exports = util;
// aes-128-ecb算法 - 加密
function encryptUseAes128Ecb(data, key) {
let paddedData = Buffer.from(data);
let paddedkey = key;
if (paddedkey.length > 16) {
paddedkey = paddedkey.substring(0, 16);
}
paddedkey = Buffer.from(paddedkey);
const cipher = crypto.createCipheriv('aes-128-ecb', paddedkey, '');
cipher.setAutoPadding(false);
const blockSize = 16; // AES块大小为16字节
const paddingSize = blockSize - (paddedData.length % blockSize);
const paddingBuffer = Buffer.alloc(paddingSize, paddingSize);
paddedData = Buffer.concat([paddedData, paddingBuffer]);
let encrypted = cipher.update(paddedData, null, 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
// aes-128-ecb算法 - 解密
function decryptUseAes128Ecb(data, key) {
let paddedkey = key;
if (paddedkey.length > 16) {
paddedkey = paddedkey.substring(0, 16);
}
paddedkey = Buffer.from(paddedkey);
let decrypted;
try {
const decipher = crypto.createDecipheriv('aes-128-ecb', paddedkey, '');
decipher.setAutoPadding(false);
let decrypted = decipher.update(data, 'base64');
decrypted += decipher.final();
const lastByte = decrypted.charCodeAt(decrypted.length - 1);
const paddingSize = lastByte;
decrypted = decrypted.slice(0, decrypted.length - paddingSize);
try {
decrypted = JSON.parse(decrypted);
} catch (err) {}
return decrypted;
} catch (err) {
throw "解密失败";
}
return decrypted;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册