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-¾`*ã"
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
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
appendage = chr(packingLength) * packingLength
return string + appendage
Use chr instead of str.
>>> chr(1)
'\x01'
>>> str(1)
'1'
str * int -> repeated str
>>> '!' * 5
'!!!!!'
来源:https://stackoverflow.com/questions/17134100/python-blowfish-encryption