PHP + Android XML加密/解密 [英] PHP + Android XML Encryption/Decryption

查看:133
本文介绍了PHP + Android XML加密/解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序正在下载和解析一个xml到一个sql数据库。我的问题是,一旦应用程序部署后,xml的数据可能很容易被刮除,而其他人可以使用我的辛苦赚来的数据来为自己的恶魔目的/应用程序。基本上我需要使用php加密xml,然后使用android解密它。我看过几个php类,使它很容易加密,但我不完全确定什么方法加密将与android兼容。



解决之后编辑



起初我以为我不得不忽略括号由于某种原因,将要遍历所有的文本并吐出格式化的xml哈哈。比这更简单。

  $ mcrypt = new MCrypt(); 
$ datainxml = file_get_contents(data.xml);
$ cipher = $ mcrypt-> encrypt($ value);
echo $ cipher;


解决方案

以下代码可能会帮助您。使用它可以在PHP和Android之间加密/解密字符串。



Java部分:

 code> import java.security.NoSuchAlgorithmException; 

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class MCrypt {

private String iv =fedcba9876543210; // Dummy iv(CHANGE IT!)
private IvParameterSpec ivspec;
private SecretKeySpec keyspec;
私密密码;

private String SecretKey =0123456789abcdef; // Dummy secretKey(CHANGE IT!)

public MCrypt()
{
ivspec = new IvParameterSpec (iv.getBytes());

keyspec = new SecretKeySpec(SecretKey.getBytes(),AES);

try {
cipher = Cipher.getInstance(AES / CBC / NoPadding);
} catch(NoSuchAlgorithmException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(NoSuchPaddingException e){
// TODO自动生成的catch块
e.printStackTrace();
}
}

public byte [] encrypt(String text)throws异常
{
if(text == null || text.length )== 0)
抛出新异常(空字符串);

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());
}

返回加密;
}

public byte [] decrypt(String code)throws异常
{
if(code == null || code.length()== 0)
抛出新的异常(空字符串);

byte [] decryptpted = null;

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

decryptpted = cipher.doFinal(hexToBytes(code));
} catch(Exception e)
{
throw new Exception([decrypt]+ e.getMessage());
}
返回解密;
}



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

int len = data.length;
String str =; (int i = 0; i if((data [i]& 0xFF))16
str = str +0+ java .lang.Integer.toHexString(数据[1] - 安培;为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]; (int i = 0; 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; (int i = 0; i< padLength; i ++)


{
source + = paddingChar;
}

返回源;
}
}

PHP部分:

 <?php 

class MCrypt
{
private $ iv ='fedcba9876543210'; #如JAVA
private $ key ='0123456789abcdef'; #如JAVA


函数__construct()
{
}

函数加密($ 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);

返回bin2hex($ encrypted);
}

函数解密($ 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);
$ decryptpted = mdecrypt_generic($ td,$ code);

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

return utf8_encode(trim($ decryptpted));
}

保护函数hex2bin($ hexdata){
$ bindata =''; ($ i = 0; $ i< strlen($ hexdata); $ i + = 2){
$ bindata。= chr(hexdec(substr($ hexdata,$ i,2)));
}

return $ bindata;
}

}

用法(Java) p>

  mcrypt = new MCrypt(); 
/ *加密* /
加密字符串= MCrypt.bytesToHex(mcrypt.encrypt(Text to Encrypt));
/ *解密* /
String decryptpted = new String(mcrypt.decrypt(encrypted));

使用(PHP):

  $ mcrypt = new MCrypt(); 
#Encrypt
$ encrypted = $ mcrypt-> encrypt(Text to encrypt);
#Decrypt
$ decryptpted = $ mcrypt-> decrypt($ encrypted);


I have an app that is downloading and parsing an xml into an sql database. My problem is that the data from the xml once the app is deployed could easily be scraped and other people could use my hard earned data for their own evil purposes/apps. Basically I need to encrypt the xml using php, and then decrypt it using android. I've seen a couple of php classes that make it easy to encrypt but I'm not entirely sure what method to encrypt would be compatible with android.

Edit after solution:

At first I thought I had to ignore brackets for some reason and was going to iterate through all the text and spit out formatted xml lol. Much simpler than that.

$mcrypt = new MCrypt();
$datainxml = file_get_contents("data.xml");
$cipher = $mcrypt->encrypt($value);
echo $cipher;

解决方案

The following code might help you. Using this you can encrypt/decrypt strings between PHP and Android.

Java Part:

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class MCrypt {

    private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
    private IvParameterSpec ivspec;
    private SecretKeySpec keyspec;
    private Cipher cipher;

    private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)

    public MCrypt()
    {
        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;
    }
}

PHP Part:

<?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;
    }

}

Usage (Java):

mcrypt = new MCrypt();
/* Encrypt */
String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("Text to Encrypt") );
/* Decrypt */
String decrypted = new String( mcrypt.decrypt( encrypted ) );

Usage (PHP):

$mcrypt = new MCrypt();
#Encrypt
$encrypted = $mcrypt->encrypt("Text to encrypt");
#Decrypt
$decrypted = $mcrypt->decrypt($encrypted);

这篇关于PHP + Android XML加密/解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆