我正在使用C#。
我试图创建一种强力键。 我需要创建3个键,如下所示:
([0-2,1-255,1-300],[0-2,1-255,1-300],[0-2,1-255,1-300])
要尝试解密我的消息,如果它不正确以保留到下一个键,I.e:
第一把钥匙:([0,1,1],[0,1,1],[0,1,1])
第二个关键:([0,1,1],[0,1,1],[0,1,2])
创建密钥的最佳方法是什么?因为我尝试过的任何东西都不适合我。
这是我的密钥的结构:
struct Key
{
public byte code;
public byte param;
public uint len;
};
谢谢!
答案 0 :(得分:2)
蛮力方法是使用9个嵌套循环。 9个嵌套的循环很难看。由于这三个键具有相同的结构,因此您可以创建一个包含一个键的所有可能组合的数组(3 x 255 x 300 = 229500)。这不是太大。然后使用三个嵌套循环,在此数组中选择3个键。 Adavantage:你只需要创建一次密钥;这加快了检查3个键的组合。
const int N = 3 * 255 * 300;
// Create the keys
var keys = new Key[N];
int i = 0;
for (byte c = 0; c <= 2; c++) {
for (int p = 1; p <= 255; p++) { // int because byte overflows after last loop.
for (uint l = 1; l <= 300; l++) {
keys[i++] = new Key { code = c, param = (byte)p, len = l };
}
}
}
// Select 3 keys
for (i = 0; i < N; i++) {
Key k1 = keys[i];
for (int j = 0; j < N; j++) {
Key k2 = keys[j];
for (int k = 0; k < N; k++) {
Key k3 = keys[k];
// Do something with k1, k2, k3
}
}
}
请注意,如果我们将p
声明为byte
,那么应该是最后一个循环,p
为255
,它会再次递增并变为{{1} (因为[0 ... 255]是0
)的范围。因此,循环永远不会终止。
由于229500 3 ≈1.2* 10 16 (美国系统中12个四分之一)组合,它可能会持续几个月直到程序结束!看看How to: Write a Simple Parallel.For Loop。
覆盖结构byte
中的ToString
只需要调试。
Key