【发布时间】:2014-12-06 03:53:02
【问题描述】:
Schneier 发帖https://www.schneier.com/paper-pseudorandom-sequence.html:
int VERYRANDOM() {
static unsigned long regA, regB, regC;
/*regA, regB, and regC should be initialized with some random value.*/
regA = ((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA<<1)^regA)
& 0x00000001)<<31) | (regA>>1);
regB = ((((regB>>30)^(regB>>2)) & 0x00000001)<<30) | (regB>>1);
regC = ((((regC>>28)^(regC>>1)) & 0x00000001)<<28) | (regC>>1);
/*regB is a 31-bit LFSR. regC is a 29-bit LFSR.*/
/*Both feedback sequences are chosen to be maximum length.*/
return ((regA & regB) | (!regA & regC)) & 0x00000001;
/*Above is equivalant to: if A then return B else return C.*/
/* Variants: return ((regA & regB) | (regA & regC) | (regB & regC)) &
0x00000001; Above variant returns the majority of A, B, and C.
return (regA ^ regB ^ regC) & 0x00000001;
Above variant returns the XOR of A, B, and C. */
}
最后警告不要盲目地选择不同的反馈顺序。为了避免走上这样的死胡同,我阅读了 LFSR 和定义它们的多项式。
在一个地方,http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr.htm 非常友好地列出了针对任何抽头的最大长度多项式(为了清晰起见,由于可以选择更多抽头,因此对其进行了删节)。对于 32 位 LFSR,我不明白 Schneier 从哪里得到多项式:
regA = ((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA<<1)^regA)
& 0x00000001)<<31) | (regA>>1);
根据 LFSR 上的维基百科,等效多项式将是:
//Fibonacci x^1 x^26 x^28 x^30 x^31 x^32
regA = ((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA<<1)^regA)
& 0x00000001)<<31) | (regA>>1);
不在桌子上:
[32、31、30、29、5、1]
[32、31、30、28、27、3]
[32、31、30、28、26、13]
[32、31、30、28、23、21]
[32、31、30、28、23、18]
[32、31、30、28、20、15]
[32、31、30、28、20、3]
[32、31、30、28、19、2]
[32、31、30、28、19、1]
[32、31、30、28、17、9]
[32、31、30、28、17、4]
[32、31、30、28、17、3]
[32、31、30、28、15、5]
[32、31、30、28、14、2]
[32、31、30、28、12、9]
[32、31、30、28、10、7]
[32, 31, 30, 27, 26, 9]
我不想在学习加密的基础知识时误解任何东西,为什么我不明白呢?在尝试应用维基百科示例中的术语之前,我已经诊断多项式为:
// 25 27 29 30 31
regA = ((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA<<1)^regA)
& 0x00000001)<<31) | (regA>>1);
但它是对(最左边的)MSbit 进行异或运算,然后下落不明,此外,奇数的抽头肯定表明我错了。
多项式的维基百科翻译是:
/* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
我猜维基百科和 newwaveinstruments 使用不同的术语,但如果我无法破译它是什么,我就会忘记理解密码学。
【问题讨论】:
-
目前我只能投赞成票,但如果您想了解密码学,那么您首先需要了解这不是加密。永远不要忘记添加语言标签;如果您认为您的问题可以不使用它们:请改用crypto.stackexchange.com。
-
我无法回答您的问题,但我认为代码中有错字(错字在 Schneier 的文章中)。我认为代码
((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA<<1)^regA)应该是((((regA>>31)^(regA>>6)^(regA>>4)^(regA>>2)^(regA>>1)^regA)。也就是说,最后的移位操作应该是右移而不是左移。 -
迈克尔·伯尔是对的。这只是一个印刷错误。在 Schneier 的同一篇文章中将其与 RANDOM 进行比较。其次,LFSR 没有周期 2^32 - 1。只需将 regA 分配给任何非零值并循环,直到获得相同的值。周期为 0x5553EAAA = 1,431,562,922。 Schneier 的工作从未给人留下深刻印象。
标签: c random cryptography xor prng