3
我正在將iOS項目擴展到Android。我現有的應用程序使用AES加密系統通過PHP與服務器進行通信。在Android上圍繞現有的PHP系統實現AES加密/解密
下面是我使用的PHP端的功能:
加密
function cryptAESEncrypt($string,$key) {
$key = md5($key);
$iv = "123456789"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
$data = $data = base64_encode($string);
$algorythm = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_ECB;
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);
return base64_encode($encrypted);
}
解密
function cryptAESDecrypt($string,$key) {
$key = md5($key);
$iv = "123456789"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
$data = base64_decode($string);
$algorythm = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_ECB;
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);
return base64_decode($decrypted);
}
過程的一般流程是:
- MD5哈希的
$key
(帶來它下降到無論16個字符) - Base64編碼利用128位AES/RIJNDAEL算法在ECB模式(無IV)
- Base64的加密的數據中
$string
- 加密Base64'ed並以字符串形式返回。
解密工作原理相同,但是相反。
現在我只是玩樣品,但似乎沒有多少運氣。我已經使用該函數在PHP中對字符串"test"
進行了加密("test"
也是關鍵 - MD5'ed爲098f6bcd4621d373cade4e832627b4f6
),我給出了"ijzLe/2WgbaP+n3YScQSgQ=="
的輸出。
現在我在Java中嘗試過的方法沒有工作,因爲我得到的密鑰長度錯誤不正確,但之前的代碼片段中有更多的運氣。這是我無論如何:
String key = "test";
String in = "ijzLe/2WgbaP+n3YScQSgQ==";
SecretKeySpec skeySpec = new SecretKeySpec(md5(key).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encryptedByteArray = Base64.decode(in.getBytes(),0);
byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray);
String decryptedData = new String(Base64.decode(decryptedByteArray, 0));
Log.v("NOTE","Data: "+decryptedData);
正如我說的那樣,這是行不通的。現在我的問題是,有沒有人可以幫助我使用所提供的PHP代碼工作,因爲我無法改變它(其他代碼使用不同的PHP代碼片段)。
爲什麼要使用加密可言,如果你不」使用安全加密? – CodesInChaos
請運行Java示例時獲取堆棧跟蹤。另外,請顯示你的'md5'方法。 –
啊!謝謝!這是MD5功能丟失了零給出一個不正確的鍵! – liamnichols