Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
EncDec на Java
#1
Всем привет! Пишу небольшой проект на джавке.
В функции декрипта файла 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();
}
}
}

Я такой ошибки никогда не встречал и никак не могу понять почему она выскакивает Sad

Добавлено через 7 минут
p.s. Вот реализации на пхп и на перле http://coderx.ru/showthread.php?t=8789
p.p.s. Не пойму что же я упустил....
Ответ
#2
Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.
Ответ
#3
acmi Написал:Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.

Первые 1024 (точнее там больше 1024 но меньше 2048) байтов декриптуются правильно. А Ваше сообщение полностью бессмысленное.
Ответ
#4

P.S: сам постоянно сталкивался с проблемами зиповского флатера/инфлатера, в результате стал использовать jar-ные методы.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#5
ALF. Написал:Первые 1024 (точнее там больше 1024 но меньше 2048) байтов декриптуются правильно. А Ваше сообщение полностью бессмысленное.

Увы не бессмысленное. Если Вы добавите в Вашем коде всего 2 символа, то все заработает.
Ответ
#6
acmi Написал:Увы не бессмысленное. Если Вы добавите в Вашем коде всего 2 символа, то все заработает.

А более конкретно?)
Я сейчас немного переделал код но проблема осталась. Даже если юзать стандартные RSA методы
PHP код:
<?php 
package ua
.alf;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;

import javax.crypto.Cipher;

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);

PrivateKey key = generateRsaPrivateKey(MOD, EXPONENT);

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);

byte[] dec = rsaDecrypt(raw, key);
bos.write(dec);

}

fis.close();
bos.flush();

byte[] dd = bos.toByteArray();

bos.reset();

Inflater i = new Inflater(false);
i.setInput(dd, 8, dd.length-8);
byte[] buffer = new byte[1024];
i.inflate(buffer);

String s = new String(buffer);
System.out.println(s);

} catch (
IOException e) {
e.printStackTrace();
} catch (
DataFormatException e) {
e.printStackTrace();
}
}

public static
PublicKey generateRsaPublicKey(BigInteger modulus, BigInteger publicExponent) {
try {
return
KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(modulus, publicExponent));
} catch (
Exception e) {
e.printStackTrace();
}
return
null;
}

public static
PrivateKey generateRsaPrivateKey(BigInteger modulus, BigInteger privateExponent) {
try {
return
KeyFactory.getInstance("RSA").generatePrivate(new RSAPrivateKeySpec(modulus, privateExponent));
} catch (
Exception e) {
e.printStackTrace();
}
return
null;
}

public static
byte[] rsaDecrypt(byte[] encrypted, PrivateKey key) {
try {
Cipher cipher = Cipher.getInstance("RSA/ECB/nopadding");
cipher.init(Cipher.DECRYPT_MODE, key);
return
cipher.doFinal(encrypted);
} catch (
Exception e) {
e.printStackTrace();
}
return
null;
}
}
Ответ
#7
Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.
Ответ
#8
acmi Написал:Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.

Ну то что для байта то да, а BigInteger тут причем?
Я ему даю значение в hex-е и говорю что оно именно в hex-е.
+ я же говорю что половина файла декодируется нормально.

нифига не пойму Sad (сори если что, я первый раз работаю с BigInteger)
п.с. юзаение стандартных RSA методов не помогло
Ответ
#9
BigInteger data = new BigInteger(1,raw);

p.s. стандартный rsa прекрасно работает.
Ответ
#10
acmi Написал:BigInteger data = new BigInteger(1,raw);

p.s. стандартный rsa прекрасно работает.

Спасибо!)
Но... Почему тогда мой не работает?( (Чуть выше код...)
Вроде бы всё правильно...
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Lineage2 java Chronicle3 сборка AlexBayev 0 218 07-20-2024, 05:23 PM
Последний пост: AlexBayev
  Порекомендуйте хорошую Java сборку L2 GF (PTS не потяну ибо навыков 0 ) Force 0 820 10-28-2023, 12:02 PM
Последний пост: Force
  Java dev hired! Krasib 0 1,080 08-15-2022, 10:00 AM
Последний пост: Krasib
  SVN ссылки Java серверов. PROGRAMMATOR 284 231,947 11-19-2020, 08:50 PM
Последний пост: AbsolutePower
  Java координаты, различия PTS и Java, какие сборки хороши (iL) varted 5 2,435 09-12-2018, 08:29 AM
Последний пост: varted
  l2 c4 java estorq 0 1,292 08-17-2018, 10:07 PM
Последний пост: estorq
  Топовая Java сборка под х3 и х1200 NovaPlanet 32 8,156 11-22-2016, 11:38 AM
Последний пост: 6bit
  Java в Class virusoflove 1 1,701 10-17-2016, 09:04 AM
Последний пост: Rolfer
  Помогите поставить Java сервер la2 c3! Winst 0 1,159 10-16-2016, 12:34 PM
Последний пост: Winst
  Ищу стабильную сборка java сервера HF introzorn 12 6,046 10-14-2016, 09:34 PM
Последний пост: Mangol

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)