byte[] ConvertToEncryptedMessage(NewCamdMessage message) { _logger.Debug($"Prepare message headers for {Name}"); var prepareData = new List <byte>(); prepareData.Add((byte)(message.MessageId >> 8)); prepareData.Add((byte)(message.MessageId & 0xFF)); prepareData.Add((byte)(message.ServiceId >> 8)); prepareData.Add((byte)(message.ServiceId & 0xFF)); prepareData.Add((byte)(message.ProviderId >> 16)); prepareData.Add((byte)((message.ProviderId >> 8) & 0xFF)); prepareData.Add((byte)(message.ProviderId & 0xFF)); prepareData.Add(0); prepareData.Add(0); prepareData.Add(0); _logger.Debug($"Correct message headers for {Name}"); message.Data[0] = (byte)message.Type; message.Data[1] = (byte)((message.Data[1] & 240) | (((message.Data.Length - 3) >> 8) & 255)); message.Data[2] = (byte)((message.Data.Length - 3) & 255); _logger.Debug($"Copy {message.Data.Length} bytes into the buffer for {Name}"); prepareData.AddRange(message.Data); //Fill up while (prepareData.Count % 8 != 7) { prepareData.Add(0); } _logger.Debug($"Encrypt data before sending to {Name}"); var padding = new byte[8]; _random.NextBytes(padding); //fill up bytes with padding data at the end var bufferLen = prepareData.Count; var paddingLen = (8 - ((bufferLen - 2) % 8)) % 8; var prepareDataArray = prepareData.ToArray(); Buffer.BlockCopy(padding, 0, prepareDataArray, bufferLen - paddingLen, paddingLen); prepareData = prepareDataArray.ToList(); //Add checksum prepareData.Add(XorSum(prepareData.ToArray())); var ivec = new byte[8]; _random.NextBytes(ivec); var dataToEncrypt = prepareData.ToArray(); var encrypted = _crypto.Encrypt(dataToEncrypt, _keyblock, ivec).ToList(); var dataToSend = new List <byte>(); dataToSend.Add((byte)((encrypted.Count + ivec.Length) >> 8)); dataToSend.Add((byte)((encrypted.Count + ivec.Length) & 0xFF)); dataToSend.AddRange(encrypted); dataToSend.AddRange(ivec); return(dataToSend.ToArray()); }
#pragma warning disable CA1822 // Mark members as static public void EncryptAndDecrypt() #pragma warning restore CA1822 // Mark members as static { const string Unencoded = "Foo"; byte[] encoded = EncryptionHelpers.Encrypt( Encoding.UTF8.GetBytes(Unencoded)); string decoded = Encoding.UTF8.GetString( EncryptionHelpers.Decrypt(encoded)); Assert.Equal(Unencoded, decoded); }