我使用AES-128/ecb/PKCS5Padding + base64來隱藏數據時遇到問題。我使用下面的代碼來加密我的數據:在Java中使用AES-128加密
String input = "{\"action\":\"getQuestion\"}";
String key = "4288f0b8060ca1b682bf795f2617cfdc";
byte[] data = input.getBytes();
byte[] encrypted = null;
byte[] keyBytes = new BigInteger(key, 16).toByteArray();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
encrypted = cipher.doFinal(data);
System.out.println(Base64.encodeBytes(encrypted));
我收到加密後6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk=
但我不能使用PHP函數在服務器上解密。
當我使用PHP函數這個數據加密:
function encrypt($encrypt, $key=null)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $encrypt, MCRYPT_MODE_ECB, $iv));
return $encrypted;
}
我收到6Wc3LPWvfJ7T86iG0igmdQaeZ8xs9qY419mAVWfNH+M=
,我可以使用下面的PHP函數做成功解密:
function decrypt($decrypt, $key=null)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);
return $decrypted;
}
使用Base64加密和解密有沒有問題;我只在使用AES-128進行加密時遇到此問題。
的$ IV值你可能不使用兩個相同的密鑰兩側。發佈所有填充'$ key'的PHP代碼,包括當前發佈代碼中常量的聲明。 –
不,我使用相同的密鑰 – silentnuke
有幾件事情:1)刪除IV,我不知道它會對PHP函數做什麼,但如果它做了什麼,它會弄糟加密/解密2)從不使用String.getBytes()而不指定要使用的編碼3)根據密鑰值,BigInteger.toByteArray()可能返回1到17個字節的任何內容4)ECB絕對是這種加密的錯誤類型。在嘗試其他事情之前修復這些問題我認爲你可以安全地使用ASCII與PHP通信和使用代碼<128的字符。 –