使用JavaScript扩展DESKey

我在Node.js中实现一个协议 该协议在CBC模式下使用3DESencryption,没关系。

但要encryption/解密,我需要扩大/扩大14个字节的DES密钥到16个字节只是添加奇偶校验位。 但。 我坚持使用JavaScript / Node.js。

我有一些使用C和Python的实现,任何人都可以帮助我使用JavaScript / Node.js(我的试用版下面)做同样的事情?

uint8 *des_key_spread(uint8 *normal){ static uint8 spread[16]; spread[ 0] = normal[ 0] & 0xfe; spread[ 1] = ((normal[ 0] << 7) | (normal[ 1] >> 1)) & 0xfe; spread[ 2] = ((normal[ 1] << 6) | (normal[ 2] >> 2)) & 0xfe; spread[ 3] = ((normal[ 2] << 5) | (normal[ 3] >> 3)) & 0xfe; spread[ 4] = ((normal[ 3] << 4) | (normal[ 4] >> 4)) & 0xfe; spread[ 5] = ((normal[ 4] << 3) | (normal[ 5] >> 5)) & 0xfe; spread[ 6] = ((normal[ 5] << 2) | (normal[ 6] >> 6)) & 0xfe; spread[ 7] = normal[ 6] << 1; spread[ 8] = normal[ 7] & 0xfe; spread[ 9] = ((normal[ 7] << 7) | (normal[ 8] >> 1)) & 0xfe; spread[10] = ((normal[ 8] << 6) | (normal[ 9] >> 2)) & 0xfe; spread[11] = ((normal[ 9] << 5) | (normal[10] >> 3)) & 0xfe; spread[12] = ((normal[10] << 4) | (normal[11] >> 4)) & 0xfe; spread[13] = ((normal[11] << 3) | (normal[12] >> 5)) & 0xfe; spread[14] = ((normal[12] << 2) | (normal[13] >> 6)) & 0xfe; spread[15] = normal[13] << 1; des_key_parity_adjust(spread, 16); return spread; } void des_key_parity_adjust(uint8 *key, uint8 len){ uint8 i, j, parity; for (i = 0; i < len; i++){ parity = 1; for (j = 1; j < 8; j++) if ((key[i] >> j) & 0x1) parity = ~parity & 0x01; key[i] |= parity; } } 

从这里Python扩展/传播

我的实现:

 function deskey_spread(normal){ spread = new Buffer(16); spread[ 0] = normal[ 0] & 0xfe; spread[ 1] = ((normal[ 0] << 7) | (normal[ 1] >> 1)) & 0xfe; spread[ 2] = ((normal[ 1] << 6) | (normal[ 2] >> 2)) & 0xfe; spread[ 3] = ((normal[ 2] << 5) | (normal[ 3] >> 3)) & 0xfe; spread[ 4] = ((normal[ 3] << 4) | (normal[ 4] >> 4)) & 0xfe; spread[ 5] = ((normal[ 4] << 3) | (normal[ 5] >> 5)) & 0xfe; spread[ 6] = ((normal[ 5] << 2) | (normal[ 6] >> 6)) & 0xfe; spread[ 7] = normal[ 6] << 1; spread[ 8] = normal[ 7] & 0xfe; spread[ 9] = ((normal[ 7] << 7) | (normal[ 8] >> 1)) & 0xfe; spread[10] = ((normal[ 8] << 6) | (normal[ 9] >> 2)) & 0xfe; spread[11] = ((normal[ 9] << 5) | (normal[10] >> 3)) & 0xfe; spread[12] = ((normal[10] << 4) | (normal[11] >> 4)) & 0xfe; spread[13] = ((normal[11] << 3) | (normal[12] >> 5)) & 0xfe; spread[14] = ((normal[12] << 2) | (normal[13] >> 6)) & 0xfe; spread[15] = normal[13] << 1; des_key_parity_adjust(spread, 16); return spread; } function des_key_parity_adjust(key, len){ var i = new Buffer(1); var j = new Buffer(1); var parity = new Buffer(1); for (i = 0; i < len; i++){ parity = 1; for (j = 1; j < 8; j++) if ((key[i] >> j) & 0x1) parity = ~parity & 0x01; key[i] |= parity; } } 

我的意见:

 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 

使用C实现的输出:

 01 80 80 61 40 29 19 0E 08 04 45 02 10 91 4C 29 

和我的Node.js实现:

 01 80 80 61 40 29 19 0e 08 04 43 40 b0 61 34 1c 

怎么了? :/

该代码是正确的,并正常工作。

问题是input,我使用了一个正常的数组,而不是一个缓冲区。

使用缓冲区代码正常工作。

input:

 01 80 80 61 40 29 19 0E 08 04 45 02 10 91 4C 29 

使用C代码:

 01 80 80 61 40 29 19 0E 08 04 45 02 10 91 4C 29 

使用我的Node.js实现

 01 80 80 61 40 29 19 0E 08 04 45 02 10 91 4C 29 

谢谢!

Interesting Posts