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

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

问题描述

我有一个应用程序被下载和解析XML到SQL数据库。我的问题是,从XML一旦应用程序的数据部署可以很容易地被刮了,别人可以用我辛苦赚来的数据为自己的邪恶目的/应用程序。基本上,我需要使用PHP的XML加密,然后使用Android的解密。我见过一对夫妇的PHP类,可以很容易地加密,但我不是很确定用什么方法来加密将与Android兼容。

解决方案后编辑:

起初,我以为我已经忽略括号出于某种原因,并会遍历所有的文本,并吐出格式化XML笑。很多简单得多。

  $的mcrypt =新的mcrypt();
$ datainxml =的file_get_contents(data.xml中);
$密码= $ mcrypt->加密($值);
回声$的密码;
 

解决方案

以下code初步形成的此处可能会帮助你。使用此您可以加密/解密PHP和Android之间的字符串。

Java的部分:

 进口java.security.NoSuchAlgorithmException;

进口javax.crypto.Cipher中;
进口javax.crypto.NoSuchPaddingException;
进口javax.crypto.spec.IvParameterSpec;
进口javax.crypto.spec.SecretKeySpec;

公共类的mcrypt {

    私人字符串IV =fedcba9876543210; //虚拟IV(改变它!)
    私人IvParameterSpec ivspec;
    私人SecretKeySpec keyspec;
    私人密码的密码;

    私人字符串SecretKey的=0123456789ABCDEF; //虚拟SecretKey的(改变它!)

    公共mcrypt的()
    {
        ivspec =新IvParameterSpec(iv.getBytes());

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

        尝试 {
            密码= Cipher.getInstance(AES / CBC / NoPadding);
        }赶上(抛出:NoSuchAlgorithmException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }赶上(NoSuchPaddingException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
    }

    公共byte []的加密(字符串文本)抛出异常
    {
        如果(文字== NULL || text.length()== 0)
            抛出新的异常(空字符串);

        byte []的加密= NULL;

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

            加密= cipher.doFinal(padString(文本).getBytes());
        }赶上(例外五)
        {
            抛出新的异常([加密]+ e.getMessage());
        }

        返回加密;
    }

    公共字节[]解密(字符串code)抛出异常
    {
        如果(code == NULL || code.length()== 0)
            抛出新的异常(空字符串);

        byte []的解密= NULL;

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

            解密= cipher.doFinal(hexToBytes(code));
        }赶上(例外五)
        {
            抛出新的异常([解密]+ e.getMessage());
        }
        返回解密;
    }



    公共静态字符串bytesToHex(byte []的数据)
    {
        如果(数据== NULL)
        {
            返回null;
        }

        INT LEN = data.length;
        字符串str =;
        的for(int i = 0; I< LEN;我++){
            如果((数据[1]  - 安培;为0xFF)< 16)
                海峡= STR +0+ java.lang.Integer.toHexString(数据[1]  - 安培; 0xFF的);
            其他
                海峡= STR + java.lang.Integer.toHexString(数据[1]  - 安培; 0xFF的);
        }
        返回海峡;
    }


    公共静态的byte [] hexToBytes(字符串str){
        如果(STR == NULL){
            返回null;
        }否则如果(str.length()2){
            返回null;
        } 其他 {
            INT的len = str.length()/ 2;
            byte []的缓冲区=新的字节[长度];
            的for(int i = 0; I< LEN;我++){
                缓冲液[I] =(字节)的Integer.parseInt(str.substring(I * 2,I * 2 + 2),16);
            }
            返回缓冲区;
        }
    }



    私有静态字符串padString(字符串源)
    {
      焦炭paddingChar ='';
      INT大小= 16;
      INT X = source.length()%的大小;
      INT padLength =大小 -  X;

      的for(int i = 0; I< padLength;我++)
      {
          源+ = paddingChar;
      }

      返回源;
    }
}
 

PHP部分:

 < PHP

一流的mcrypt
{
    私人$ IV ='fedcba9876543210'; #Same在JAVA
    私人$键='0123456789ABCDEF'; #Same在JAVA


    功能__construct()
    {
    }

    函数加密($海峡){

      // $键= $这个 - > HEX2BIN($键);
      $ IV = $这个 - > 4;

      $ TD = mcrypt_module_open('Rijndael算法-128','','CBC',$ IV);

      mcrypt_generic_init($ TD,$这个 - >的关键,$ IV);
      $加密= mcrypt_generic($ TD,$海峡);

      mcrypt_generic_deinit($ TD);
      mcrypt_module_close($ TD);

      返回BIN2HEX($加密);
    }

    功能解密($code){
      // $键= $这个 - > HEX2BIN($键);
      $code = $这个 - > HEX2BIN($code);
      $ IV = $这个 - > 4;

      $ TD = mcrypt_module_open('Rijndael算法-128','','CBC',$ IV);

      mcrypt_generic_init($ TD,$这个 - >的关键,$ IV);
      $解密= mdecrypt_generic($ TD,$code);

      mcrypt_generic_deinit($ TD);
      mcrypt_module_close($ TD);

      返回utf8_en code(修剪($解密));
    }

    保护功能HEX2BIN($ hexdata){
      $ bindata ='';

      为($ i = 0; $ I< strlen的($ hexdata); $ I + = 2){
        。$ bindata = CHR(hexdec(SUBSTR($ hexdata,$ 1,2)));
      }

      返回$ bindata;
    }

}
 

使用(JAVA):

 的mcrypt =新的mcrypt();
/* 加密 */
字符串加密= MCrypt.bytesToHex(mcrypt.encrypt(文本加密));
/ *解密* /
字符串解密=新的String(mcrypt.decrypt(加密));
 

使用(PHP):

  $的mcrypt =新的mcrypt();
#加密
$加密= $ mcrypt->加密(文本加密);
#Decrypt
$解密= $ mcrypt->解密($加密);
 

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 taken form here 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天全站免登陆