PHP + Android XML Encryption/Decryption

后端 未结 1 1679
伪装坚强ぢ
伪装坚强ぢ 2020-12-29 00:28

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 othe

相关标签:
1条回答
  • 2020-12-29 00:54

    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);
    
    0 讨论(0)
提交回复
热议问题