Шифрование в Java, дешифрование в PHP и наоборот

Код PHP:

<?php
class Crypter {

private $Key;
private $Algo;
private $Mode;
private $Iv;

public function __construct() {
$this->Algo = MCRYPT_BLOWFISH;
$this->Mode = MCRYPT_MODE_CBC;
$this->Key = substr('7890', 0, mcrypt_get_key_size($this->Algo, $this->Mode));
}

public function Encrypt($data) {

$iv_size = mcrypt_get_iv_size($this->Algo, $this->Mode);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$this->Iv = $iv;

$blocksize = mcrypt_get_block_size('blowfish', 'cbc'); // get block size
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length
$data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data

$crypt = mcrypt_encrypt($this->Algo, $this->Key, $data, $this->Mode, $this->Iv);
return base64_encode($crypt);
}


public function Decrypt($data) {

$crypt = base64_decode($data);
$decrypt = mcrypt_decrypt($this->Algo, $this->Key, $crypt, $this->Mode, $this->Iv);
$block = mcrypt_get_block_size('blowfish', 'cbc');
$pad = ord($decrypt[($len = strlen($decrypt)) - 1]);
return substr($decrypt, 0, strlen($decrypt) - $pad);
}
}
?>

Код JAVA:

package blowfishcbc;
import java.security.MessageDigest;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class BlowfishCBC {

public static void main(String[] args) throws Exception {

String keyString = "7890";
String input = "some data";

Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");

// for IV
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);

// for key
byte[] keyData = (keyString).getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyData, "Blowfish");

// encrypt
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));
String enc = new BASE64Encoder().encode(encrypted);
System.out.println("encrypted: " + new String(enc));

// decrypt
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] dec = new BASE64Decoder().decodeBuffer(enc);
byte[] decrypted = cipher.doFinal(dec);
System.out.println("decrypted: " + new String(decrypted, "UTF-8"));
}
}

У меня есть сценарий, где кодирование и декодирование будет между двумя системами, такими как JAVA и PHP. Теперь вышеперечисленные классы являются примерами PHP и JAVA соответственно.

Прежде всего, если я использую алгоритм Blowfish в режиме CBC, я должен предоставить параметр IV (вектор инициализации). Который генерируется случайным образом, а длина равна размеру блока. И размер блока зависит от режима шифрования и используемого алгоритма. Теперь, если я хочу декодировать некоторые данные в PHP, которые были закодированы в JAVA, то прежде всего ключ шифрования должен быть таким же, как и IV (вектор инициализации).

Теперь в Java-коде IV генерируется случайным образом, и если я передаю тот же IV в коде PHP вместе с закодированной строкой (закодированной в Java), то я получаю ошибку в системе PHP, что размер IV должен совпадать с размером блока размер.

Сейчас,

для PHP

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);

и для JAVA

cipher.getBlockSize();

И то, и другое дает размер 8. Но когда я передаю IV, сгенерированный в JAVA, в PHP, это дает ошибку Message: mcrypt_encrypt(): The IV parameter must be as long as the blocksize Теперь, как я могу решить эту проблему.

Насколько я понимаю, процесс генерации IV в обеих системах должен быть одинаковым. Чтобы быть конкретным, длина IV должна быть одинаковой. Небольшая помощь будет высоко ценится. Благодарю.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]