Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ARC4加密在服务器端无法正常工作_C#_Encryption - Fatal编程技术网

C# ARC4加密在服务器端无法正常工作

C# ARC4加密在服务器端无法正常工作,c#,encryption,C#,Encryption,我有一个socket.io客户端,它在基于ARC4的加密基础上相互发送数据 我尝试了多种不同的方案,但它总是无法解密任何东西,我不知道为什么 类别:ARC4\u新 public class ARC4_New { private int i; private int j; private byte[] bytes; public const int POOLSIZE = 256; public AR

我有一个socket.io客户端,它在基于ARC4的加密基础上相互发送数据

我尝试了多种不同的方案,但它总是无法解密任何东西,我不知道为什么

类别:
ARC4\u新

    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 DHPublic = System.Numerics.BigInteger.ModPow(DHGenerated, DHPrivate, DHPrimal);
然后我加密这个密钥:

string pkey = EncryptY(CalculatePublic, DHPublic);
(下面是加密的附加代码)

我的客户端发送一个字符串,如:

client.Encrypt(BYTE_HERE);
我的服务器读起来就像:

client.Decrypt(BYTE_HERE);
但它失败了,并得到一个随机的不可读字符串


我做错了什么?

我设法解决了这个问题

出于某种原因,我的服务器过去和现在都在反转我在ARC4客户端中使用的字节

所以我现在简单地将其反转为修补程序

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

我的观点是ARC4_新脚本中有一些错误,但我不确定,这是我第一次接触这种类型的代码。我建议1)为此使用已建立的加密库,如Bouncy Castle,而不是使用自己的加密库,即使您正在实现现有的算法(这不仅是因为可能会出现明显的错误,尤其是允许侧通道攻击的不明显错误)和2)没有使用已知漏洞的算法,RC4就是这样做的。如果由于某个实现在某个地方强制执行某个协议,请考虑使用互操作代码来与本机实现通信。速度较慢,但仍然比重新实现要轻松。我会验证初始化中的字节数组两端是否相同。然后字节状态是相同的。我看不出有什么明显的错误<代码>++这个。我看起来很奇怪,我会使用
(这个.i+1)
以防这里发生奇怪的优化错误,但我对此表示怀疑。一端是32位,另一端是64位吗?我相信他们的优化方式不同。@Rup谢谢你的回答,问题是我反向工程了“服务器”,所以我只能修改客户端。顺便说一句,这两个应用程序都运行64位,强制使用32位或64位并没有解决任何问题。关键是代码中没有错误,因为“封闭源代码客户机”发送数据,而服务器对数据进行解密。我使用100%与服务器完全相同的ARC4类,因为这部分是开源的,但即使在客户端,当我使用:client.Encrypt和the client.decrypt进行解密时,它返回的值与加密之前的值不一样,这是这里的主要问题。应该是吗?您需要为每个加密和解密创建一个新的ARC4:它是一个流密码,因此您需要将流放在同一个位置-您不能只调用client.Encrypt然后client.Decrypt使用同一个客户端。
BigInteger key = System.Numerics.BigInteger.Parse("127458393");
client = new ARC4_New(PrimalDing.ToByteArray());
client.Encrypt(BYTE_HERE);
client.Decrypt(BYTE_HERE);