Шифрование с помощью PHP и дешифрование с помощью Java
Я должен написать программу для расшифровки сообщения с использованием JAVA. Сообщение зашифровано с использованием Triple DES / ECB, реализованного на PHP. Я пробовал несколько различных настроек алгоритма, режима и схемы заполнения. Я не получаю правильный результат. Чего не хватает?
Вот программа PHP, которая шифрует сообщение:
$config_mcrypt_ecb_key = "12345678901234567890";
$data = "hello";
echo "Data Before Encrypt: " . $data . "\n";
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_ENCRYPT);
mcrypt_generic_init($td, $config_mcrypt_ecb_key, $iv);
$data_encrypt = bin2hex(mcrypt_generic($td, $data));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "Data After Encrypt: " . $data_encrypt . "\n";
И ниже программа Java для расшифровки сообщения: (я использую BouncyCastleProvider)
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
public class DecryptionTest {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
String password = "12345678901234567890";
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
SecretKeySpec key = new SecretKeySpec(password.getBytes(), "ECB");
Cipher m_decrypter = Cipher.getInstance("DESede/ECB/ZeroBytePadding");
m_decrypter.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedText = m_decrypter.doFinal("bdf0baf948bff7e7".getBytes());
System.out.println(new String(decryptedText));
}
}
1 ответ
Похоже, вы не используете IV (вектор инициализации) при выполнении дешифрования. Я понимаю, что mcrypt_create_iv()
будет генерировать случайный IV, так что вам нужно сохранить его с зашифрованными данными, чтобы его можно было использовать при расшифровке.
В качестве альтернативы (если вы довольны использованием более слабого шифрования) пропустите IV со своей стороны PHP.