SagePay AES表单集成

时间:2013-11-06 20:45:26

标签: encryption aes sagepay

我有一个有效的表单集成,但需要转到表单集成的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还是来自开发者社区,都非常感谢。 约翰

2 个答案:

答案 0 :(得分:1)

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

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

必须是

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

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

答案 1 :(得分: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);