Нужен Java-эквивалент для 3DES-расшифровки PHP-кода - PullRequest
2 голосов
/ 24 марта 2012

Это код PHP, который у меня есть.

function decrypt($s_input, $s_key, $s_iv) { 
   $s_decrypted = pack("H*" , $s_input); // Hex to binary
   $s_decrypted = mcrypt_decrypt (MCRYPT_3DES, $s_key, $s_decrypted, MCRYPT_MODE_CBC, $s_iv);  // 3des decryption
  return $s_decrypted; 
}
echo encrypt('c37551bb77f741d0bcdc16497b4f97b1','123456781234567812345678','12345678' );

Что он в основном делает, это дешифрует зашифрованную строку 3des (сначала она преобразует шестнадцатеричную строку в двоичную, используя функцию pack, а затем выполняетфактическое дешифрование).

Это прекрасно работает в PHP-4 и печатает сообщение "Hello World".

Однако, если я запускаю эквивалентный java-код (jdk 1.6), он выводит вывод мусора как - ¬ªmjV = 7xl_ ^Ä ^ ›*?.

Может ли кто-нибудь помочь устранить неполадку?Почему Java неправильно расшифровывает шестнадцатеричную строку.

private static String decrypt(String inputStr, String keyStr, String ivStr) throws Exception {

    IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
    SecretKeySpec key = new SecretKeySpec(keyStr.getBytes(), "DESede");
    inputStr = hexToString(inputStr, 2);

    Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, key, iv);
    byte[] decrypted = cipher.doFinal(inputStr.getBytes());

    return new String(decrypted);
}

private static String hexToString(String input, int groupLength) {
    StringBuilder sb = new StringBuilder(input.length() / groupLength);
    for (int i = 0; i < input.length() - groupLength + 1; i += groupLength) {
        String hex = input.substring(i, i + groupLength);
        sb.append((char) Integer.parseInt(hex, 16));
    }
    return sb.toString();
}

public static void main(String[] args) throws Exception {
    String decryptSignature = decrypt("c37551bb77f741d0bcdc16497b4f97b1", "123456781234567812345678", "12345678");
    System.out.println(decryptSignature);
}

1 Ответ

0 голосов
/ 24 марта 2012

Есть несколько вещей, которые вы должны проверить.Может оказаться полезным шифрование с использованием AES-128 в Java .Могут быть проблемы с различиями в том, как вы обрабатываете ключи в коде PHP и Java.Вызывать getBytes() на String в Java без кодировки почти всегда плохая идея.Кроме того, используемые прокладки могут быть проблемой.Из того, что я видел, пэды PHP с null символами по умолчанию, что не соответствует NoPadding в Java.Наконец, метод hexToString должен возвращать byte[] вместо String.Добавьте результат вызова Integer.parseInt(hex, 16) в массив:

byte[] results = new byte[input.length() / groupLength];
...
    //inside the loop
    results[i / groupLength] = (byte) Integer.parseInt(hex, 16);
...
return results;
...