java-Lotus Domino集成(Netpay)中的加密字符串

java-Lotus Domino集成(Netpay)中的加密字符串,java,encryption,lotus-domino,Java,Encryption,Lotus Domino,我的LotusDomino应用程序中有一个棘手的问题。我们一直在使用EPDQ为我们的购物车处理付款,但客户希望切换到Netpay,其工作方式不同,您可以使用其加密密钥和初始化向量加密您自己的交易信息。他们提供了一些示例java,下面是encrytion函数,不过LotusDomino可以导入加密所需的库 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.IvPa

我的LotusDomino应用程序中有一个棘手的问题。我们一直在使用EPDQ为我们的购物车处理付款,但客户希望切换到Netpay,其工作方式不同,您可以使用其加密密钥和初始化向量加密您自己的交易信息。他们提供了一些示例java,下面是encrytion函数,不过LotusDomino可以导入加密所需的库

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
它无法解析我需要的最后一个库

import org.apache.commons.codec.binary.Hex;
我的Java技能不是很好,但我的理解是,所有这些似乎都在为加密过程生成一个字节字符串。有一个匹配的解密函数也需要这个库,有没有其他方法可以达到它的效果?在我的代理中,您可以导入不同库的负载,但迄今为止没有一个库包含我需要的内容

public static String encrypt_cbc(String input, String key, String iv){
    byte[] crypted = null;
    try{
         //byte[] key_byte = Hex.decodeHex(key.toCharArray());
         byte[] key_byte = DatatypeConverter.parseHexBinary(key); 
         SecretKeySpec key_spec = new SecretKeySpec(key_byte, "AES");

         //byte[] iv_byte = Hex.decodeHex(iv.toCharArray());
         byte[] iv_byte = DatatypeConverter.parseHexBinary(IV); 
         IvParameterSpec iv_spec = new IvParameterSpec(iv_byte);

         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

         cipher.init(Cipher.ENCRYPT_MODE, key_spec, iv_spec);
         crypted = cipher.doFinal(input.getBytes());

    }catch(Exception e){
         System.out.println(e.toString());
    }
    String crypted_hex = Hex.encodeHexString(crypted);
    return crypted_hex;
}

星期四21:13-钻研一个解决方案,用DatatypeConverter.parseHexBinary替换Hex.decodeHex似乎是一个好的开始,尽管它不喜欢调用cipher.init或doFinal,所以仍有工作要做。我还没有在我的Domino Designer中加入一个额外的JAR,因为我有多年的服务器共享经验,这通常是最好的配置,我已经接到Bluesky Hosting的电话,但不抱希望。

结果有一个非常简单的答案,DatatypeConverter.parseHexBinary(密钥)能够为加密过程创建所需的字节流。不过这次我对所需的导入javax.xml.bind.DatatypeConverter没有任何问题,它无需对Domino8.5.3设计器客户端进行任何配置更改即可访问

public static String encrypt_cbc(String input, String key, String iv){
    byte[] crypted = null;
    try{
         //byte[] key_byte = Hex.decodeHex(key.toCharArray());
         byte[] key_byte = DatatypeConverter.parseHexBinary(key); 
         SecretKeySpec key_spec = new SecretKeySpec(key_byte, "AES");

         //byte[] iv_byte = Hex.decodeHex(iv.toCharArray());
         byte[] iv_byte = DatatypeConverter.parseHexBinary(iv); 
         IvParameterSpec iv_spec = new IvParameterSpec(iv_byte);

         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

         cipher.init(Cipher.ENCRYPT_MODE, key_spec, iv_spec);
         crypted = cipher.doFinal(input.getBytes());

    }catch(Exception e){
         System.out.println(e.toString());
    }
    //String crypted_hex = Hex.encodeHexString(crypted);
    String crypted_hex = DatatypeConverter.printHexBinary(crypted);
    return crypted_hex;
}
然后很容易使用它来构建提交给Netpay的html表单

out.print("<input type=\"hidden\" name=\"username\" value=\"");
out.println(encrypt_cbc(username, key, iv) + "\" />");
out.print(“”);
或者要加密的数据是数字

out.print("<input type=\"hidden\" name=\"amount\" value=\""); 
out.println(encrypt_cbc(orderTotal.toString(), key, iv) + "\" />");
out.print(“”);

我对Java加密的理解仍然相当高,但这并不是非常重要,因为上面的代码工作得很好,并且对于其预期目的来说已经足够快了。

这有帮助吗?或者,您需要下载包含缺少导入的实现的jar,并将其添加到代码中(它是一个代理,您可以在Domino Designer中执行此操作),或者将其添加到服务器的文件系统中。下载链接可以在上面链接的Artjom B页面上找到。你们喜欢向下投票吗?问题非常具体。我需要Hex.decodeHex的替代方法,或者将实现添加到LotusDomino开发人员客户端的方法。请重新考虑你的否决票。安德鲁,我也会否决的。这里有两个问题:a)如何将Java代码和库集成到Domino中,这可能是一个难题,特别是当您开始遇到安全问题时)-这是Richard回答的问题;b)关于加密的问题,只有在解决了a之后才能得到回答(或者可能不再存在)。恐怕你的问题不清楚。我希望你能说出你做了什么,系统的版本,背景信息。