C# ARC4加密在服务器端无法正常工作
我有一个socket.io客户端,它在基于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
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);