Перенос сборки на Java 8 => проблемы с RSA.

Алиос

Выдающийся
Участник
Сообщения
44
Розыгрыши
0
Решения
1
Репутация
184
Реакции
56
Баллы
1 338
Хроники
  1. The 2nd Throne: Gracia
Исходники
Присутствуют
Сборка
L2NextGen
Здравствуйте. В коем-то веке решил перевести довольно-таки древние исходники некстовэпилога на 8 джаву. Запускается без ошибок, но при подключении геймсервера к логину начинаются проблемы. Если быть точнее, то javax.crypto.badpaddingexception decryption error. Немного почитав ченджлоги явы - действительно в 8 версии меняли что-то, связанное с RSA-шифрованием, но, так как до этого в криптографию в целом и конкретно эту тему особо не вникал, разобраться, в чем конкретно суть проблемы и как исправить, достаточно трудно. Пытался найти различия в классах пакета login.gameservercon между некстами под 8 джаву(декомпил анионовской сборки Мишута) и моим сурсом - пока не нашел. Если кто-нибудь при попытках переноса старых сборок с 7 на 8 джаву сталкивался с подобной проблемой или просто шарит в теме - подскажите, пожалуйста, в каком направлении копать. Буду крайне признателен за любую помощь. Скрин ошибки прилагаю.
 

Вложения

  • RSA_Exception.jpg
    RSA_Exception.jpg
    283,8 КБ · Просмотры: 71
если я всё верно понял, используется 128байтный публичный ключ или же просто 128 байт от ключа. дропни последние 11 байт.
 
  • Мне нравится
Реакции: Psycho

    Алиос

    Баллов: 5
    Откликнулся на просьбу о помощи, натолкнул на нужные мысли, приведшие к пониманию сути и решению проблемы.
Благодарю за наводку на мысль. Пробовал сделать, как ты сказал - эксепшен всё равно сохранился. Помучился вечер, поизучал код сборки... в общем, помогло добавление кода в блоке try вот сюда:

Java:
package l2n.login.gameservercon;

import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAKeyGenParameterSpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

/**
 * @Author: Death
 * @Date: 12/11/2007
 * @Time: 19:45:57
 */
public class RSACrypt
{
    private final Cipher RSAEncrypt;
    private final Cipher RSADecrypt;

    private final byte[] RSAPublicKey = new byte[128];

    public RSACrypt() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException
    {
        RSAEncrypt = Cipher.getInstance("RSA");
        RSADecrypt = Cipher.getInstance("RSA");
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        try
        {
            final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
            kpg.initialize(spec);
        }
        catch(final InvalidAlgorithmParameterException e)
        {
            e.printStackTrace();
        }
        KeyPair kp = kpg.generateKeyPair();
        RSAPrivateKey privateRSA = (RSAPrivateKey) kp.getPrivate();
        RSAPublicKey publicRSA = (RSAPublicKey) kp.getPublic();

        byte[] pub = publicRSA.getModulus().toByteArray();
        System.arraycopy(pub, 1, RSAPublicKey, 0, 128);

        RSAEncrypt.init(Cipher.ENCRYPT_MODE, publicRSA);
        RSADecrypt.init(Cipher.DECRYPT_MODE, privateRSA);
    }

    public byte[] encryptRSA(byte[] toEncrypt) throws BadPaddingException, IllegalBlockSizeException
    {
        return RSAEncrypt.doFinal(toEncrypt);
    }

    public byte[] decryptRSA(byte[] toDecrypt) throws IllegalBlockSizeException, BadPaddingException
    {
        return RSADecrypt.doFinal(toDecrypt);
    }

    public byte[] getRSAPublicKey()
    {
        return RSAPublicKey;
    }
}

Если правильно понимаю, то там не был определен размер ключа, и клипер не знал, как правильно декодить.
 
Благодарю за наводку на мысль. Пробовал сделать, как ты сказал - эксепшен всё равно сохранился. Помучился вечер, поизучал код сборки... в общем, помогло добавление кода в блоке try вот сюда:

Java:
package l2n.login.gameservercon;

import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAKeyGenParameterSpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

/**
* @Author: Death
* @Date: 12/11/2007
* @Time: 19:45:57
*/
public class RSACrypt
{
    private final Cipher RSAEncrypt;
    private final Cipher RSADecrypt;

    private final byte[] RSAPublicKey = new byte[128];

    public RSACrypt() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException
    {
        RSAEncrypt = Cipher.getInstance("RSA");
        RSADecrypt = Cipher.getInstance("RSA");
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        try
        {
            final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
            kpg.initialize(spec);
        }
        catch(final InvalidAlgorithmParameterException e)
        {
            e.printStackTrace();
        }
        KeyPair kp = kpg.generateKeyPair();
        RSAPrivateKey privateRSA = (RSAPrivateKey) kp.getPrivate();
        RSAPublicKey publicRSA = (RSAPublicKey) kp.getPublic();

        byte[] pub = publicRSA.getModulus().toByteArray();
        System.arraycopy(pub, 1, RSAPublicKey, 0, 128);

        RSAEncrypt.init(Cipher.ENCRYPT_MODE, publicRSA);
        RSADecrypt.init(Cipher.DECRYPT_MODE, privateRSA);
    }

    public byte[] encryptRSA(byte[] toEncrypt) throws BadPaddingException, IllegalBlockSizeException
    {
        return RSAEncrypt.doFinal(toEncrypt);
    }

    public byte[] decryptRSA(byte[] toDecrypt) throws IllegalBlockSizeException, BadPaddingException
    {
        return RSADecrypt.doFinal(toDecrypt);
    }

    public byte[] getRSAPublicKey()
    {
        return RSAPublicKey;
    }
}

Если правильно понимаю, то там не был определен размер ключа, и клипер не знал, как правильно декодить.
вообще, там соль не в том, вроде бы

насколько я помню, при переезде с 7 на 8 яву рефакторили security кусок, и при дефолтном конструкторе между 7 и 8 жабой появлялись различия в самом шифре. я уже не помню, помню что сам сталкивался и чинил +- так.

//upd: к теме не относится.
kick, посмотри как выглядит тёмно-синий блок кода в тёмной теме, оно прям вырвиглазно. можешь сделать это прямо на два поста выше. красное и зелёное норм, синее ужасно.
 
@kick, посмотри как выглядит тёмно-синий блок кода в тёмной теме, оно прям вырвиглазно. можешь сделать это прямо на два поста выше. красное и зелёное норм, синее ужасно.
Я знаю как выглядит, тут проблема не как стиля а самого движка и его рендеринга. О данной баге известно:
 
Я знаю как выглядит, тут проблема не как стиля а самого движка и его рендеринга. О данной баге известно:
Оффтоп:
а, тогда вопрос закрываю. я думал что отдельные стили под каждую тему.
 
Назад
Сверху Снизу