【问题标题】:PHP + Android XML Encryption/DecryptionPHP + Android XML 加密/解密
【发布时间】:2014-01-22 15:00:43
【问题描述】:

我有一个应用程序正在下载一个 xml 并将其解析到一个 sql 数据库中。我的问题是,一旦部署了应用程序,来自 xml 的数据很容易被抓取,其他人可以将我来之不易的数据用于他们自己的邪恶目的/应用程序。基本上我需要使用 php 加密 xml,然后使用 android 解密它。我见过几个易于加密的 php 类,但我不完全确定哪种加密方法与 android 兼容。

解决后编辑:

起初我以为出于某种原因我不得不忽略括号,并打算遍历所有文本并吐出格式化的 xml 大声笑。比这简单得多。

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

【问题讨论】:

    标签: java php android encryption


    【解决方案1】:

    以下代码可能对您有所帮助。使用它你可以加密/解密 PHP 和 Android 之间的字符串。

    Java 部分:

    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部分:

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

    用法(Java):

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

    用法(PHP):

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

    【讨论】:

    • 那么要使用它,我将遍历所有标签和值,然后加密/解密它们?
    • 我回答了我自己的问题。我不知道我在 0.o 的所有搜索中怎么没有遇到那个 sn-p。这非常有效。非常感谢:)
    • @SabinJose 答案中的链接已失效。
    • @SabinJose 你知道这个 c# 算法的完全等价物吗?
    • @Sabin Jose 你能告诉我如何将上面的 Mcrypt 转换为 cordova 插件吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2011-10-13
    • 2012-05-15
    • 2018-01-20
    相关资源
    最近更新 更多