2

所以一位朋友告诉我游戏是如何被黑的以及该技术是如何工作的。然后他问什么是防止这种攻击的最佳方法。我知道的最直接的方法是 A) 洗牌重要值的位 B) 对值进行散列并每次比较它们(保存分数或金钱的 int 可能很少被检查)。

然后我尝试了 C# 中的实现,我无法重载 = 运算符。我怎样才能做到这一点?

前代码。

class EncryptVal <T>
{
    T v;
    public T operator = (T v2)
    {
        //shuffle bits
    }
    public T operator ()()
    {
        //return unshuffle bits
    }
}
4

6 回答 6

13

您正在寻找implicitandexplicit运算符,而不是说=. 这允许您定义在隐式(即,只是一个赋值)和显式(即,有一个强制转换运算符)强制转换时事情将如何工作。

public static implicit operator Type1(Type2 p) {}
public static explicit operator Type1(Type2 p) {}
于 2009-04-23T12:15:11.487 回答
10

您可以将值封装在类中并重载与类之间的隐式转换:

public class EncryptVal<T> {

    private T _value;

    private EncryptVal(T value) {
        _value = value;
    }

    public static implicit operator EncryptVal<T>(T value) {
        //shuffle bits
        return new EncryptVal<T>(value);
    }

    public static implicit operator T(EncryptVal<T> value) {
        //unshuffle bits
        return value._value;
    }

}

用法:

// implicit conversion from int
EncryptVal<int> e = 42;

// implicit conversion to int
int i = e;
于 2009-04-23T12:26:49.773 回答
2

不允许在 C# 中重载赋值运算符。这是关于它的 MSDN 文档

您必须为此行为创建自己的函数。

于 2009-04-23T12:14:44.747 回答
2

我假设你来自 C++,在那里编写像原始数据类型一样使用的类是很常见的。在 C# 中,您可以更明确地做事。

我会把它写成一个属性或两个方法,例如:

class EncryptVal <T>
{
    T v;
    public T Value
    {
      get
      {
        //return unshuffle bits
      }
      set
      {
        //shuffle bits
      }
    }
}
于 2009-04-23T12:15:45.757 回答
0

不要使用 = 来设置值。你不能超载分配。

您可以做的就是将其隐藏在属性后面。

int _encyptedValue;
Public int myInt
{
    get
    {
        return Decrypt(_encryptedValue);
    }
    set
    {
         _encryptedValue = Encrypt(value);
    }
}

你可以选择你的解密/加密

于 2009-04-23T12:25:10.713 回答
0

我会为实现部分进行隐式/显式运算符重载。

可能是显式的,因为您的转换会进行繁重的处理,并且最终可能会失败。

我只想补充一点,洗牌似乎只是一种混淆技术,如果你有对你的游戏感兴趣的黑客,它肯定不会持续很长时间。您可能需要更强大的加密技术来保护您的数据,但需要更多的上下文。

于 2009-04-23T12:25:41.990 回答