EncDec на Java - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Описание темы:Помогите решить ошибочку

Ответ
Опции темы
Непрочитано 12.07.2013, 00:05   #1
Аватар для ALF.
Герой

Автор темы (Топик Стартер) EncDec на Java

Всем привет! Пишу небольшой проект на джавке.
В функции декрипта файла 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 код:
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_STR16);
    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 0blocksi++) {
                
byte[] raw = new byte[BLOCK_SIZE];    
                
fis.read(raw);
                
                
BigInteger data = new BigInteger(raw);
                
data data.modPow(EXPONENTMOD);
                
                
byte[] decRaw data.toByteArray();
                
int size decRaw[0];
                
                if (
size == 124
                    
bos.write(decRawdecRaw.length sizesize);
                else {
                    
int dd decRaw.length size;
                    while (
dd && decRaw[dd-1] != '\0')
                        
dd--;
                    
bos.write(decRawddsize);
                }                    
            }
            
            
fis.close();
            
bos.flush();            
            
            
byte[] dd bos.toByteArray();
            
            
bos.reset();
            
InflaterInputStream iis = new InflaterInputStream(new ByteArrayInputStream(dd4dd.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. Не пойму что же я упустил....

Последний раз редактировалось ALF.; 12.07.2013 в 00:13. Причина: Добавлено сообщение
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 12.07.2013, 10:34   #2
Супергерой

По умолчанию Re: EncDec на Java

Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.
acmi вне форума Отправить сообщение для acmi с помощью ICQ Ответить с цитированием
Непрочитано 12.07.2013, 10:40   #3
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: EncDec на Java

Цитата:
Сообщение от acmi Посмотреть сообщение
Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.
Первые 1024 (точнее там больше 1024 но меньше 2048) байтов декриптуются правильно. А Ваше сообщение полностью бессмысленное.
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 12.07.2013, 10:40   #4
Аватар для n3k0nation
Antihero

По умолчанию Re: EncDec на Java

:
Свернуть ↑Развернуть ↓


P.S: сам постоянно сталкивался с проблемами зиповского флатера/инфлатера, в результате стал использовать jar-ные методы.
__________________
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
n3k0nation вне форума Ответить с цитированием
Непрочитано 12.07.2013, 10:56   #5
Супергерой

По умолчанию Re: EncDec на Java

Цитата:
Сообщение от ALF. Посмотреть сообщение
Первые 1024 (точнее там больше 1024 но меньше 2048) байтов декриптуются правильно. А Ваше сообщение полностью бессмысленное.
Увы не бессмысленное. Если Вы добавите в Вашем коде всего 2 символа, то все заработает.
acmi вне форума Отправить сообщение для acmi с помощью ICQ Ответить с цитированием
Непрочитано 12.07.2013, 11:15   #6
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: EncDec на Java

Цитата:
Сообщение от acmi Посмотреть сообщение
Увы не бессмысленное. Если Вы добавите в Вашем коде всего 2 символа, то все заработает.
А более конкретно?)
Я сейчас немного переделал код но проблема осталась. Даже если юзать стандартные RSA методы
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_STR16);
    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(MODEXPONENT);
        
        
ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try {
            
FileInputStream fis = new FileInputStream(file);
            
fis.skip(HEADER_SIZE);

            for (
int i 0blocksi++) {
                
byte[] raw = new byte[BLOCK_SIZE];
                
fis.read(raw);
                
                
byte[] dec rsaDecrypt(rawkey);
                
bos.write(dec);
                
            }

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

            
byte[] dd bos.toByteArray();

            
bos.reset();
            
            
Inflater i = new Inflater(false);
            
i.setInput(dd8dd.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 modulusBigInteger publicExponent) {
        try {
            return 
KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(moduluspublicExponent));
        } catch (
Exception e) {
            
e.printStackTrace();
        }
        return 
null;
    }

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

    public static 
byte[] rsaDecrypt(byte[] encryptedPrivateKey key) {
        try {
            
Cipher cipher Cipher.getInstance("RSA/ECB/nopadding");
            
cipher.init(Cipher.DECRYPT_MODEkey);
            return 
cipher.doFinal(encrypted);
        } catch (
Exception e) {
            
e.printStackTrace();
        }
        return 
null;
    }

ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 12.07.2013, 11:22   #7
Супергерой

По умолчанию Re: EncDec на Java

Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.
acmi вне форума Отправить сообщение для acmi с помощью ICQ Ответить с цитированием
Непрочитано 12.07.2013, 11:28   #8
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: EncDec на Java

Цитата:
Сообщение от acmi Посмотреть сообщение
Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.
Ну то что для байта то да, а BigInteger тут причем?
Я ему даю значение в hex-е и говорю что оно именно в hex-е.
+ я же говорю что половина файла декодируется нормально.

нифига не пойму (сори если что, я первый раз работаю с BigInteger)
п.с. юзаение стандартных RSA методов не помогло
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Непрочитано 12.07.2013, 11:32   #9
Супергерой

По умолчанию Re: EncDec на Java

BigInteger data = new BigInteger(1,raw);

p.s. стандартный rsa прекрасно работает.
acmi вне форума Отправить сообщение для acmi с помощью ICQ Ответить с цитированием
Непрочитано 12.07.2013, 11:54   #10
Аватар для ALF.
Герой

Автор темы (Топик Стартер) Re: EncDec на Java

Цитата:
Сообщение от acmi Посмотреть сообщение
BigInteger data = new BigInteger(1,raw);

p.s. стандартный rsa прекрасно работает.
Спасибо!)
Но... Почему тогда мой не работает?( (Чуть выше код...)
Вроде бы всё правильно...
ALF. вне форума Отправить сообщение для ALF. с помощью ICQ Отправить сообщение для ALF. с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка ГС! keksar Серверная часть 29 21.02.2011 20:55
Крепости (осады) Romanz Серверная часть 125 31.07.2010 18:12
Зависает после выбора сервера! Nales Серверная часть 8 09.05.2010 12:55


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 04:58. Часовой пояс GMT +3.

Вверх