Exemple #1
0
 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);
     }
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
        }