⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blowfishecb.cs

📁 source for advanced algorithm
💻 CS
📖 第 1 页 / 共 3 页
字号:
            block = this.block;
        
            block[0] = (byte)(hi >> 24);  
            block[1] = (byte)(hi >> 16);  
            block[2] = (byte)(hi >>  8);  
            block[3] = (byte) hi; 
            block[4] = (byte)(lo >> 24);  
            block[5] = (byte)(lo >> 16);  
            block[6] = (byte)(lo >>  8);  
            block[7] = (byte) lo; 

            Encrypt(block, 0, block, 0, BLOCK_SIZE);

            outHi = (((uint)block[0]) << 24) |
                    (((uint)block[1]) << 16) |
                    (((uint)block[2]) <<  8) |
                            block[3];

            outLo = (((uint)block[4]) << 24) |
                    (((uint)block[5]) << 16) |
                    (((uint)block[6]) <<  8) |
                            block[7];
        }

        /// <summary>Decrypts a single block.</summary>
        /// <param name="hi">The high 32bit word of the block.</param>
        /// <param name="lo">The low 32bit word of the block.</param>
        /// <param name="outHi">Where to put the decrypted high word.</param>
        /// <param name="outLo">Where to put the decrypted low word.</param>
        public void DecryptBlock(
            uint hi,
            uint lo,
            out uint outHi,
            out uint outLo)
        {
            byte[] block;

            block = this.block;
        
            block[0] = (byte)(hi >> 24);  
            block[1] = (byte)(hi >> 16);  
            block[2] = (byte)(hi >>  8);  
            block[3] = (byte) hi; 
            block[4] = (byte)(lo >> 24);  
            block[5] = (byte)(lo >> 16);  
            block[6] = (byte)(lo >>  8);  
            block[7] = (byte) lo; 

            Decrypt(block, 0, block, 0, BLOCK_SIZE);

            outHi = (((uint)block[0]) << 24) |
                    (((uint)block[1]) << 16) |
                    (((uint)block[2]) <<  8) |
                            block[3];

            outLo = (((uint)block[4]) << 24) |
                    (((uint)block[5]) << 16) |
                    (((uint)block[6]) <<  8) |
                            block[7];
        }

        /// <summary>Encrypts byte buffers.</summary>
        /// <remarks>Use this method to encrypt bytes from one array to another one. You can also 
        /// use the same array for input and output. Note that the number of bytes must be adjusted
        /// to the block size of the algorithm. Overlapping bytes will not be encrypted. No check for
        /// buffer overflows are made.</remarks>
        /// <param name="dataIn">The input buffer.</param>
        /// <param name="posIn">Where to start reading in the input buffer.</param>
        /// <param name="dataOut">The output buffer.</param>
        /// <param name="posOut">Where to start writing to the output buffer.</param>
        /// <param name="count">The number ob bytes to encrypt.</param>
        /// <returns>The number of bytes processed.</returns>
        public int Encrypt(
            byte[] dataIn,
            int posIn,
            byte[] dataOut,
            int posOut,
            int count) 
        {
            int end;
            uint hi, lo;
            
            uint[] sbox1 = this.sbox1;
            uint[] sbox2 = this.sbox2;
            uint[] sbox3 = this.sbox3;
            uint[] sbox4 = this.sbox4;

            uint[] pbox = this.pbox;

            uint pbox00 = pbox[ 0];
            uint pbox01 = pbox[ 1];
            uint pbox02 = pbox[ 2];
            uint pbox03 = pbox[ 3];
            uint pbox04 = pbox[ 4];
            uint pbox05 = pbox[ 5];
            uint pbox06 = pbox[ 6];
            uint pbox07 = pbox[ 7];
            uint pbox08 = pbox[ 8];
            uint pbox09 = pbox[ 9];
            uint pbox10 = pbox[10];
            uint pbox11 = pbox[11];
            uint pbox12 = pbox[12];
            uint pbox13 = pbox[13];
            uint pbox14 = pbox[14];
            uint pbox15 = pbox[15];
            uint pbox16 = pbox[16];
            uint pbox17 = pbox[17];

            count &= ~(BLOCK_SIZE - 1);

            end = posIn + count;

            while (posIn < end)
            {
                hi = (((uint)dataIn[posIn    ]) << 24) |
                     (((uint)dataIn[posIn + 1]) << 16) |
                     (((uint)dataIn[posIn + 2]) <<  8) |
                             dataIn[posIn + 3];
 
                lo = (((uint)dataIn[posIn + 4]) << 24) |
                     (((uint)dataIn[posIn + 5]) << 16) |
                     (((uint)dataIn[posIn + 6]) <<  8) |
                             dataIn[posIn + 7];
                posIn += 8; 

                hi ^= pbox00;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox01;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox02;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox03;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox04;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox05;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox06;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox07;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox08;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox09;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox10;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox11;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox12;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox13;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox14;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox15;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox16;

                lo ^= pbox17;

                dataOut[posOut    ] = (byte)(lo >> 24);
                dataOut[posOut + 1] = (byte)(lo >> 16);
                dataOut[posOut + 2] = (byte)(lo >>  8);
                dataOut[posOut + 3] = (byte) lo;
                
                dataOut[posOut + 4] = (byte)(hi >> 24);
                dataOut[posOut + 5] = (byte)(hi >> 16);
                dataOut[posOut + 6] = (byte)(hi >>  8);
                dataOut[posOut + 7] = (byte) hi;

                posOut += 8;
            }

            return count;
        }

        /// <summary>Decrypts single bytes.</summary>
        /// <remarks>Use this method to decrypt bytes from one array to another one. You can also use
        /// the same array for input and output. Note that the number of bytes must be adjusted to the
        /// block size of the algorithm. Overlapping bytes will not be decrypted. No check for buffer
        /// overflows are made.</remarks>
        /// <param name="dataIn">The input buffer.</param>
        /// <param name="posIn">Where to start reading in the input buffer.</param>
        /// <param name="dataOut">The output buffer.</param>
        /// <param name="posOut">Where to start writing to the output buffer.</param>
        /// <param name="count">Number ob bytes to decrypt.</param>
        /// <returns>The number of bytes processed.</returns>
        public int Decrypt(
            byte[] dataIn,
            int posIn,
            byte[] dataOut,
            int posOut,
            int count) 
        {
            int end;
            uint hi, lo;
            
            uint[] sbox1 = this.sbox1;
            uint[] sbox2 = this.sbox2;
            uint[] sbox3 = this.sbox3;
            uint[] sbox4 = this.sbox4;

            uint[] pbox = this.pbox;

            uint pbox00 = pbox[ 0];
            uint pbox01 = pbox[ 1];
            uint pbox02 = pbox[ 2];
            uint pbox03 = pbox[ 3];
            uint pbox04 = pbox[ 4];
            uint pbox05 = pbox[ 5];
            uint pbox06 = pbox[ 6];
            uint pbox07 = pbox[ 7];
            uint pbox08 = pbox[ 8];
            uint pbox09 = pbox[ 9];
            uint pbox10 = pbox[10];
            uint pbox11 = pbox[11];
            uint pbox12 = pbox[12];
            uint pbox13 = pbox[13];
            uint pbox14 = pbox[14];
            uint pbox15 = pbox[15];
            uint pbox16 = pbox[16];
            uint pbox17 = pbox[17];

            count &= ~(BLOCK_SIZE - 1);

            end = posIn + count;

            while (posIn < end)
            {
                hi = (((uint)dataIn[posIn    ]) << 24) |
                     (((uint)dataIn[posIn + 1]) << 16) |
                     (((uint)dataIn[posIn + 2]) <<  8) |
                             dataIn[posIn + 3];
 
                lo = (((uint)dataIn[posIn + 4]) << 24) |
                     (((uint)dataIn[posIn + 5]) << 16) |
                     (((uint)dataIn[posIn + 6]) <<  8) |
                             dataIn[posIn + 7];
                posIn += 8; 

                hi ^= pbox17;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox16;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox15;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox14;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox13;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox12;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox11;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox10;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox09;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox08;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox07;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox06;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox05;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox04;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox03;
                lo ^= (((sbox1[(int)(hi >> 24)] + sbox2[(int)((hi >> 16) & 0x0ff)]) ^ sbox3[(int)((hi >> 8) & 0x0ff)]) + sbox4[(int)(hi & 0x0ff)]) ^ pbox02;
                hi ^= (((sbox1[(int)(lo >> 24)] + sbox2[(int)((lo >> 16) & 0x0ff)]) ^ sbox3[(int)((lo >> 8) & 0x0ff)]) + sbox4[(int)(lo & 0x0ff)]) ^ pbox01;

                lo ^= pbox00;
                
                dataOut[posOut    ] = (byte)(lo >> 24);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -