我正在将 iOS 项目扩展到 Android。我现有的应用程序使用 AES 加密系统通过 PHP 与服务器通信。
以下是我在 PHP 端使用的函数:
加密
function cryptAESEncrypt($string,$key) {
$key = md5($key);
$iv = "1234567890123436"; //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 = "1234567890123436"; //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 编码
$string
- 在 ECB 模式下使用 128 位 AES/RIJNDAEL 加密 Base64(无 IV)
- Base64 加密数据并将其作为字符串返回。
解密工作相同但相反。
现在我只是在玩样品,但似乎运气不佳。我已经"test"
使用该函数加密了 PHP 中的字符串("test"
也是密钥 - MD5'ed to 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);
就像我说的那样,那是行不通的。现在我的问题是,有没有人可以帮助我使我的 Java 代码与提供的 PHP 代码一起工作,因为我无法改变它(其他代码使用不同的 PHP 片段工作)。