Не могу сделать эквивалент расшифровки php DES в Java

Я не могу создать эквивалент расшифровки php DES в Java, всегда другой результат.
Вот php-код, который я хочу повторить:

$key = substr(sha1("m",true),0,8); //8-byte key
$iv = mcrypt_encrypt (MCRYPT_DES,$key,hex2bin("0000000000000000"),MCRYPT_MODE_ECB); //get Iv
print(bin2hex($iv)."\n"); // "b5872289d3c49605"$plain_text = "MZ4aXMCMO/TQAsZ2bYwagw==";
$plain_text = base64_decode($plain_text);
$cipher_text = mcrypt_decrypt (MCRYPT_DES, $key, $plain_text, MCRYPT_MODE_CFB, $iv);
print("\nThe ciphertext: ".$cipher_text);
print("\nThe expected  : "."489B4F2ADD728755");

и мой код Java:

public static void desCipherDecrypt(String key, String encodedString) throws Exception {
byte [] keyByte = Arrays.copyOf(DigestUtils.sha1(key),8);
byte [] encodedByte = Base64.decodeBase64(encodedString);
byte [] iv = DatatypeConverter.parseHexBinary("B5872289D3C49605"); //same as Iv in php

AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
Cipher desCipherDecrypt;

desCipherDecrypt = Cipher.getInstance("DES/CFB/NoPadding");
DESKeySpec dks = new DESKeySpec(keyByte);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey desKey = skf.generateSecret(dks);
desCipherDecrypt.init(Cipher.DECRYPT_MODE, desKey,paramSpec);
byte[] cryptByte = desCipherDecrypt.doFinal(encodedByte);

System.out.println("resultBytes: "+Arrays.toString(cryptByte)+"\n");
System.out.println("resultHex: "+DatatypeConverter.printHexBinary(cryptByte)+"\n");
System.out.println("Decryption ended");
}
...
desCipherDecrypt("m", "MZ4aXMCMO/TQAsZ2bYwagw==");

-1

Решение

Итак, это была глупая ошибка, по какой-то причине я думал, что $ cipher_text был закодирован в шестнадцатеричном формате, но это было неправильно, это простой текст, другая причина состояла в том, что mcrypt_decrypt по какой-то причине не использует стандартный блок в 64-битной, но 8-битный блок.

ведь ответ будет,
во-первых, использует CFB8:

desCipherDecrypt = Cipher.getInstance("DES/CFB8/NoPadding");

второй прочитанный байт результата как обычный текст

yte[] cryptByte = desCipherDecrypt.doFinal(encodedByte);
for (int i = 0; i < cryptByte.length; i++ ){
sResult += (char)(cryptByte[i]);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector