javapythonencryptionblowfishecb

Python Blowfish Encryption


I am struggling due to my incomplete knowledge of Java to convert this encryption code to Python code. The two should have the exact same results. Help would be greatly appreciated.

Java Function

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;


class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "testings";
        Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
        Key key = new SecretKeySpec("6#26FRL$ZWD".getBytes(), "Blowfish");
        cipher.init(1, key);
        byte[] enc_bytes = cipher.doFinal(s.getBytes());
        System.out.println(enc_bytes);
    }
}

Python Equivalent

def PKCS5Padding(string):
    byteNum = len(string)
    packingLength = 8 - byteNum % 8
    if packingLength == 8:
        return string
    else:
        appendage = chr(packingLength) * packingLength
        return string + appendage

def PandoraEncrypt(string):
    from Crypto.Cipher import Blowfish
    key = b'6#26FRL$ZWD'
    c1  = Blowfish.new(key, Blowfish.MODE_ECB)
    packedString = PKCS5Padding(string)
    return c1.encrypt(packedString)

Results

Java Function: "??¾ô"

Python Function: "Ë4A-¾`*ã"


Solution

  • I get the same output for both python and Java using your example.

    Java:

    import java.math.BigInteger;
    import java.security.Key;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    
    public class Blowfish1 {
    
        public static void main(String[] args) throws Exception {
            String s = "testings";
            Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
            Key key = new SecretKeySpec("6#26FRL$ZWD".getBytes(), "Blowfish");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] enc_bytes = cipher.doFinal(s.getBytes());
            System.out.printf("%x%n", new BigInteger(1, enc_bytes));
        }
    
    }
    

    Python:

    from Crypto.Cipher import Blowfish
    import binascii
    
    # See @falsetru answer for the following method
    #
    def PKCS5Padding(string):
        byteNum = len(string)
        packingLength = 8 - byteNum % 8
        appendage = chr(packingLength) * packingLength
        return string + appendage
    
    def PandoraEncrypt(string):
        key = b'6#26FRL$ZWD'
        c1  = Blowfish.new(key, Blowfish.MODE_ECB)
        packedString = PKCS5Padding(string)
        return c1.encrypt(packedString)
    
    if __name__ == '__main__':
        s = 'testings'
        c = PandoraEncrypt(s)
        print(binascii.hexlify(c))
    

    In both cases the output is 223950ff19fbea872fce0ee543692ba7