Java到ruby的AESECBPKCS5Padding加密

Java到ruby的AESECBPKCS5Padding加密,第1张

Java到ruby的AES / ECB / PKCS5Padding加密

使用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序列写入
38394f5549545550524c334938483347

输出为:

r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCtVXeHFBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXmaakr4klz1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=

让我们尝试用Java复制它。为此,我们必须在您的代码中进行一些更改:

  1. 您的expiryDate
    20150101 151515
    在Java代码中,但
    20150101151515
    在其他地方。所以让我们标准化
    20150101151515
  2. base64.enprebase64()
    不存在。Java 8具有内置的base64编码,并且代码应为
    base64.getEnprer().enpreToString(data)
  3. 该类型的返回类型已经是字符串,因此
    encryptedValue = new String(base64...)
    是不必要的。
  4. 此外,您需要先声明的类型,
    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.getEnprer().enpreToString(ciphertext);    System.out.println(encryptedValue);  }}

和打印(我添加的换行符):

r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCtVXeHFBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXmaakr4klz1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=

好的,到目前为止。红宝石呢?

#!/usr/bin/rubyrequire '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 = keycrypt = cipher.update(data) + cipher.finalcrypt_string = (base64.enpre64(crypt))puts crypt_string

打印:

mp8WVhyUHFDqvJKaRXbYKbZT1920TNboRpFLUdPaYsWTkiQ2fhN/tCL6wvtIB9/Mu08McaKTVIWYeQAfVR5XcUKdeQ+CBcJJRs5krLBjtjiMNlBUq9JpCUaC0eclfDMaGTE+Z4XSafjPictWzTG/Ye+vkJWC23yxW1zSjBnYBfg=

为什么红宝石代码不起作用?好吧,我怀疑ruby与openssl一样需要密钥,因为ruby加密通常在幕后使用openssl。因此将键定义更改为

key = "38394f5549545550524c334938483347"key = [key].pack('H*')

现在打印:

r7N11xE4HdbJyTByiTDifI1vifvZyNcNfKF+Jo7jEq4rN7c3EiOJxdWOUlCtVXeHFBTdPSROSmTkUTWfAuOQnHWqe/q/Msd1ykUDIz9eP5L6X6RI0R5UtUXmaakr4klz1kxEJOjR/WJ5xgd2clBh4iLcYi3caDrCkbD0kRDLQE4=

除了换行符位置,它与其他两个输出相同。希望您能够与另一边进行交流,并记住:

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存