private Bit[] UnboxingFourBits(Bit[] sixBits, int boxIndex) { Bit[] binRow = { sixBits.First(), sixBits.Last() }; Bit[] binCol = { sixBits[1], sixBits[2], sixBits[3], sixBits[4] }; int decRow = BinaryNumbersMapper.TwoBitsDecimalMapping[binRow]; int decCol = BinaryNumbersMapper.FourBitsDecimalMapping[binCol]; SBox sBox = SBoxMapper.S[boxIndex]; byte decSBoxEquivalent = sBox[decRow][decCol]; Bit[] strippedBits = StripFourBits(decSBoxEquivalent); return(strippedBits); }
private void SKS(WUPfunc wup, SBox S, uint[] w, uint w0, uint w1, uint w2, uint w3, int i0, int i1, int i2, int i3, int ofs) { wup(w, ofs); uint[] r = new uint[5]; r[0] = w[w0]; r[1] = w[w1]; r[2] = w[w2]; r[3] = w[w3]; r[4] = 0; S(ref r[0], ref r[1], ref r[2], ref r[3], ref r[4]); serpent24SubKeys[ofs] = r[i0]; serpent24SubKeys[ofs + 1] = r[i1]; serpent24SubKeys[ofs + 2] = r[i2]; serpent24SubKeys[ofs + 3] = r[i3]; }
/* * One Serpent round. * ofs = current subkey counter * S = S-box for this round * i0 to i4 = input register numbers (the fifth is a scratch register) * o0 to o3 = output register numbers */ private void Serpent_Round(int ofs, SBox S, uint[] r, int i0, int i1, int i2, int i3, int i4, int o0, int o1, int o2, int o3) { KeyAddition(ref r[i0], ref r[i1], ref r[i2], ref r[i3], ofs); S(ref r[i0], ref r[i1], ref r[i2], ref r[i3], ref r[i4]); Serpent_LinearTransform(ref r[o0], ref r[o1], ref r[o2], ref r[o3]); }
static void GenerateSubstitutionTable( SBox name, string switchVariable = "INPUT", string assignVariable = "OUTPUT", string entityName = "ENTITY_NAME", string architectureName = "ARCHITECTURE_NAME") { byte mask = 15; // 0b00001111 var result = InitSBoxHeader(switchVariable, entityName, architectureName); int counter = 0; switch (name) { case SBox.AesSbox: var aesSbox = TableValues.AesSBox(); foreach (var row in aesSbox) { foreach (var number in row) { int columnIndex = counter & mask; int rowIndex = (counter >> 4) & mask; string newValue = GetBinaryValue(aesSbox[rowIndex][columnIndex], 8); string counterValue = GetBinaryValue(counter++, 8); result.Add($"\t\twhen \"{counterValue}\" => {assignVariable} <= \"{newValue}\";"); } } result.Add("end case;"); result.Add("end process;"); result.Add($"end {architectureName};"); File.WriteAllLines(_path + "AesSbox.vhd", result); break; case SBox.AesSboxInv: var aesSboxInv = TableValues.AesSBoxInv(); foreach (var row in aesSboxInv) { foreach (var number in row) { int columnIndex = counter & mask; int rowIndex = (counter >> 4) & mask; string newValue = GetBinaryValue(aesSboxInv[rowIndex][columnIndex], 8); string counterValue = GetBinaryValue(counter++, 8); result.Add($"\twhen \"{counterValue}\" => {assignVariable} <= \"{newValue}\";"); } } result.Add("end case;"); result.Add("end process;"); result.Add($"end {architectureName};"); File.WriteAllLines(_path + "AesSboxInv.vhd", result); break; case SBox.Des1: var des1 = TableValues.DesSBox(1); GenerateDesSbox(des1, "Des1", assignVariable, entityName, architectureName: architectureName); break; case SBox.Des2: var des2 = TableValues.DesSBox(2); GenerateDesSbox(des2, "Des2", assignVariable, architectureName); break; case SBox.Des3: var des3 = TableValues.DesSBox(3); GenerateDesSbox(des3, "Des3", assignVariable, architectureName); break; case SBox.Des4: var des4 = TableValues.DesSBox(4); GenerateDesSbox(des4, "Des4", assignVariable, architectureName); break; case SBox.Des5: var des5 = TableValues.DesSBox(5); GenerateDesSbox(des5, "Des5", assignVariable, architectureName); break; case SBox.Des6: var des6 = TableValues.DesSBox(6); GenerateDesSbox(des6, "Des6", assignVariable, architectureName); break; case SBox.Des7: var des7 = TableValues.DesSBox(7); GenerateDesSbox(des7, "Des7", assignVariable, architectureName); break; case SBox.Des8: var des8 = TableValues.DesSBox(8); GenerateDesSbox(des8, "Des8", assignVariable, entityName, architectureName: architectureName); break; } }
private Key() { KeyWords = new byte[Properties.Settings.Default.NUMBER_OF_KEY_WORDS][]; InitializeKeyConstant(); sBoxInstance = SBox.GetSBoxInstance; }
// create sbox and mixcolumn instance for next use public EncryptDecryptRoundStep() { sBoxInstance = SBox.GetSBoxInstance; mixColumnInstance = MixColumn.GetMixColumnInstance; }