2
在iOS上使用的代码罚款,并试图将代码转换为Android我们有以下但似乎有填充问题,任何人都可以提供一个手。Android和PHP加密/解密 - 填充问题
使用MD5关键
的Java(Android版)
public class AES256Cipher {
public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
public static String AES_Encode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] textBytes = str.getBytes("UTF-8");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return Base64.encodeToString(cipher.doFinal(textBytes), 0);
}
public static String AES_Decode(String str, String key) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] textBytes =Base64.decode(str,0);
//byte[] textBytes = str.getBytes("UTF-8");
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(textBytes), "UTF-8");
}
}
PHP
<?php
function encrypt ($key, $value)
{
$padSize = 16 - (strlen ($value) % 16) ;
$value = $value . str_repeat (chr ($padSize), $padSize) ;
$output = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, str_repeat(chr(0),16)) ;
return base64_encode ($output) ;
}
function decrypt ($key, $value)
{
$value = base64_decode ($value) ;
$output = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, str_repeat(chr(0),16)) ;
$valueLen = strlen ($output) ;
if ($valueLen % 16 > 0)
$output = "";
$padSize = ord ($output{$valueLen - 1}) ;
if (($padSize < 1) or ($padSize > 16))
$output = ""; // Check padding.
for ($i = 0; $i < $padSize; $i++)
{
if (ord ($output{$valueLen - $i - 1}) != $padSize)
$output = "";
}
$output = substr ($output, 0, $valueLen - $padSize) ;
return $output;
}
?>
在Java方面的输出。然而当代码发送到工作正常PHP你得到一个剩余的输出,这让我们认为它是一个填充问题,任何帮助都会很棒。
我不明白为什么$输出被重置('$输出=“”;')在多种情况下?!? –
这是填充失败的地方 – okett