static private Permutation ( byte input, byte output, uint permTab, bool preSwap ) : void | ||
input | byte | |
output | byte | |
permTab | uint | |
preSwap | bool | |
리턴 | void |
internal static void Permutation (byte[] input, byte[] output, uint[] permTab, bool preSwap)
{
if (preSwap && BitConverter.IsLittleEndian)
BSwap (input);
int offs1 = (((int)(input [0]) >> 4)) << 1;
int offs2 = (1 << 5) + ((((int)input [0]) & 0xF) << 1);
uint d1 = permTab [offs1++] | permTab [offs2++];
uint d2 = permTab [offs1] | permTab [offs2];
int max = BLOCK_BYTE_SIZE << 1;
for (int i = 2, indx = 1; i < max; i += 2, indx++) {
int ii = (int) input [indx];
offs1 = (i << 5) + ((ii >> 4) << 1);
offs2 = ((i + 1) << 5) + ((ii & 0xF) << 1);
d1 |= permTab [offs1++] | permTab [offs2++];
d2 |= permTab [offs1] | permTab [offs2];
}
if (preSwap || !BitConverter.IsLittleEndian) {
output [0] = (byte) (d1);
output [1] = (byte) (d1 >> 8);
output [2] = (byte) (d1 >> 16);
output [3] = (byte) (d1 >> 24);
output [4] = (byte) (d2);
output [5] = (byte) (d2 >> 8);
output [6] = (byte) (d2 >> 16);
output [7] = (byte) (d2 >> 24);
}
else {
output [0] = (byte) (d1 >> 24);
output [1] = (byte) (d1 >> 16);
output [2] = (byte) (d1 >> 8);
output [3] = (byte) (d1);
output [4] = (byte) (d2 >> 24);
output [5] = (byte) (d2 >> 16);
output [6] = (byte) (d2 >> 8);
output [7] = (byte) (d2);
}
}
// note: this method is garanteed to be called with a valid blocksize // for both input and output protected override void ECB(byte[] input, byte[] output) { DESTransform.Permutation(input, output, DESTransform.ipTab, false); if (encrypt) { E1.ProcessBlock(output, output); D2.ProcessBlock(output, output); E3.ProcessBlock(output, output); } else { D1.ProcessBlock(output, output); E2.ProcessBlock(output, output); D3.ProcessBlock(output, output); } DESTransform.Permutation(output, output, DESTransform.fpTab, true); }