示例#1
0
        public void Write(TLBinaryWriter to, byte[] authKey)
        {
            using (var output = new MemoryStream())
            {
                using (var writer = new TLBinaryWriter(output))
                {
                    writer.WriteObject(Query);
                    var buffer = output.ToArray();

                    var    random = new Random();
                    var    length = buffer.Length;
                    int    num2   = 16 - length % 16;
                    byte[] array  = null;
                    if (num2 > 0 && num2 < 16)
                    {
                        array = new byte[num2];
                        random.NextBytes(array);
                    }
                    byte[] data2 = buffer;
                    if (array != null)
                    {
                        data2 = buffer.Concat(array).ToArray <byte>();
                    }

                    var msgKey       = TLUtils.GetMsgKey(buffer);
                    var encryptKeyIV = Utils.GetEncryptKeyIV(authKey, msgKey);
                    var data3        = Utils.AesIge(data2, encryptKeyIV.Item1, encryptKeyIV.Item2, true);

                    AuthKeyId = TLUtils.GenerateLongAuthKeyId(authKey);
                    MsgKey    = msgKey;
                    var Data = data3;

                    to.Write(AuthKeyId);
                    to.Write(MsgKey);
                    to.Write(Data);
                }
            }
        }
        public static TLEncryptedTransportMessage Encrypt(TLEncryptedTransportMessage transportMessage, byte[] authKey)
        {
            var random = new Random();

            var data = transportMessage.Data;

            var length  = data.Length;
            var padding = 16 - (length % 16);

            byte[] paddingBytes = null;
            if (padding > 0 && padding < 16)
            {
                paddingBytes = new byte[padding];
                random.NextBytes(paddingBytes);
            }

            byte[] dataWithPadding = data;
            if (paddingBytes != null)
            {
                dataWithPadding = data.Concat(paddingBytes).ToArray();
            }


            var msgKey        = TLUtils.GetMsgKey(data);
            var keyIV         = Utils.GetEncryptKeyIV(authKey, msgKey);
            var encryptedData = Utils.AesIge(dataWithPadding, keyIV.Item1, keyIV.Item2, true);

            //TLUtils.WriteLine("--Compute auth key sha1--");
            var authKeyId = TLUtils.GenerateLongAuthKeyId(authKey);

            transportMessage.AuthKeyId = new TLLong(authKeyId);
            transportMessage.MsgKey    = msgKey;
            transportMessage.Data      = encryptedData;

            return(transportMessage);
        }
        public static TLEncryptedTransportMessage Encrypt(TLEncryptedTransportMessage transportMessage, byte[] authKey)
        {
#if MTPROTO
            var random = new SecureRandom();

            var data = transportMessage.Data;

            var    length       = data.Length;
            var    padding      = 16 - (length % 16);
            byte[] paddingBytes = null;
            if (padding < 12)
            {
                padding += 16;
            }
            if (padding >= 12 && padding <= 1024)
            {
                paddingBytes = new byte[padding];
                random.NextBytes(paddingBytes);
            }

            var dataWithPadding = data;
            if (paddingBytes != null)
            {
                dataWithPadding = TLUtils.Combine(data, paddingBytes);
            }

            var msgKey        = TLUtils.GetEncryptMsgKey(authKey, dataWithPadding);
            var keyIV         = TLUtils.GetEncryptKeyIV(authKey, msgKey);
            var encryptedData = Utils.AesIge(dataWithPadding, keyIV.Item1, keyIV.Item2, true);

            var authKeyId = TLUtils.GenerateLongAuthKeyId(authKey);

            transportMessage.AuthKeyId = new TLLong(authKeyId);
            transportMessage.MsgKey    = msgKey;
            transportMessage.Data      = encryptedData;

            return(transportMessage);
#else
            var random = new SecureRandom();

            var data = transportMessage.Data;

            var    length       = data.Length;
            var    padding      = 16 - (length % 16);
            byte[] paddingBytes = null;
            if (padding > 0 && padding < 16)
            {
                paddingBytes = new byte[padding];
                random.NextBytes(paddingBytes);
            }

            byte[] dataWithPadding = data;
            if (paddingBytes != null)
            {
                dataWithPadding = TLUtils.Combine(data, paddingBytes);
            }


            var msgKey        = TLUtils.GetMsgKey(data);
            var keyIV         = TLUtils.GetEncryptKeyIV(authKey, msgKey);
            var encryptedData = Utils.AesIge(dataWithPadding, keyIV.Item1, keyIV.Item2, true);

            var authKeyId = TLUtils.GenerateLongAuthKeyId(authKey);

            transportMessage.AuthKeyId = new TLLong(authKeyId);
            transportMessage.MsgKey    = msgKey;
            transportMessage.Data      = encryptedData;

            return(transportMessage);
#endif
        }