public static MatrixInt Decrypt(ILinearCode linearCode, IList <int> permutation, IList <int> mask, MatrixInt scramblerMatrix, ParityCheckMatrixGeneratorEllyptic generator, MatrixInt encryptedMessage) { var message = encryptedMessage.Clone(); #region Unmask for (int col = 0; col < message.ColumnCount; col++) { for (int row = 0; row < message.RowCount; row++) { message[row, col] = linearCode.GaloisField.MultiplyWords(message[row, col], linearCode.GaloisField.GetMultiplicativeInverse(mask[col])); } } #endregion Debug.WriteLine(message); #region Inverse permutation var inversePermutation = Helper.InversePermutation(permutation); message = message.PermuteColumns(inversePermutation); #endregion Debug.WriteLine(message); #region Correct Errors var correctedMessage = DecoderEllyptic.DecodeAndCorrect(linearCode, message, generator); #endregion Debug.WriteLine(correctedMessage); #region Apply the inverse scrambler matrix var inverseScramblerMatrix = MatrixAlgorithms.MatrixInverse(scramblerMatrix, linearCode.GaloisField); var decryptedMessage = MatrixAlgorithms.DotMultiplication(correctedMessage, inverseScramblerMatrix, linearCode.GaloisField); #endregion return(decryptedMessage); }
public MatrixInt DecryptMessage(MatrixInt encryptedMessage) { var message = encryptedMessage.Clone(); #region Unmask for (int col = 0; col < message.ColumnCount; col++) { for (int row = 0; row < message.RowCount; row++) { message[row, col] = LinearCode.GaloisField.MultiplyWords(message[row, col], PrivateKey.InverseMask[col]); } } #endregion Debug.WriteLine(message); #region Inverse permutation message = message.PermuteColumns(PrivateKey.InversePermutation); #endregion Debug.WriteLine(message); #region Correct Errors var correctedMessage = DecoderEllyptic.DecodeAndCorrect(LinearCode, message, _generator); #endregion Debug.WriteLine(correctedMessage); #region Apply the inverse scrambler matrix var decryptedMessage = MatrixAlgorithms.DotMultiplication(correctedMessage, PrivateKey.InverseScramblerMatrix, LinearCode.GaloisField); #endregion return(decryptedMessage); }