Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java到ruby AES/ECB/PKCS5P添加加密_Java_Ruby_Encryption - Fatal编程技术网

Java到ruby AES/ECB/PKCS5P添加加密

Java到ruby AES/ECB/PKCS5P添加加密,java,ruby,encryption,Java,Ruby,Encryption,我有一个使用第三方支付门户的在线电子商务网站。在第三方支付门户要求所有人开始使用哈希键和其他支付参数之前,支付门户一直工作正常 现在的问题是,第三方支付门户只提供了一页文档来实现哈希键 这是提供的文件:- 加密算法 为了减轻数据传输和过账时的参数调整/修改,商户可以使用Telenor POC提供的散列密钥加密请求。此加密请求与主请求一起发送,然后在OPS端进行协调,以检测参数是否更改。可以使用以下算法进行加密: 创建属于请求的所有字段的映射 映射字段=新的HashMap() 字段。卖出(“金额”

我有一个使用第三方支付门户的在线电子商务网站。在第三方支付门户要求所有人开始使用哈希键和其他支付参数之前,支付门户一直工作正常

现在的问题是,第三方支付门户只提供了一页文档来实现哈希键

这是提供的文件:-

加密算法

为了减轻数据传输和过账时的参数调整/修改,商户可以使用Telenor POC提供的散列密钥加密请求。此加密请求与主请求一起发送,然后在OPS端进行协调,以检测参数是否更改。可以使用以下算法进行加密:

  • 创建属于请求的所有字段的映射 映射字段=新的HashMap()

    字段。卖出(“金额”、“10”)

    字段。put(“存储ID”、“28”)

    字段。put(“orderefnum”、“11001”)

    字段。put(“到期日”、“20150101 151515”)

    fields.put(“postBackURL”,”)

  • 从第一步中创建的映射中获取字段名列表

    List fieldNames=newarraylist(fields.keySet())

  • 根据地图键按字母顺序对地图字段进行排序

    Collections.sort(字段名)

  • 创建以下格式的字符串: 金额=10,到期日=201501011515,订单参考编号=11001,回邮URL=

  • 使用AES/ECB/PKCS5Padding算法对上一步生成的密钥和字符串进行加密

    Cipher Cipher=Cipher.getInstance(“AES/ECB/PKCS5Padding”)

    SecretKeySpec secretKey=新的SecretKeySpec(key.getBytes(),“AES”)

    cipher.init(cipher.ENCRYPT_模式,secretKey)

    encryptedValue=new 字符串(Base64.encodeBase64(cipher.doFinal(value.getBytes()))

  • 另一个问题是我没有Java方面的经验

    我打电话给第三方支付门户帮助热线,他们只是告诉我钥匙

    如果有人能帮助我,告诉我什么是步骤5的Ruby等价物,我将不胜感激。谢谢

    刚刚在联机java编译器上尝试了提供的代码:-

    import java.security.Key;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.Base64;
    
    public class encryptData {
      public static void main(String[] args) {
    
        String data="amount=10&expiryDate=20150101 151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28";
        String key="89OUITUPRL3I8H3G";
    
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
      }
    }
    
    这就是错误:-

    /tmp/java_Ramvov/encryptData.java:16:错误:找不到符号

    encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
    ^
    
    encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
                                      ^
    
    符号:变量encryptedValue

    位置:类加密数据

    /tmp/java_Ramvov/encryptData.java:16:错误:找不到符号

    encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
    ^
    
    encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
                                      ^
    
    符号:方法encodeBase64(字节[])

    地点:Base64类

    2个错误

    任何帮助都将不胜感激

    我还尝试在ruby中重现这段java代码:-

    data = "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28"                                                                                                                                            
    cipher = OpenSSL::Cipher.new("AES-128-ECB")
    cipher.encrypt()
    cipher.key = "89OUITUPRL4I9H3G"
    crypt = cipher.update(data) + cipher.final()
    crypt_string = (Base64.encode64(crypt))
    

    但是生成的加密被支付门户拒绝,使用ECB模式进行防篡改输入是非常愚蠢的

    话虽如此,但知道这不是你的错,因为这不是你的想法,你只是想让代码发挥作用,让我们请一个独立方给我们一个参考点:

    echo -n "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28" | openssl enc -K 38394f5549545550524c334938483347 -aes-128-ecb -base64
    
    请注意,openssl将密钥作为十六进制字符串,因此
    89OUITUPRL4I9H3G
    应作为其ASCII序列写入
    38394f554945550524c3349384347

    输出为:

    r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCtVXeH
    FBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXmaakr4klz
    1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=
    
    让我们尝试在Java中复制它。为此,我们必须更改代码中的一些内容:

  • 您的expiryDate在Java代码中是
    20150101 151515
    ,但在其他地方是
    201501011515
    。因此,让我们标准化
    201501011515
  • Base64.encodeBase64()
    不存在。Java8内置了Base64编码,代码应该是
    Base64.getEncoder().encodeToString(数据)
  • 它的返回类型已经是字符串,因此不需要
    encryptedValue=newstring(Base64…
  • 此外,您需要先声明
    encryptedValue
    的类型,然后才能使用它
  • 所有这些都在Java 8中编译:

    import java.security.Key;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.Base64;
    
    public class encryptData {
      public static void main(String[] args) throws Exception {
    
        String data="amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28";
        String key="89OUITUPRL3I8H3G";
    
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    
        byte[] plaintext = data.getBytes();
        byte[] ciphertext = cipher.doFinal(plaintext);
        String encryptedValue = Base64.getEncoder().encodeToString(ciphertext);
    
        System.out.println(encryptedValue);
      }
    }
    
    和打印(我添加的换行符):

    好的,到目前为止。鲁比呢

    #!/usr/bin/ruby
    
    require 'openssl'
    require 'base64'
    
    data = "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28"
    
    key = "89OUITUPRL4I9H3G"
    cipher = OpenSSL::Cipher.new("AES-128-ECB")
    cipher.encrypt()
    cipher.key = key
    crypt = cipher.update(data) + cipher.final
    
    crypt_string = (Base64.encode64(crypt))
    puts crypt_string
    
    这张照片是:

    mp8WVhyUHFDqvJKaRXbYKbZT1920TNboRpFLUdPaYsWTkiQ2fhN/tCL6wvtI
    B9/Mu08McaKTVIWYeQAfVR5XcUKdeQ+CBcJJRs5krLBjtjiMNlBUq9JpCUaC
    0eclfDMaGTE+Z4XSafjPictWzTG/Ye+vkJWC23yxW1zSjBnYBfg=
    
    为什么ruby代码不起作用?我怀疑ruby需要与openssl相同的密钥,因为ruby crypto通常在后台使用openssl。因此,将密钥定义更改为

    key = "38394f5549545550524c334938483347"
    key = [key].pack('H*')
    
    现在打印:

    r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCt
    VXeHFBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXm
    aakr4klz1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=
    
    除了换行符位置之外,它与其他两个的输出相同。希望您能够正确地与对方沟通,并记住:


    使用ECB模式进行防篡改输入是非常愚蠢的

    使用ECB模式进行防篡改输入是非常愚蠢的

    话虽如此,但知道这不是你的错,因为这不是你的想法,你只是想让代码发挥作用,让我们请一个独立方给我们一个参考点:

    echo -n "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28" | openssl enc -K 38394f5549545550524c334938483347 -aes-128-ecb -base64
    
    请注意,openssl将密钥作为十六进制字符串,因此
    89OUITUPRL4I9H3G
    应作为其ASCII序列写入
    38394f554945550524c3349384347

    输出为:

    r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCtVXeH
    FBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXmaakr4klz
    1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=
    
    让我们尝试在Java中复制它。为此,我们必须更改代码中的一些内容:

  • 您的expiryDate在Java代码中是
    20150101 151515
    ,但在其他地方是
    201501011515
    。因此,让我们标准化
    201501011515
  • Base64.encodeBase64()
    不存在。Java8内置了Base64编码,代码应该是
    Base64.getEncoder().encodeToString(数据)
  • 它的返回类型已经是字符串,因此不需要
    encryptedValue=newstring(Base64…
  • 此外,您需要先声明
    encryptedValue
    的类型,然后才能使用它
  • 所有这些都在Java 8中编译:

    import java.security.Key;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.Base64;
    
    public class encryptData {
      public static void main(String[] args) throws Exception {
    
        String data="amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28";
        String key="89OUITUPRL3I8H3G";
    
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    
        byte[] plaintext = data.getBytes();
        byte[] ciphertext = cipher.doFinal(plaintext);
        String encryptedValue = Base64.getEncoder().encodeToString(ciphertext);
    
        System.out.println(encryptedValue);
      }
    }
    
    和打印(我添加的换行符):

    好的,到目前为止。鲁比呢

    #!/usr/bin/ruby
    
    require 'openssl'
    require 'base64'
    
    data = "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28"
    
    key = "89OUITUPRL4I9H3G"
    cipher = OpenSSL::Cipher.new("AES-128-ECB")
    cipher.encrypt()
    cipher.key = key
    crypt = cipher.update(data) + cipher.final
    
    crypt_string = (Base64.encode64(crypt))
    puts crypt_string
    
    这张照片是:

    mp8WVhyUHFDqvJKaRXbYKbZT1920TNboRpFLUdPaYsWTkiQ2fhN/tCL6wvtI
    B9/Mu08McaKTVIWYeQAfVR5XcUKdeQ+CBcJJRs5krLBjtjiMNlBUq9JpCUaC
    0eclfDMaGTE+Z4XSafjPictWzTG/Ye+vkJWC23yxW1zSjBnYBfg=
    
    为什么ruby代码不起作用?我猜ruby想