2

我有一个有效的表单集成,但需要迁移到表单集成的 v 3.00,它需要 AES 编码而不是 Xor。示例代码是一个隐藏加密方法的 J2EE 应用程序。SagePay 支持无法提供加密/解密的 API 类/方法;我怀疑它们在那里,如果有人使用过它们并可以就此提供建议吗?

或者,我正在尝试在我自己的代码中进行加密。SagePay 再次没有出现,因为他们没有提供足够的信息来说明加密是如何完成的。我相信我已经弄清楚他们提供的密码既用于加密密钥又用于 iv,尽管他们没有在集成指南中说明这一点。这是我尝试对 inString 进行编码的代码

        byte[] byteDataToEncrypt = inString.getBytes();
        final byte[] keyBytes = webSite.encryptionPassword().getBytes("ASCII");
        final byte[] ivBytes = webSite.encryptionPassword().getBytes("ASCII");
        final SecretKey key = new SecretKeySpec(keyBytes, "AES");
        final IvParameterSpec iv = new IvParameterSpec(ivBytes);
        final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        byte[] byteCipherText = cipher.doFinal(byteDataToEncrypt);
        byte[] aesEncryptedBase64encoded = Base64.encodeBase64(byteCipherText);
            String crypt = "@" + new String(aesEncryptedBase64encoded);

我不知道为什么 @ 需要在前面,但我已经在其他代码中看到它已经在线发布用于 SagePay 集成。没有它,SagePay 测试服务器告诉我加密方法无法识别。有了它,它告诉我缺少货币字段,尽管我知道货币字段在源中设置为“GBP”并且我正在使用提供的测试服务器密码。

任何来自 SagePay 或开发者社区的帮助都非常感谢。约翰

4

2 回答 2

1

即使移至ver4.00,这也有效。版本 4.00 唯一需要不同的是它需要加密字符串为大写。因此,而不是

String crypt = "@" + Hex.encodeHexString(byteCipherText);

它需要是

String crypt = "@" + Hex.encodeHexString(byteCipherText).toUpperCase();

最新的 Sagepay/Opayo 文档至少口头列出了所有需要的内容,即使它仍然不是很全面,连同这段代码,我也可以解决。谢谢。

于 2021-05-14T18:09:17.143 回答
0

对我有用的解决方案是替换它:

byte[] aesEncryptedBase64encoded = Base64.encodeBase64(byteCipherText);
String crypt = "@" + new String(aesEncryptedBase64encoded);

有了这个

String crypt = "@" + Hex.encodeHexString(byteCipherText);

或者如果直接使用 SagePay API,只需将所有代码替换为以下两行:

byte[] aesEncrypted = CryptographyHelper.AESEncrypt(detail, "ISO-8859-1", password);  
String crypt = "@" + Hex.encodeHexString(aesEncrypted);
于 2013-11-07T10:03:58.950 回答