Space
заполнение добавляет пробелы, поэтому длина, кратная 8, при шифровании или усечения пробелов после расшифровки.В Java вы можете использовать NoPadding
и управлять интервалом самостоятельно.
Например, для шифрования в Perl и дешифрования в Java:
Perl:
use Crypt::CBC;
$cipher = Crypt::CBC->new(
-literal_key => 1,
-key => pack("H*",
"11223344556677889900112233445566778899001122334"
. "455667788990011223344556677889900112233445566"
. "77889900112233445566"),
-cipher => 'Blowfish',
-header => 'none',
-padding => 'space',
-iv => pack("H*", '1234567812345678')
);
$ciphertext = $cipher->encrypt_hex("Message");
print(join('',unpack('H*',$cipher->iv())));
print $ciphertext;
Вывод: 1234567812345678e70b9ab0a4262ba8
Java:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.Charsets;
import org.apache.commons.codec.binary.Hex;
public class Main {
public static void main(String[] args) throws Exception {
Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding");
SecretKeySpec key = new SecretKeySpec(Hex.decodeHex(
"11223344556677889900112233445566778899001122334"
+ "455667788990011223344556677889900112233445566"
+ "77889900112233445566"),
"Blowfish");
byte[] iv = Hex.decodeHex("1234567812345678");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(Hex.decodeHex("e70b9ab0a4262ba8"));
System.out.println(new String(result, Charsets.UTF_8).trim());
}
}
Вывод: Message