Cryptography in PHP + Android



HOW TO USE IT (JAVA):



mcrypt = new MCrypt();

/*** encrypt */
String encrypted = MCrypt.bytesToHex(mcrypt.encrypt("plaintext"));

/*** decrypt */
String decrypted = new String(mcrypt.decrypt(encrypted));


HOW TO USE IT (PHP):




$mcrypt = new MCrypt();

#Encrypt
$encrypted = $mcrypt->encrypt("plaintext");

#Decrypt
$decrypted = $mcrypt->decrypt($encrypted);


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


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

}

================================================

The modes of operation currently available are: 

OFB
CBC
CFB
CTR

SOAP-ERROR: Parsing WSDL: Couldn't load from

For some versions of php, the SoapClient does not send http user agent information. What php versions do you have on the server vs your local WAMP?
Try to set the user agent explicitly, using a context stream as follows:
try{

    $opts = array(
        'http'=>array(
            'user_agent' => 'PHPSoapClient'
            )
        );

    $context = stream_context_create($opts);
    $client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl',
                             array('stream_context' => $context,
                                   'cache_wsdl' => WSDL_CACHE_NONE));

    $result = $client->checkVat(array(
                                    'countryCode' => 'DK',
                                    'vatNumber' => '47458714'
                                    ));
    print_r($result);
}
catch(Exception $e){
    echo $e->getMessage();
}

if  still not work check below Conditions


The combination of HTTP over IPv6, and missing HTTP User Agent string, seems to give the web service problems.

To verify this, try the following on your linux host:
curl  -A ''  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
this IPv6 request fails.
curl  -A 'cURL User Agent'  -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
this IPv6 request succeeds.
curl  -A ''  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl  -A 'cURL User Agent'  -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
both these IPv4 request succeeds.
Interesting case :) I guess your linux host resolves ec.europa.eu to its IPv6 address, and that your version of SoapClient did not add a user agent string by default.