使用 JavaScript 扩展 DESKey
DESKey expanding using JavaScript
我正在 Node.js 中实施一个协议。
本协议采用CBC方式的3DES加密,okay
但是为了 encrypt/decrypt 我需要 spread/expand 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 expand/spread
我的实现:
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
怎么了? :/
代码正确,运行正常。
问题出在输入上,我用的是普通数组,不是Buffer。
使用 Buffer 代码可以正常工作。
输入:
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
谢谢!
我正在 Node.js 中实施一个协议。 本协议采用CBC方式的3DES加密,okay
但是为了 encrypt/decrypt 我需要 spread/expand 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 expand/spread
我的实现:
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
怎么了? :/
代码正确,运行正常。
问题出在输入上,我用的是普通数组,不是Buffer。
使用 Buffer 代码可以正常工作。
输入:
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
谢谢!