I have a blowfish encryption script in PHP and JAVA vice versa that was working fine until today when I came across a problem.
The same content is encrypted differently in Java vs PHP by only 2 chars, which is really weird.
PHP
wTHzxfxLHdMm/JMFnoh0hciS/JADvFFg
Java
wTHzxfxLHdMm/JMFnoh0hciS/D8DvFFg
-------------------------^^
As you see those two positions do not match. Unfortunately the value is a real email address and I can’t share it. Also I was not able to reproduce the problem with other few values I’ve tested. I’ve tried changing Base64 encode classes on Java, and that neither helped.
The source code for PHP is here, and for Java is here.
What could I do to resolve this problem?
Let’s have a look at your Java code:
What you are doing here is:
The problem is in step 4. It assumes that an arbitrary byte array represents a string in your system’s default encoding, and encoding this string back gives the same byte[]. This is valid for some encodings (the
ISO-8859series, for example), but not for others. In Java, when some byte (or byte sequence) is not representable in the given encoding, it will be replaced by some other character, which later for reconverting will be mapped to byte 63 (ASCII?). Actually, the documentation even says:In your case, there is no reason to do this at all – simply use the bytes which your
encryptmethod outputs directly to convert them to Base64.(Also note that I removed the superfluous
new String("...")constructor calls here, though this does not relate to your problem.)The point to remember: Never ever convert an arbitrary byte[], which did not come from encoding a string, to a string. Output of an encryption algorithm (and most other cryptographic algorithms, except decryption) certainly belongs to the category of data which should not be converted to a string.
And never ever use the System’s default encoding, if you want portable programs.