Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2018, 07:54   #1
marluna
Пользователь
 
Регистрация: 15.12.2016
Сообщений: 50
По умолчанию Unity, как мне прочитать строку из первого скрипта в третьем _aesKey?

первый скрипт
Код:
using System.Collections;


public class AESKey : MonoBehaviour {

    public bool RequestAESKeyOnStart;
    public bool IsLoggedIn { get; protected set; }
    public static UnityClient Client;
    private string _aesKey = string.Empty;


    private int RsaKeySize = 512;
    private RSACryptoServiceProvider _clientsCsp;
    private RSAParameters _parameters;


    private void Awake()
	{
		Client = GetComponent<UnityClient>();
        if (GameObject.FindGameObjectsWithTag(gameObject.tag).Length > 1)
        {
            Destroy(gameObject);
        }
        else
        {
            DontDestroyOnLoad(transform.gameObject);
        }
    }

    public bool IsConnected
    {
        get { return Client != null && Client.Connected; }
    }

    private void Start()
    {
        Client.Disconnected += ClientOnDisconnected;
        Client.MessageReceived += ClientOnMessageReceived;

        if (RequestAESKeyOnStart)
        {
            StartCoroutine(GetAesKey());
        }
    }
    private IEnumerator GetAesKey()
    {
        while (!Client.Connected)
        {
            yield return new WaitForSeconds(1f);
        }
        RequestAesKey();
    }
    public void RequestAesKey()
    {
        if (Client.Connected)
        {
            //Request AES key
            _clientsCsp = new RSACryptoServiceProvider(RsaKeySize);
            _parameters = _clientsCsp.ExportParameters(false);

            // Serialize public key
            var sw = new StringWriter();
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, _parameters);

            using (var writer = DarkRiftWriter.Create(Encoding.Unicode))
            {
                writer.Write(sw.ToString());
                Client.SendMessage(Message.Create(MessageTags.RequestAesKey, writer), SendMode.Reliable);
            }
        }
    }

    

    private void ClientOnMessageReceived(object sender, MessageReceivedEventArgs e)
    {
        using (var message = e.GetMessage())
        {
            switch (message.Tag)
            {
                case MessageTags.RequestAesKeyResponse:
                    HandleRequestAesKeyResult(message);
                    break;


            }
        }
    }

    private void HandleRequestAesKeyResult(Message message)
    {
        using (DarkRiftReader reader = message.GetReader())
        {
            var response = reader.ReadBytes();

            if (response == null)
            {
                Console.WriteLine("Failed to receive aes key");
                return;
            }

            var decrypted = _clientsCsp.Decrypt(response, false);
            _aesKey = Encoding.Unicode.GetString(decrypted);
        }
    }

}
второй скрипт
Код:
using Chat;


namespace Login
{
    public class Login : MonoBehaviour
    {
        public InputField UsernameInput;
        public InputField PasswordInput;

        public GameObject ControlPanel;
        public Text ConnectionText;
        public Text FeedbackText;
        public LoadingAnimation LoadingAnimation;
        public Button LoginButton;
        public Button AddUserButton;
        public GameObject CancelButton;

        private void Awake()
        {
            CancelButton.SetActive(false);

            if (PlayerPrefs.HasKey("username"))
            {
                UsernameInput.text = PlayerPrefs.GetString("username");
            }

            LoginManager.onSuccessfulLogin += LoadMainMenu;
            LoginManager.onFailedLogin += FailedLogin;
            LoginManager.onSuccessfulAddUser += SuccessfulRegister;
            LoginManager.onFailedAddUser += FailedAddUser;
        }

        public void LoginButtonFunction()
        {
            PlayerPrefs.SetString("username", UsernameInput.text);
            ConnectingScreen("Connecting...");
            LoginManager.Login(UsernameInput.text, PasswordInput.text);
        }

        public void AddUser()
        {
            ConnectingScreen("Creating User...");
            LoginManager.AddUser(UsernameInput.text, PasswordInput.text);
            Debug.Log(UsernameInput.text + PasswordInput.text);
        }

        #endregion


        #region ProcessServerResponse

        
        private void FailedAddUser(byte errorId)
        {
            if (errorId == 1)
            {
                LoginScreen("Username already taken.", Color.red);
            }
            else
            {
                // could differentiate between 0 (Wrong Information) and 2 (Database Error).
                LoginScreen("Server couldn't process Information", Color.red);
            }
        }

       

        #endregion

       
        }

      

       
    }
}
третий скрипт
Код:
using System.Collections.Generic;


namespace Login
{
    public class LoginManager : MonoBehaviour
    {
        public static bool IsLoggedIn { get; private set; }

        public delegate void SuccessfulLoginEventHandler();
        public delegate void FailedLoginEventHandler(byte errorId);
        public delegate void SuccessfulAddUserEventHandler();
        public delegate void FailedAddUserEventHandler(byte errorId);

        public static event SuccessfulLoginEventHandler onSuccessfulLogin;
        public static event FailedLoginEventHandler onFailedLogin;
        public static event SuccessfulAddUserEventHandler onSuccessfulAddUser;
        public static event FailedAddUserEventHandler onFailedAddUser;
        private static string _aesKey = string.Empty;
        private Action<Message> networkTimeCallback;


        private void Awake()
        {
            GameControl.Client.MessageReceived += OnDataHandler;
        }

        private void OnDestroy()
        {
            if (GameControl.Client == null)
                return;

            GameControl.Client.MessageReceived -= OnDataHandler;
        }

        #region Network Calls

        public static void Login(string username, string password)
        {
            using (var writer = DarkRiftWriter.Create())
            {
                writer.Write(username);
                writer.Write(Encoding.UTF8.GetBytes(password));

                using (var msg = Message.Create(LoginTags.LoginUser, writer))
                {
                    GameControl.Client.SendMessage(msg, SendMode.Reliable);
                }
            }
        }

  /*      public static void AddUser(string username, string password)
        {
            using (var writer = DarkRiftWriter.Create())
            {
                writer.Write(username);
                writer.Write(password);

                using (var msg = Message.Create(MessageTags.RegisterAccount, writer))
                {
                    GameControl.Client.SendMessage(msg, SendMode.Reliable);

                }
            }
        }
*/
        public static void AddUser(string username, string password)
        {
            var data = new Dictionary<string, string>
          {
              {"username", username},
              {"password", password},
          };

            SendEncrypted(MessageTags.RegisterAccount, data.ToBytes());
            Debug.Log(username + password);
           
        }

      



        public static void SendEncrypted(ushort tag, byte[] raw, SendMode sendMode = SendMode.Reliable)
        {
            if (!string.IsNullOrEmpty(_aesKey))
                AESKey.Client.SendMessage(Message.Create(tag, new BytesPacket { Data = Security.EncryptAES(raw, _aesKey) }), sendMode);
        }

     

    }
}
как мне прочитать строку из первого скрипта в третьем _aesKey? я пытался через GetComponent но не вышло так как static SendEncrypted

Последний раз редактировалось marluna; 29.03.2018 в 08:17.
marluna вне форума Ответить с цитированием
Старый 29.03.2018, 08:08   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сами-то пробовали читать свою неотформатированную кашу?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2018, 08:24   #3
marluna
Пользователь
 
Регистрация: 15.12.2016
Сообщений: 50
По умолчанию

я пытался таким способом https://unity3d.com/ru/learn/tutoria...g/getcomponent
marluna вне форума Ответить с цитированием
Старый 29.03.2018, 09:39   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чот тут фигня какая-то, все смешано в кучу и имена классов бессмысленные/не соответствуют тому, что они делают.
Цитата:
Сообщение от marluna Посмотреть сообщение
не вышло так как static SendEncrypted
Так может ему и не надо быть static?
Ну или тогда и остальное придется делать static. Или Singleton. http://wiki.unity3d.com/index.php/Singleton

Если нужен один экземпляр в пределах одной сцены, то можно просто кинуть Empty со скриптом. Если для всей игры один и тот же экземпляр, то наверно только синглтон или static.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2018, 12:09   #5
mike_ovch
Новичок
Джуниор
 
Регистрация: 29.03.2018
Сообщений: 4
По умолчанию

А если попробовать в первом скрипте создать свойство:
public bool IsEmptyAESKey => _aesKey == null;
и метод:
BytesPacket ToBytesPacket(byte[] raw)

и в третьем из метода SendEncrypted их вызывать?

Последний раз редактировалось mike_ovch; 29.03.2018 в 12:21. Причина: оптимизация кода
mike_ovch вне форума Ответить с цитированием
Старый 29.03.2018, 12:10   #6
marluna
Пользователь
 
Регистрация: 15.12.2016
Сообщений: 50
По умолчанию

Из за ограничений форума я часть вырезал, если убрать статик то
Код:
 public void AddUser()
        {
            ConnectingScreen("Creating User...");
            LoginManager.AddUser(UsernameInput.text, PasswordInput.text);
            Debug.Log(UsernameInput.text + PasswordInput.text);
        }
ругается что требуется ссылка на объект, и тут я не знаю как быть
спасибо за синглетогн, попробую
marluna вне форума Ответить с цитированием
Старый 29.03.2018, 12:21   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну дык естественно не просто убрать/добавить в 1 месте, а разобраться в остальном коде и изменить его соответствующим образом.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2018, 13:12   #8
marluna
Пользователь
 
Регистрация: 15.12.2016
Сообщений: 50
По умолчанию

я вас не понял. второй скрипт public void AddUser()=>public static void AddUser если в третьем скрипте убрать статик то тот начинает ругаться, что в третьем public static void AddUser не статик. я тут не знаю каких то еще вариантов. спасибо тоже попробую mike_ovch
marluna вне форума Ответить с цитированием
Старый 29.03.2018, 13:51   #9
marluna
Пользователь
 
Регистрация: 15.12.2016
Сообщений: 50
По умолчанию

сделал так public static string _aesKey = string.Empty;
Код:
 public static void SendEncrypted(ushort tag, byte[] raw, SendMode sendMode = SendMode.Reliable)
        {
            Debug.Log(AESKey._aesKey);
            if (!string.IsNullOrEmpty(AESKey._aesKey))
                AESKey.Client.SendMessage(Message.Create(tag, new BytesPacket { Data = Security.EncryptAES(raw, AESKey._aesKey) }), sendMode);
        }
и вроде все работает. а сервер молчит...из за этого запутался в конец.
marluna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прочитать из первого файла и записать во второй символ (QBasic) ulika Помощь студентам 1 28.12.2013 11:49
Как вывести строку, которая состоит из аргументов командной строки так, чтобы каждое слово выводилось без первого символа Mik2012 Общие вопросы C/C++ 1 31.10.2012 00:29
Прочитать данные из файла до первого пробела Cookson Помощь студентам 5 27.03.2010 10:26
Как мне узнать текущую строку в БД (InterBase) Edward БД в Delphi 2 05.03.2009 17:09
Как мне в асме прочитать данные из файла? lelicman Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.10.2007 09:24