我有加密模块做字符串加密时,通过字符串不是16字节我假设密码.更新()应该做一些填充,并创建16字节字符串,但这是不是发生在调试密码.更新返回空字符串,有其他方法来做填充使用加密.
index.js
function paymentIdencryption(text)
const secret_key = "EiE0BVQle0xFjZvYOupKjFGHAcAwBaTjlZ7G7rryNos=";
const secretKeyWordArray = CCrypto.enc.Utf8.parse(secret_key);
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(secret_key, 'base64'), iv);
let encrypted = cipher.update(JSON.stringify(text), 'utf8', 'base64');
encrypted += cipher.final('base64');
const encryptedData = { iv: iv.toString('base64'), encrypted: encodeURIComponent(encrypted)};
return encryptedData.encrypted;
}
console.log(paymentIdencryption("1384220_8089105");
字符串
预期结果键大小:
GwJPNUfPXZZsuc0iqOFhn%2BYhMJKxXBUGl9g3iKqL8CE%3D
但它返回:jJtKhwjqS5N4ABIrZev8Ng%3D%3D
执行解密的Java代码
var imp = new JavaImporter(com.vordel.mime,org.json.simple.JSONObject,com.vordel.trace);
with(imp) {
function invoke(msg) {
var encodedKey = "${env.SPL.paymentMethodId.key}";
Trace.info ("env.SPL.paymentMethodId.key -- encodedKey = " + encodedKey);
var encodedPaymentInfo= msg.get("cvs.paymentMethodId");
var encryptedPaymentInfo = java.net.URLDecoder.decode(encodedPaymentInfo,"UTF-8");
var decodedKey = java.util.Base64.getDecoder().decode(encodedKey.getBytes("UTF-8"));
var decodedcipher = java.util.Base64.getDecoder().decode(encryptedPaymentInfo.getBytes("UTF-8"));
var cipher = javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding");
var secretKey = new javax.crypto.spec.SecretKeySpec(decodedKey, "AES");
var iv = new javax.crypto.spec.IvParameterSpec(decodedcipher,0,16);
cipher.init(javax.crypto.Cipher.DECRYPT_MODE,secretKey,iv);
var decryptedPaymentInfo = cipher.doFinal(decodedcipher, 16, decodedcipher.length-16);
var paymentInfo = new java.lang.String(decryptedPaymentInfo,"UTF-8");
var patientId = paymentInfo.substring(paymentInfo.indexOf("_")+1, paymentInfo.length());
var paymentId = paymentInfo.substring(0, paymentInfo.indexOf("_"));
msg.put("cvs.spl.patientId",patientId);
msg.put("cvs.spl.paymentId",paymentId);
return true;
}
};
型
1条答案
按热度按时间2q5ifsrm1#
Java代码执行加密数据的URL解码,然后执行Base64解码。结果的前16个字节用作IV,其余的用作密文。
密钥是Base64解码的。
使用密钥和IV,密文现在使用CBC模式和PKCS#7填充的AES解密。
解密后的数据使用UTF-8进行解码。
从结果字符串中提取
patientid
(_
之后的数据)和paymentid
(_
之前的数据)。由此,可以确定加密的逻辑:
可能的NodeJS实现:
字符串
可能的输出(由于随机IV,每次加密的变化):
型
使用Java代码测试:
型
输出量:
型
其等于原始明文的数据。