ARC4 шифрование не работает правильно на стороне сервера - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть клиент socket.io, который отправляет данные друг другу, где шифрование основано на ARC4.

Я пробовал несколько разных сценариев, но он не может ничего расшифровать, и я не уверен, почему.

Класс: ARC4_New

    public class ARC4_New
    {
        private int i;
        private int j;
        private byte[] bytes;

        public const int POOLSIZE = 256;

        public ARC4_New()
        {
            bytes = new byte[POOLSIZE];
        }

        public ARC4_New(byte[] key)
        {
            bytes = new byte[POOLSIZE];
            this.Initialize(key);
        }

        public void Initialize(byte[] key)
        {
            this.i = 0;
            this.j = 0;

            for (i = 0; i < POOLSIZE; ++i)
            {
                this.bytes[i] = (byte)i;
            }

            for (i = 0; i < POOLSIZE; ++i)
            {
                j = (j + bytes[i] + key[i % key.Length]) & (POOLSIZE - 1);
                this.Swap(i, j);
            }

            this.i = 0;
            this.j = 0;
        }

        private void Swap(int a, int b)
        {
            byte t = this.bytes[a];
            this.bytes[a] = this.bytes[b];
            this.bytes[b] = t;
        }

        public byte Next()
        {
            this.i = ++this.i & (POOLSIZE - 1);
            this.j = (this.j + this.bytes[i]) & (POOLSIZE - 1);
            this.Swap(i, j);
            return this.bytes[(this.bytes[i] + this.bytes[j]) & 255];
        }

        public void Encrypt(ref byte[] src)
        {
            for (int k = 0; k < src.Length; k++)
            {
                src[k] ^= this.Next();
            }
        }

        public void Decrypt(ref byte[] src)
        {
            this.Encrypt(ref src);
        }
    }

        public System.Numerics.BigInteger RandomInteger(int bitSize)
        {
            var integerData = new byte[bitSize / 8];
            _numberGenerator.NextBytes(integerData);

            integerData[integerData.Length - 1] &= 0x7f;
            return new System.Numerics.BigInteger(integerData);
        }

Мой скрипт, который генерирует ключ:

System.Numerics.BigInteger DHPrivate = RandomInteger(256);
System.Numerics.BigInteger DHPrimal = RandomInteger(256);
System.Numerics.BigInteger DHGenerated = RandomInteger(256);
if (DHGenerated > DHPrimal)
{
     System.Numerics.BigInteger tempG = DHGenerated;
     DHGenerated= DHPrimal;
     DHPrimal = tempG;
}

Затем с этими значениями я генерирую открытый ключ:

System.Numerics.BigInteger DHPublic = System.Numerics.BigInteger.ModPow(DHGenerated, DHPrivate, DHPrimal);

Затем я шифрую этот ключ:

string pkey = EncryptY(CalculatePublic, DHPublic);

(Дополнительный код для шифрования ниже)


        protected virtual string EncryptY(Func<System.Numerics.BigInteger, System.Numerics.BigInteger> calculator, System.Numerics.BigInteger value)
        {
            byte[] valueData = Encoding.UTF8.GetBytes(value.ToString());
            valueData = PKCSPad(valueData);

            Array.Reverse(valueData);
            var paddedInteger = new System.Numerics.BigInteger(valueData);

            System.Numerics.BigInteger calculatedInteger = calculator(paddedInteger);
            byte[] paddedData = calculatedInteger.ToByteArray();
            Array.Reverse(paddedData);

            string encryptedValue = Utils.Converter.BytesToHexString(paddedData).ToLower();
            return encryptedValue.StartsWith("00") ? encryptedValue.Substring(2) : encryptedValue;
        }

        protected virtual byte[] PKCSPad(byte[] data)
        {
            var buffer = new byte[128 - 1];
            int dataStartPos = (buffer.Length - data.Length);

            buffer[0] = (byte)Padding;
            Buffer.BlockCopy(data, 0, buffer, dataStartPos, data.Length);

            int paddingEndPos = (dataStartPos - 1);
            bool isRandom = (Padding == PKCSPadding.RandomByte);
            for (int i = 1; i < paddingEndPos; i++)
            {
                buffer[i] = (byte)(isRandom ?
                    _numberGenerator.Next(1, 256) : byte.MaxValue);
            }
            return buffer;
        }

После всего этого я отправил на сервер строку PKEY.

И после расшифровки строки сервер получает открытый ключ, например: 127458393

Когда я соединяю клиента и сервер, используя: 127458393

Как:

BigInteger key = System.Numerics.BigInteger.Parse("127458393");
client = new ARC4_New(PrimalDing.ToByteArray());

Мой клиент отправляет строку вроде:

client.Encrypt(BYTE_HERE);

И мой сервер читает это как:

client.Decrypt(BYTE_HERE);

Но он терпит неудачу и получает случайную нечитаемую строку.

Что я здесь не так делаю?

1 Ответ

1 голос
/ 24 апреля 2019

Мне удалось решить проблему

По какой-то причине мой сервер переставил и переворачивает байты, которые я использовал в клиенте ARC4 ..

Так что я просто отменил его сейчас как исправление

System.Numerics.BigInteger temp = System.Numerics.BigInteger.Parse (textBox1.Text);client = new ARC4_New (temp.ToByteArray (). Reverse (). ToArray ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...