Я не могу создать эквивалент расшифровки 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==");
Итак, это была глупая ошибка, по какой-то причине я думал, что $ 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]);
}
Других решений пока нет …