Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   EncDec на Java (https://forum.zone-game.info/showthread.php?t=30087)

ALF. 12.07.2013 00:05

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. Не пойму что же я упустил....

acmi 12.07.2013 10:34

Re: EncDec на Java
 
Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.

ALF. 12.07.2013 10:40

Re: EncDec на Java
 
Цитата:

Сообщение от acmi (Сообщение 310644)
Крипт RSA есть в стандартной поставке джавы. Но даже если Вы любите хардкор и пользуетесь BigInteger, то делайте это правильно.

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

n3k0nation 12.07.2013 10:40

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


P.S: сам постоянно сталкивался с проблемами зиповского флатера/инфлатера, в результате стал использовать jar-ные методы.

acmi 12.07.2013 10:56

Re: EncDec на Java
 
Цитата:

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

Увы не бессмысленное. Если Вы добавите в Вашем коде всего 2 символа, то все заработает.

ALF. 12.07.2013 11:15

Re: EncDec на Java
 
Цитата:

Сообщение от acmi (Сообщение 310651)
Увы не бессмысленное. Если Вы добавите в Вашем коде всего 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;
    }



acmi 12.07.2013 11:22

Re: EncDec на Java
 
Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.

ALF. 12.07.2013 11:28

Re: EncDec на Java
 
Цитата:

Сообщение от acmi (Сообщение 310658)
Пока дам подсказку: 0xFF это -1, а не 255(для типа byte). Аналогично и для BigInteger.

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

нифига не пойму :( (сори если что, я первый раз работаю с BigInteger)
п.с. юзаение стандартных RSA методов не помогло

acmi 12.07.2013 11:32

Re: EncDec на Java
 
BigInteger data = new BigInteger(1,raw);

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

ALF. 12.07.2013 11:54

Re: EncDec на Java
 
Цитата:

Сообщение от acmi (Сообщение 310660)
BigInteger data = new BigInteger(1,raw);

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

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


Текущее время: 14:27. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot