使用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复制它。为此,我们必须在您的代码中进行一些更改:
- 您的expiryDate
20150101 151515
在Java代码中,但20150101151515
在其他地方。所以让我们标准化20150101151515
base64.enprebase64()
不存在。Java 8具有内置的base64编码,并且代码应为base64.getEnprer().enpreToString(data)
- 该类型的返回类型已经是字符串,因此
encryptedValue = new String(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.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模式进行防篡改输入非常愚蠢。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)