使用aes在android中加密解密文件

时间:2018-02-11 08:27:08

标签: php android encryption android-volley aes

我想在PHP中加密一个zip文件并在android中解密它 PHP脚本工作很好,但android解密无法正常工作 我也在齐射 这是我的PHP脚本:

include 'MCrypt.php';
$base = base64_encode(file_get_contents('mojudati-be-nameh-az-ma-
behtaran.zip'));
$mcrypt = new MCrypt();
$encrypted = $mcrypt->encrypt($base);
echo $encrypted;

这是MCrypt课程:

<?php 
class MCrypt{
private $iv = 'fedcba9876543210'; #Same as in JAVA
private $key = '0123456789abcdef'; #Same as in JAVA
function __construct(){
}
function encrypt($str) {
//$key = $this->hex2bin($key);    
$iv = $this->iv;
$td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);
mcrypt_generic_init($td, $this->key, $iv);
$encrypted = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return bin2hex($encrypted);
}
function decrypt($code) {
//$key = $this->hex2bin($key);
$code = $this->hex2bin($code);
$iv = $this->iv;

$td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);

mcrypt_generic_init($td, $this->key, $iv);
$decrypted = mdecrypt_generic($td, $code);

mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return utf8_encode(trim($decrypted));
}

protected function hex2bin($hexdata) {
$bindata = '';

for ($i = 0; $i < strlen($hexdata); $i += 2) {
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}
}
?>

这是MainActivity.java

公共类MainActivity扩展了AppCompatActivity {

private static final boolean IS_CHUNKED = true;
private RequestQueue queue;
ProgressDialog progressDialog;
AES aes;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    queue = Volley.newRequestQueue(this);

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            download();
            progressDialog = ProgressDialog.show(MainActivity.this , "" ,"");
        }
    });
}

private void download() {
    StringRequest request = new StringRequest(Request.Method.GET, "http://192.168.43.214/crypt/c.php",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    Log.i("res", "onResponse: "+ response);
                    try {
                        aes = new AES();
                        File dir = getExternalFilesDir("dec");
                        File file = new File(dir , "dec.zip");
                        String dec = new String(Base64.decode(aes.decrypt(response) , Base64.DEFAULT));
                        writeToFile(file , dec.getBytes());
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, "ddd", Toast.LENGTH_SHORT).show();
                    }catch (Exception e){
                        progressDialog.dismiss();
                        Log.i("catch", "onResponse: " + e.getMessage());
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.i("error", "onErrorResponse: " + error.toString());
                }
            }
    );
    queue.add(request);
}

private void writeToFile(File file , byte[] data){
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
        fos.write(data);
        Toast.makeText(MainActivity.this, "download", Toast.LENGTH_SHORT).show();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally
    {
        if (fos != null){
            try {
                Log.i("size", "writeToFile: " + fos.getChannel().size());
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
}

最后,这是AES类:

       class AES {
    private String iv = "fedcba9876543210";
    private IvParameterSpec ivspec;
private SecretKeySpec keyspec;
private Cipher cipher;

private String SecretKey = "0123456789abcdef";

public AES() {
    ivspec = new IvParameterSpec(iv.getBytes());
    keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");

    try {
        cipher = Cipher.getInstance("AES/CBC/NoPadding");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public byte[] encrypt(String text) throws Exception
{
    if(text == null || text.length() == 0)
        throw new Exception("Empty string");

    byte[] encrypted = null;

    try {
        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

        encrypted = cipher.doFinal(padString(text).getBytes());
    } catch (Exception e)
    {
        throw new Exception("[encrypt] " + e.getMessage());
    }

    return encrypted;
}

public byte[] decrypt(String code) throws Exception
{
    if(code == null || code.length() == 0)
        throw new Exception("Empty string");

    byte[] decrypted = null;

    try {
        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

        decrypted = cipher.doFinal(hexToBytes(code));
    } catch (Exception e)
    {
        throw new Exception("[decrypt] " + e.getMessage());
    }
    return decrypted;
}

public static String bytesToHex(byte[] data)
{
    if (data==null)
    {
        return null;
    }

    int len = data.length;
    String str = "";
    for (int i=0; i<len; i++) {
        if ((data[i]&0xFF)<16)
            str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);
        else
            str = str + java.lang.Integer.toHexString(data[i]&0xFF);
    }
    return str;
}

public static byte[] hexToBytes(String str) {
    if (str==null) {
        return null;
    } else if (str.length() < 2) {
        return null;
    } else {
        int len = str.length() / 2;
        byte[] buffer = new byte[len];
        for (int i=0; i<len; i++) {
            buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);
        }
        return buffer;
    }
}

private static String padString(String source)
{
    char paddingChar = ' ';
    int size = 16;
    int x = source.length() % size;
    int padLength = size - x;

    for (int i = 0; i < padLength; i++)
    {
        source += paddingChar;
    }
    return source;
}
}
请有人帮助我 感谢

0 个答案:

没有答案