Я запустил Trible DES Encryption в Java, с null
IV (я бегал cipher.getIV()
метод и действительно это IV является нулевым) и та же строка запускала шифрование Triple DES в 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:
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);
}
Вы забыли расшифровать ключ в шестнадцатеричном формате перед его использованием. Вы также используете режим CBC вместо режима ECB, но так как ваш IV равен нулю, это равносильно за первый блок данных, которые зашифрованы.
Других решений пока нет …