我想在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;
}
}
请有人帮助我
感谢