Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Собственно решил сейчас переписать кодировку пароля в RSA ибо многие используют Mono, которое мне показалось достаточным легаси, чтобы избавиться. Плюс профайлер орет, что там самая большая нагрузка на систему впринципе. Взял BouncyCastle, однако столкнулся с проблемами:
1) Ключ должен быть положительным числом, хотя скрипт с моно работает и с отрицательными
2) Длина шифруемых данных должна быть равна 32 байтам (сцуко кто это придумал nichoci)
Вообщем мб кто-то сталкивался...а у яверов все просто:
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/nopadding");
rsaCipher.init(Cipher.DECRYPT_MODE, client.getRSAPrivateKey());
decrypted = rsaCipher.doFinal(_raw, 0x00, 0x80);
:redlol::redlol::redlol:
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Пойти и выучить, что такое блочное шифрование, а также паддинг/нонпаддинг режимы - тогда станет все сразу ясно и понятно. Смотреть в сторону libcrypto из openssl, it is classic хорошо набивает руку.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
n3k0nation Написал:Пойти и выучить, что такое блочное шифрование, а также паддинг/нонпаддинг режимы - тогда станет все сразу ясно и понятно. Смотреть в сторону libcrypto из openssl, it is classic хорошо набивает руку. Я вкурсе, что такое блочное шифрование и паддинг. И реализацию в openssl тоже видел (для дотнета вообще обертка над нативной дллкой).
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Тогда к чему вопрос о длине шифруемых данных, если есть знание и понимание этого всего?
Zubastic;428058 Написал:1) Ключ должен быть положительным числом, хотя скрипт с моно работает и с отрицательными На счет этого: знака минус не существует, Нео. Это всего лишь интерпретация битового флага для некоторых форматов чисел. Смотри в сторону другого представления числа.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
n3k0nation Написал:Тогда к чему вопрос о длине шифруемых данных, если есть знание и понимание этого всего? К тому, что различные реализации работают по-разному
n3k0nation Написал:На счет этого: знака минус не существует, Нео. Это всего лишь интерпретация битового флага для некоторых форматов чисел. Смотри в сторону другого представления числа. Да это все понятно, вопрос в реализации.
Сообщений: 141
Тем: 9
Зарегистрирован: Sep 2016
Репутация:
175
в исходниках rabbit'a на шарпе есть реализация rsa под l2.
лично я использую следующий код под BouncyCastle.
Юзабилити
Код: using System;
using System.Text;
using Org.BouncyCastle.Crypto.Engines;
namespace L2Network.Core.Crypt
{
public static class RsaCryptService
{
private static ScrambledKeyPair _scrambledPair;
public static void InitRsaCrypt() => _scrambledPair = new ScrambledKeyPair(ScrambledKeyPair.GenKeyPair());
public static ScrambledKeyPair GetScrambledKeyPair() => _scrambledPair;
public static void DecryptRaw(byte[] accNameAndPassCryptedRaw, out string accountName, out string password)
{
var key = GetScrambledKeyPair().PrivateKey;
var rsa = new RSAEngine();
rsa.init(false, key);
var decrypt = rsa.processBlock(accNameAndPassCryptedRaw, 0, 128);
if (decrypt.Length < 128)
{
var temp = new byte[128];
Array.Copy(decrypt, 0, temp, 128 - decrypt.Length, decrypt.Length);
decrypt = temp;
}
accountName = Encoding.ASCII.GetString(decrypt, 94, 14).Replace("\0", "").ToLower();
password = Encoding.ASCII.GetString(decrypt, 108, 16).Replace("\0", "");
}
}
}
Пара
Код: using System;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
namespace L2Network.Core.Crypt
{
public sealed class ScrambledKeyPair
{
public AsymmetricCipherKeyPair Pair { get; }
public AsymmetricKeyParameter PrivateKey;
public byte[] ScrambledModulus;
public ScrambledKeyPair(AsymmetricCipherKeyPair pPair)
{
Pair = pPair;
var publicKey = pPair.getPublic();
var rsaKeyParameters = publicKey as RSAKeyParameters;
if (rsaKeyParameters != null)
ScrambledModulus = ScrambleModulus(rsaKeyParameters.getModulus());
PrivateKey = pPair.getPrivate();
}
public static AsymmetricCipherKeyPair GenKeyPair()
{
var random = new SecureRandom();
var param = new RSAKeyGenerationParameters(BigInteger.valueOf(0x10001L), random, 0x400, 10);
var generator = new RSAKeyPairGenerator();
generator.init(param);
return generator.generateKeyPair();
}
public byte[] ScrambleModulus(BigInteger modulus)
{
int num;
var sourceArray = modulus.toByteArray();
if (sourceArray.Length == 0x81 && sourceArray[0] == 0)
{
var destinationArray = new byte[0x80];
Array.Copy(sourceArray, 1, destinationArray, 0, 0x80);
sourceArray = destinationArray;
}
for (num = 0; num < 4; num++)
{
var num2 = sourceArray[num];
sourceArray[num] = sourceArray[0x4d + num];
sourceArray[0x4d + num] = num2;
}
for (num = 0; num < 0x40; num++)
sourceArray[num] = (byte)(sourceArray[num] ^ sourceArray[0x40 + num]);
for (num = 0; num < 4; num++)
sourceArray[13 + num] = (byte)(sourceArray[13 + num] ^ sourceArray[0x34 + num]);
for (num = 0; num < 0x40; num++)
sourceArray[0x40 + num] = (byte)(sourceArray[0x40 + num] ^ sourceArray[num]);
return sourceArray;
}
}
}
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
09-24-2017, 09:11 PM
(Сообщение последний раз редактировалось: 09-24-2017, 09:12 PM Zubastic.)
Цитата:в исходниках rabbit'a на шарпе есть реализация rsa под l2.
лично я использую следующий код под BouncyCastle.
Я вот хочу использовать реализацию без использования сторонних библиотек...
Добавлено через 52 секунды
Вообще var random = new SecureRandom(); это очень гадкая вещь))
|