[英]AES-128 Encryption with Base64 Encoding doesn't act the same in Java and PHP with longer strings
我一直在嘗試使加密/解密在Java(Android)和PHP中工作相同,並為客戶端/服務器通信產生相同的結果。
我正在使用下面的代碼進行加密,但是我不知道這是怎么回事。 使用相同的密鑰和較小的字符串運行會產生相同的加密值,但是使用較長的字符串,則會得到兩個不同的結果。 PHP:
$str = 'test1234test1234';
$key = 'TESTKEYTESTKEY12';
$block = mcrypt_get_block_size('des', 'ecb');
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB));
並在Java中(在Android上):
public static String encryptTest() {
String cleartext = "test1234test1234";
String key = "TESTKEYTESTKEY12";
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted;
encrypted = cipher.doFinal(cleartext.getBytes());
return new String(Base64.encode(encrypted,Base64.DEFAULT));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
在兩個實現中,使用String test1234
運行test1234
得到: 8i4KEe82TQl0Zdlc14fwAg==
。 使用字符串test1234test1234
但是使用PHP獲得4s5a0edsvwWt/3/enRe0wgJQD/0zL45NRb/r3p6L/Is=
,使用Java獲得4s5a0edsvwWt/3/enRe0wgA0jk78zwWJr1xsosZbYUA=
。 我不確定哪里出了問題,而且我對密碼學的知識還不夠。
Java代碼的主要問題是您未指定密碼模式和使用的填充算法。 因此,使用哪種加密方式和填充算法取決於所使用的加密提供程序,並且在此特定細節中,Android的工作方式不同於J2SE。
如果我在J2SE上執行Java代碼,則得到的結果與PHP相同。 如果我更改代碼以使用Cipher.getInstance("AES/ECB/PKCS5Padding");
這不會改變Cipher.getInstance("AES/ECB/PKCS5Padding");
。
由於只有密文的最后一塊更改,因此我假設Android默認情況下使用其他填充算法。
您對長字符串和短字符串有不同的結果,這表明您在每個實現上使用不同的填充 。
確保在Java和php實現上使用相同類型的填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.