Метод шифрования это реализовано и для php и для Java?

Я должен передать некоторые строки от сервлета Java до сценария PHP. Что опции там для шифрования строк? Мне был бы нужен метод, который реализован и для Java и для php (как.. caesar шифр...). Есть ли какой-либо стандартный метод шифрования, я должен смочь получить библиотеку и для Java и для php?

Я хочу зашифровать строки на стороне Java, передать сценарию PHP, затем позволить сценарию PHP дешифровать их.

Я не могу использовать https из-за ограничений поставщика, которого я использую.

Спасибо

5
задан BalusC 13 July 2010 в 02:32
поделиться

4 ответа

Надеюсь, это поможет вам начать работу. Обработка ошибок отсутствует, а секретный ключ жестко закодирован. Обе эти проблемы необходимо решить для создания качественного кода. Со стороны Java вы можете использовать Java Cryptography Architecture (JCA):

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

public final void testTesting() throws Exception {
    final String plainText = "plain text";
    final String result = encrypt(plainText);
    System.out.println(result);
}

public String encrypt(final String plainText) throws Exception {
    final byte[] data = plainText.getBytes("UTF-8");
    final byte[] encoded = encrypt(data);
    final String result = new String(encoded);
    return result;
}

public byte[] encrypt(final byte[] data) throws Exception {
    // this is just an example key, real code should use a properly generated shared secret
    final byte[] secret = new byte[] {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
    final SecretKeySpec key = new SecretKeySpec(secret, "AES");

    final Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    encryptCipher.init(Cipher.ENCRYPT_MODE, key);
    final byte[] iv = encryptCipher.getIV();
    final byte[] encrypted = encryptCipher.doFinal(data);

    final int outputLength = encrypted.length;
    final int ivLength = iv.length;

    final byte[] results = new byte[outputLength + ivLength];
    System.arraycopy(iv, 0, results, 0, ivLength);
    System.arraycopy(encrypted, 0, results, ivLength, outputLength);

    return DatatypeConverter.printBase64Binary(encoded);
}

Со стороны PHP вам понадобится Mcrypt.

<?php
$key = base64_decode('KioqKioqKioqKioqKioqKg==');
$input = base64_decode($_GET['input']);
$plain_text = substr($input, 16);
$initialization_vector = substr($input, 0, 16);
echo pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $plain_text, MCRYPT_MODE_CBC, $initialization_vector));

function pkcs5_unpad($text) {
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) {
        return false;
    }
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
        return false;
    }
    return substr($text, 0, -1 * $pad);
}
?>

Функция pkcs5_unpad была скопирована из здесь, поскольку кажется, что PHP Mcrypt не включает поддержку PKCS5 padding. Java-код префиксирует данные вектором инициализации, используемым для их шифрования. Затем PHP-код разделяет его на две части, вектор инициализации и зашифрованные данные.

Этот код использует 128-битный AES (Rijndael) в CBC режиме, что должно быть достаточно безопасно для большинства применений. В дополнение к простому шифрованию я рекомендую использовать HMAC, как описано здесь, чтобы гарантировать, что данные не будут подделаны. Чтобы выполнить HMAC в Java, используйте класс Mac. Для PHP смотрите Mhash.

14
ответ дан 18 December 2019 в 13:10
поделиться

Jasypt ( http://www.jasypt.org/ ) будет использовать любой алгоритм, который вы хотите. Должен быть в состоянии реализовать любой из распространенных алгоритмов за несколько минут.

0
ответ дан 18 December 2019 в 13:10
поделиться

Большинство стандартных алгоритмов шифрования доступны как в PHP, так и в Java.

Взгляните на:

Как вы можете видеть, оба они поддерживают DES, TripleDES, RC2, как минимум.

0
ответ дан 18 December 2019 в 13:10
поделиться

Посмотрите на расширение mcrypt для PHP. Один из них почти наверняка существует на Java.

0
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: