【发布时间】:2016-10-20 01:35:14
【问题描述】:
我已经尝试了很多天来尝试解决这个问题。
第 3 方网络服务要求我使用 3DES 和 ECB 发送加密数据 和 PKCS7padding - 他们正在使用 .NET
railo CFML 中的加密功能仅限于 DESede,没有任何其他选项(即默认值用于密码模式和填充)。
有没有人在 Railo 中遇到过这个问题并提出了解决方案(也许是基于 java 的)? - 我真的把头发拉出来了!
根据下面 Leigh 的建议,我做了一些更改:
我已经取得了一些进展,我认为这个密钥上有某种 MD5 散列。
我在网上搜索并稍微修改了您的解决方案 - 我认为填充不是必要的,但生成的加密字符串起初似乎是我所期望的,但仔细检查后发现它是不正确的:
IvParameterSpec = createObject("java", "javax.crypto.spec.IvParameterSpec");
Cipher = createObject("java", "javax.crypto.Cipher");
SecretKeySpec = createObject("java", "javax.crypto.spec.SecretKeySpec");
BASE64Decoder = createObject("java", "sun.misc.BASE64Decoder");
Str = createObject("java", "java.lang.String");
MessageDigest = createObject("java", "java.security.MessageDigest");
input = "<xml><PanNumber>6280390027626871</PanNumber><Req_Currency_Code>826</Req_Currency_Code><Card_Pin>1234</Card_Pin><Till_Amount></Till_Amount><Auth_Code></Auth_Code></xml>";
key = "06098140901984F95E139F29B479D952CB6545C177D21456";
md = MessageDigest.getInstance("MD5");
md.update(key.getBytes("UTF-8"), 0, key.length());
keyBytes = md.digest();
newKey = tobase64(keyBytes);
keyBytes2 = binaryDecode(newKey, "base64");
keyBytes2 = arrayMerge(keyBytes, arraySlice(keyBytes, 1, 8));
allnewKey = binaryEncode(javacast("byte[]", keyBytes2), "base64");
encrypted = encrypt(input, allnewKey, "desede", "base64");
WriteDump("encrypted (CF): "& encrypted);`
The result is: 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6KrdbXe7NBUVADYMdGuagfO4Tev584dUcgKGJ2h6kWPZxooNUGMgL2xB7e00YOkLosA8wFD569sZUd1MGKuF9yCjY1zCsAE4SgohkcuK9YZ7BizQma99/W9yOsIjAfHtAqGiep4tMTQ+eFASYtPybccsgi8H4brIB/HAu0kaDSAw
预期结果是: 26sfwv2DHDj7EHYd5Qao8veDtPbKIcv8rDVhbLPDEaWHO27EUGRF6MxaAzUpJDqQBq8NGgdqmtn6q/wVQNHGWrOE8+aetKVC78nszS3ZO8AHjwoT1igv4lGl78n8jCHHU+KwnBT7KfXIYMTCuwO/MohIiFbGyhMXPsvv3/G4OY1C2nEkN0LweLh4mTgtU8syT1M9XdmvwhaltsmPoFtoE9FujvQpJCY3
【问题讨论】:
-
(编辑)您能否发布一个示例密钥以及您在 Railo 和 .net 中获得的结果?我认为 Railo 只是使用 java 默认值,它们是
ECB和PKCS5Padding(主要与 8 字节的 PKCS7padding 兼容)。所以理论上它应该开箱即用。
标签: .net encryption coldfusion railo 3des