Java到ruby AES/ECB/PKCS5P添加加密
我有一个使用第三方支付门户的在线电子商务网站。在第三方支付门户要求所有人开始使用哈希键和其他支付参数之前,支付门户一直工作正常 现在的问题是,第三方支付门户只提供了一页文档来实现哈希键 这是提供的文件:- 加密算法 为了减轻数据传输和过账时的参数调整/修改,商户可以使用Telenor POC提供的散列密钥加密请求。此加密请求与主请求一起发送,然后在OPS端进行协调,以检测参数是否更改。可以使用以下算法进行加密:Java到ruby AES/ECB/PKCS5P添加加密,java,ruby,encryption,Java,Ruby,Encryption,我有一个使用第三方支付门户的在线电子商务网站。在第三方支付门户要求所有人开始使用哈希键和其他支付参数之前,支付门户一直工作正常 现在的问题是,第三方支付门户只提供了一页文档来实现哈希键 这是提供的文件:- 加密算法 为了减轻数据传输和过账时的参数调整/修改,商户可以使用Telenor POC提供的散列密钥加密请求。此加密请求与主请求一起发送,然后在OPS端进行协调,以检测参数是否更改。可以使用以下算法进行加密: 创建属于请求的所有字段的映射 映射字段=新的HashMap() 字段。卖出(“金额”
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中复制它。为此,我们必须更改代码中的一些内容:
20150101 151515
,但在其他地方是201501011515
。因此,让我们标准化201501011515
Base64.encodeBase64()
不存在。Java8内置了Base64编码,代码应该是Base64.getEncoder().encodeToString(数据)
encryptedValue=newstring(Base64…
)encryptedValue
的类型,然后才能使用它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中复制它。为此,我们必须更改代码中的一些内容:
20150101 151515
,但在其他地方是201501011515
。因此,让我们标准化201501011515
Base64.encodeBase64()
不存在。Java8内置了Base64编码,代码应该是Base64.getEncoder().encodeToString(数据)
encryptedValue=newstring(Base64…
)encryptedValue
的类型,然后才能使用它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想