Всем привет! Пишу небольшой проект на джавке.
В функции декрипта файла l2.ini (официального, без применения патча) после того как декриптовал и осталось только анпакнуть с GZ вылетает ошибка
Вот сам код:
В функции декрипта файла l2.ini (официального, без применения патча) после того как декриптовал и осталось только анпакнуть с GZ вылетает ошибка
Код:
java.util.zip.ZipException: invalid distance too far back
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at ua.alf.Decrypt.decrypt(Decrypt.java:72)
at ua.alf.Starter.main(Starter.java:16)
Вот сам код:
PHP код:
<?php
package ua.alf;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
public class Decrypt {
private static final String MOD_STR =
"97df398472ddf737ef0a0cd17e8d172f" + // 32
"0fef1661a38a8ae1d6e829bc1c6e4c3c" + // 64
"fc19292dda9ef90175e46e7394a18850" + // 96
"b6417d03be6eea274d3ed1dde5b5d7bd" + // 128
"e72cc0a0b71d03608655633881793a02" + // 160
"c9a67d9ef2b45eb7c08d4be329083ce4" + // 196
"50e68f7867b6749314d40511d09bc574" + // 228
"4551baa86a89dc38123dc1668fd72d83"; // 256
private static final BigInteger MOD = new BigInteger(MOD_STR, 16);
private static final BigInteger EXPONENT = new BigInteger("35", 16);
private static final int BLOCK_SIZE = 128;
private static final int HEADER_SIZE = 28;
public static void decrypt(File file) {
if (!file.exists())
return;
if (file.length() < BLOCK_SIZE + HEADER_SIZE)
return;
int blocks = (int) ((file.length() - HEADER_SIZE) / BLOCK_SIZE);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
FileInputStream fis = new FileInputStream(file);
fis.skip(HEADER_SIZE);
for (int i = 0; i < blocks; i++) {
byte[] raw = new byte[BLOCK_SIZE];
fis.read(raw);
BigInteger data = new BigInteger(raw);
data = data.modPow(EXPONENT, MOD);
byte[] decRaw = data.toByteArray();
int size = decRaw[0];
if (size == 124)
bos.write(decRaw, decRaw.length - size, size);
else {
int dd = decRaw.length - size;
while (dd > 2 && decRaw[dd-1] != '\0')
dd--;
bos.write(decRaw, dd, size);
}
}
fis.close();
bos.flush();
byte[] dd = bos.toByteArray();
bos.reset();
InflaterInputStream iis = new InflaterInputStream(new ByteArrayInputStream(dd, 4, dd.length-4));
while (iis.available() > 0)
bos.write(iis.read());
String s = new String(bos.toByteArray());
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Я такой ошибки никогда не встречал и никак не могу понять почему она выскакивает
Добавлено через 7 минут
p.s. Вот реализации на пхп и на перле http://coderx.ru/showthread.php?t=8789
p.p.s. Не пойму что же я упустил....