generateWorkingKey static method
The 32 round-key words of Bouncy Castle's generateWorkingKey.
Implementation
static List<int> generateWorkingKey(bool encrypting, Uint8List key) {
if (key.length < 8) {
throw ArgumentError('Chave DES deve ter 8 bytes.');
}
final newKey = Uint32List(32);
final pc1m = List<bool>.filled(56, false);
final pcr = List<bool>.filled(56, false);
for (int j = 0; j < 56; j++) {
final l = _pc1[j];
pc1m[j] = (key[l >> 3] & _bytebit[l & 7]) != 0;
}
for (int i = 0; i < 16; i++) {
final m = encrypting ? i << 1 : (15 - i) << 1;
final n = m + 1;
int km = 0;
int kn = 0;
for (int j = 0; j < 28; j++) {
final l = j + _totrot[i];
pcr[j] = l < 28 ? pc1m[l] : pc1m[l - 28];
}
for (int j = 28; j < 56; j++) {
final l = j + _totrot[i];
pcr[j] = l < 56 ? pc1m[l] : pc1m[l - 28];
}
for (int j = 0; j < 24; j++) {
if (pcr[_pc2[j]]) km |= _bigbyte[j];
if (pcr[_pc2[j + 24]]) kn |= _bigbyte[j];
}
newKey[m] = km;
newKey[n] = kn;
}
for (int i = 0; i != 32; i += 2) {
final i1 = newKey[i];
final i2 = newKey[i + 1];
newKey[i] = (((i1 & 0x00fc0000) << 6) |
((i1 & 0x00000fc0) << 10) |
((i2 & 0x00fc0000) >> 10) |
((i2 & 0x00000fc0) >> 6)) &
0xFFFFFFFF;
newKey[i + 1] = (((i1 & 0x0003f000) << 12) |
((i1 & 0x0000003f) << 16) |
((i2 & 0x0003f000) >> 4) |
(i2 & 0x0000003f)) &
0xFFFFFFFF;
}
return newKey;
}