public static void Des(byte[] from, byte[] to, int length, D3DesKey key) { UInt32[] work = new UInt32[2]; for (int i = 0; i < length; i += 8) { Scrunch(from, (UInt32)i, work); DesFunc(work, key); UnScrun(work, to, (UInt32)i); } }
public static void EncryptBytes(byte[] bytes, string passwd) { byte[] rawKey = new byte[MaxPasswdLen]; for (int i = 0; i < MaxPasswdLen; i++) { if (i < passwd.Length) { rawKey[i] = (byte)passwd[i]; } else { rawKey[i] = 0; } } D3DesKey key = new D3DesKey(rawKey, EncryptMode.EN0); D3Des.Des(bytes, bytes, RfbSize.AuthChallenge, key); }
private static void DesFunc(UInt32[] block, D3DesKey key) { UInt32 work; UInt32 leftt = block[0]; UInt32 right = block[1]; work = ((leftt >> 4) ^ right) & 0x0F0F0F0F; right ^= work; leftt ^= (work << 4); work = ((leftt >> 16) ^ right) & 0x0000FFFF; right ^= work; leftt ^= (work << 16); work = ((right >> 2) ^ leftt) & 0x33333333; leftt ^= work; right ^= (work << 2); work = ((right >> 8) ^ leftt) & 0x00FF00FF; leftt ^= work; right ^= (work << 8); right = ((right << 1) | ((right >> 31) & 1)) & 0xFFFFFFFF; work = (leftt ^ right) & 0xAAAAAAAA; leftt ^= work; right ^= work; leftt = ((leftt << 1) | ((leftt >> 31) & 1)) & 0xFFFFFFFF; int keyIndex = 0; for (int round = 0; round < 8; round++) { UInt32 fval; work = (right << 28) | (right >> 4); work ^= key[keyIndex++]; fval = sp7[work & 0x3F]; fval |= sp5[(work >> 8) & 0x3F]; fval |= sp3[(work >> 16) & 0x3F]; fval |= sp1[(work >> 24) & 0x3F]; work = right ^ key[keyIndex++]; fval |= sp8[work & 0x3F]; fval |= sp6[(work >> 8) & 0x3F]; fval |= sp4[(work >> 16) & 0x3F]; fval |= sp2[(work >> 24) & 0x3F]; leftt ^= fval; work = (leftt << 28) | (leftt >> 4); work ^= key[keyIndex++]; fval = sp7[work & 0x3F]; fval |= sp5[(work >> 8) & 0x3F]; fval |= sp3[(work >> 16) & 0x3F]; fval |= sp1[(work >> 24) & 0x3F]; work = leftt ^ key[keyIndex++]; fval |= sp8[work & 0x3F]; fval |= sp6[(work >> 8) & 0x3F]; fval |= sp4[(work >> 16) & 0x3F]; fval |= sp2[(work >> 24) & 0x3F]; right ^= fval; } right = (right << 31) | (right >> 1); work = (leftt ^ right) & 0xAAAAAAAA; leftt ^= work; right ^= work; leftt = (leftt << 31) | (leftt >> 1); work = ((leftt >> 8) ^ right) & 0x00FF00FF; right ^= work; leftt ^= (work << 8); work = ((leftt >> 2) ^ right) & 0x33333333; right ^= work; leftt ^= (work << 2); work = ((right >> 16) ^ leftt) & 0x0000FFFF; leftt ^= work; right ^= (work << 16); work = ((right >> 4) ^ leftt) & 0x0F0F0F0F; leftt ^= work; right ^= (work << 4); block[0] = right; block[1] = leftt; }