Почему результат DES Encryption на Java отличается от результата на PHP? - PullRequest
0 голосов
/ 08 января 2019

Я запустил Trible DES Encryption в Java с null IV (я запустил метод cipher.getIV(), и действительно, его IV - ноль), и та же строка запустила Triple DES Encryption в PHP с null IV, но Я получаю другой результат. Почему это так?

Java-код:

private static final String model = "DESede/ECB/PKCS5Padding";
public static String desEncrypt(String message, String key) throws Exception {
    byte[] keyBytes = null;
    if(key.length() == 16){
        keyBytes = newInstance8Key(ByteUtil.convertHexString(key));
    } else if(key.length() == 32){
        keyBytes = newInstance16Key(ByteUtil.convertHexString(key));
    } else if(key.length() == 48){
        keyBytes = newInstance24Key(ByteUtil.convertHexString(key));
    }

    SecretKey deskey = new SecretKeySpec(keyBytes, "DESede");

    Cipher cipher = Cipher.getInstance(model);
    cipher.init(1, deskey);
    return ByteUtil.toHexString(cipher.doFinal(message.getBytes("UTF-8")));
}

PHP код:

// composer require phpseclib/phpseclib
use phpseclib\Crypt\TripleDES;

function desEncrypt($str,$key){
    $cipher = new TripleDES();
    $cipher->setKey(hex2bin($key));

    $cryptText = $cipher->encrypt($str);

   return unpack("H*",$cryptText)[1];
}

Я хочу изменить свой код PHP, чтобы он соответствовал процессу шифрования Java , как мне поступить? где проплем?

Результат Java Encrypt:

before: 622700300000
key: 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF
after: c9aa8ebfcc12ce13e22a33b05d4c18cf

PHP Encrypt Результат:

before: 622700300000
key: 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF
after: a6e7a000d4ce79ac8b3db9f6acf73de3

Фиксированный код PHP:

/**
 * Triple DES (ECB) Encryption Function
 * PKCS5Padding
 * 
 * @param string $message String needed to be encode
 * @param string $key Hex encoded key
 * @return string Hex Encoded
 */
function desEncrypt($message,$key){
    $cipher = new TripleDES(TripleDES::MODE_ECB);
    $cipher->setKey(hex2bin($key));

    $cryptText = $cipher->encrypt($message);

   return bin2hex($cryptText);
}

1 Ответ

0 голосов
/ 08 января 2019

Вы забыли расшифровать ключ в шестнадцатеричном формате перед его использованием. Вы также используете режим CBC вместо режима ECB, но поскольку ваш IV равен нулю, это равносильно для первого блока данных, которые зашифрованы.

...