3

I made 2 codes one in python and the other in android (eclipse) for encryption and decryption. Now I want to encrypt my data using python and sending it to the android to decrypt it.

How to make two different platforms to encrypt/decrypt the data?! Each platform has its own way to do the encryption and decryption , so how can i make them talk to each other and sending data and android extract the exact information which was transmitted?

Help is needed!!

SGLGG
  • 31
  • 2

4 Answers4

0

If you're happy with mcrypt using AES CBC, there's a simple solution described at http://laurentcharignon.com/blog/?p=37 "Cross language Encryption/Decryption with AES CBC (Python/Java/PHP)".

Adrian Spinei
  • 550
  • 5
  • 15
0

Python Code:

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):
    if not out_filename:
        out_filename = in_filename + '.enc'

    iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    filesize = os.path.getsize(in_filename)

    with open(in_filename, 'rb') as infile:
        with open(out_filename, 'wb') as outfile:
            outfile.write(struct.pack('<Q', filesize))
            outfile.write(iv)

            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += ' ' * (16 - len(chunk) % 16)

                outfile.write(encryptor.encrypt(chunk))

def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024):
    if not out_filename:
        out_filename = os.path.splitext(in_filename)[0]

    with open(in_filename, 'rb') as infile:
        origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
        iv = infile.read(16)
        decryptor = AES.new(key, AES.MODE_CBC, iv)

        with open(out_filename, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(origsize)
sjngm
  • 12,423
  • 14
  • 84
  • 114
SGLGG
  • 31
  • 2
0
Android Code:
public static final int SALT_LENGTH = 20;
public static final int PBE_ITERATION_COUNT = 1000;

private static final String RANDOM_ALGORITHM = "SHA1PRNG";
private static final String PBE_ALGORITHM = "PBEWithSHA256And256BitAES-CBC-BC";
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";

private static final String TAG = Act.class.getSimpleName();

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    try {

        String password = "password";
        String plainText = "plaintext message to be encrypted";

        // byte[] salt = generateSalt();
        byte[] salt = "dfghjklpoiuytgftgyhj".getBytes();
        Log.i(TAG, "Salt: " + salt.length + " " + HexEncoder.toHex(salt));
        PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, PBE_ITERATION_COUNT, 256);
        SecretKeyFactory factory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
        SecretKey tmp = factory.generateSecret(pbeKeySpec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
        byte[] key = secret.getEncoded();
        Log.i(TAG, "Key: " + HexEncoder.toHex(key));

        // PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, ITERATION_COUNT);

        Cipher encryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM);

        // byte[] encryptionSalt = generateSalt();
        // Log.i(TAG, "Encrypted Salt: " + encryptionSalt.length + " " + HexEncoder.toHex(encryptionSalt));
        // PBEParameterSpec pbeParamSpec = new PBEParameterSpec(encryptionSalt, 1000);
        // byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        Log.i(TAG, encryptionCipher.getParameters() + " ");
        byte[] iv = generateIv();
        IvParameterSpec ivspec = new IvParameterSpec(iv);

        encryptionCipher.init(Cipher.ENCRYPT_MODE, secret, ivspec);
        byte[] encryptedText = encryptionCipher.doFinal(plainText.getBytes());
        Log.i(TAG, "Encrypted: " + HexEncoder.toHex(encryptedText));

        Cipher decryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM);
        decryptionCipher.init(Cipher.DECRYPT_MODE, secret, ivspec);
        byte[] decryptedText = decryptionCipher.doFinal(encryptedText);
        Log.i(TAG, "Decrypted: " + new String(decryptedText));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

private byte[] generateSalt() throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM);
    byte[] salt = new byte[SALT_LENGTH];
    random.nextBytes(salt);
    return salt;
}

private byte[] generateIv() throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM);
    byte[] iv = new byte[16];
    random.nextBytes(iv);
    return iv;
}

}

SGLGG
  • 31
  • 2
  • I have some probs in the android code actually.. could u plz what's going wrong with it??? The "HexEncoder.toHex()" gives me an error that it is not defined... aslo the method generateSalt() tells that it is not used. So help is needed.. and Thx! – SGLGG Jun 08 '11 at 21:03
0

TLS could be used to securely transmit data in a compatible way.

Python ssl server-side

If additionally you use http protocol for the communication then there are already high-level libraries that might hide all gory details from you; just provide client/server certificates and make appropriate requests.

Https Connection Android

It might save you from reimplementing poorly many security features such as forward secrecy.

Community
  • 1
  • 1
jfs
  • 399,953
  • 195
  • 994
  • 1,670