static AriaEngine() {
if(log.IsInfoEnabled)
log.Info("Aria 암호화 Engine을 초기화합니다...");
var expArr = new int[DefaultAriaKeySize];
var logArr = new int[DefaultAriaKeySize];
expArr[0] = 1;
for(var i = 1; i < DefaultAriaKeySize; i++) {
var j = (expArr[i - 1] << 1) ^ expArr[i - 1];
if((j & 0x100) != 0)
j ^= 0x11b;
expArr[i] = j;
}
for(var i = 1; i < 255; i++)
logArr[expArr[i]] = i;
int[][] A = {
new[] { 1, 0, 0, 0, 1, 1, 1, 1 },
new[] { 1, 1, 0, 0, 0, 1, 1, 1 },
new[] { 1, 1, 1, 0, 0, 0, 1, 1 },
new[] { 1, 1, 1, 1, 0, 0, 0, 1 },
new[] { 1, 1, 1, 1, 1, 0, 0, 0 },
new[] { 0, 1, 1, 1, 1, 1, 0, 0 },
new[] { 0, 0, 1, 1, 1, 1, 1, 0 },
new[] { 0, 0, 0, 1, 1, 1, 1, 1 }
};
int[][] B = {
new[] { 0, 1, 0, 1, 1, 1, 1, 0 },
new[] { 0, 0, 1, 1, 1, 1, 0, 1 },
new[] { 1, 1, 0, 1, 0, 1, 1, 1 },
new[] { 1, 0, 0, 1, 1, 1, 0, 1 },
new[] { 0, 0, 1, 0, 1, 1, 0, 0 },
new[] { 1, 0, 0, 0, 0, 0, 0, 1 },
new[] { 0, 1, 0, 1, 1, 1, 0, 1 },
new[] { 1, 1, 0, 1, 0, 0, 1, 1 }
};
for(var i = 0; i < DefaultAriaKeySize; i++) {
var t = 0;
var p = (i == 0) ? 0 : expArr[255 - logArr[i]];
for(var j = 0; j < 8; j++) {
var s = 0;
for(var k = 0; k < 8; k++) {
if(((p >> (7 - k)) & 0x01) != 0)
s ^= A[k][j];
}
t = (t << 1) ^ s;
}
t ^= 0x63;
S1[i] = (byte)t;
X1[t] = (byte)i;
}
for(var i = 0; i < DefaultAriaKeySize; i++) {
var t = 0;
var p = i == 0 ? 0 : expArr[(247 * logArr[i]) % 255];
for(var j = 0; j < 8; j++) {
var s = 0;
for(var k = 0; k < 8; k++) {
if(((p >> k) & 0x01) != 0)
s ^= B[7 - j][k];
}
t = (t << 1) ^ s;
}
t ^= 0xe2;
S2[i] = (byte)t;
X2[t] = (byte)i;
}
for(var i = 0; i < DefaultAriaKeySize; i++) {
TS1[i] = 0x00010101 * (S1[i] & 0xff);
TS2[i] = 0x01000101 * (S2[i] & 0xff);
TX1[i] = 0x01010001 * (X1[i] & 0xff);
TX2[i] = 0x01010100 * (X2[i] & 0xff);
}
if(log.IsInfoEnabled)
log.Info("Aria 암호화 Engine을 초기화했습니다!!!");
}