Устаревшее шифрование в Java и дешифрование в PHP

1

Я пытаюсь зашифровать строку с помощью PHP с тем же результатом устаревшего кода Java.

Код Java:

public static SecretKeySpec createSecretKey(String mKey) {
    SecretKeySpec secretKey = null;
    MessageDigest sha = null;
    try {
        byte[] key = mKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16); // use only first 128 bit
        secretKey = new SecretKeySpec(key, "AES");
    } catch (NoSuchAlgorithmException ex) {
        System.out.println("- createSecretKey > NoSuchAlgorithmException:" + ex.getMessage());
    } catch (UnsupportedEncodingException ex) {
        System.out.println("- createSecretKey > UnsupportedEncodingException:" + ex.getMessage());
    } catch (Exception ex) {
        System.out.println("- createSecretKey > Exception:" + ex.getMessage());
    }
    return secretKey;
}

public static String encryptAES(String stringToEncrypt, SecretKeySpec secretKey) {        //Rijndael
    String encryptedString = null;
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        encryptedString = Base64.encodeBase64String(cipher.doFinal(stringToEncrypt.getBytes("UTF-8")));
    } catch (Exception ex) {
        System.out.println("- encryptAES > Exception: " + ex.getMessage());
    }
    return encryptedString;
}

Теперь я хочу получить тот же результат с PHP.

Например:

  • key => 1234
  • строка ввода => oneString
  • вычисленная строка вывода => whx4s8e6p1erYtsIaFO7qA ==

Я делаю этот PHP-код, но результат неправильный.

$key = "Cup45ZD7";
$o = "19uzJrsE";
echo getEncrypt(pkcs5_pad($o,16),$key) ;

function pkcs5_pad ($text, $blocksize)
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

function getEncrypt($sStr, $sKey) {
    return base64_encode(
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            ($sKey),
            $sStr,
            MCRYPT_MODE_ECB
        )
    );
}

Есть идеи?

Теги:
encryption
aes

1 ответ

1
Лучший ответ

Вам нужно использовать тот же ключ:

  1. Получить хэш SHA-1 из "ключа"
  2. Используйте первые 16 байтов хэша в качестве фактического ключа

Следующее изменение дает желаемый результат

echo getEncrypt(pkcs5_pad($o, 16), substr(sha1($key, true), 0, 16));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню