powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / RSA шифрование с помощью открытого ключа
25 сообщений из 79, страница 1 из 4
RSA шифрование с помощью открытого ключа
    #40086520
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!
ранее не сталкивался и не совсем понимаю как сделать правильно:
есть некий сгенерированный открытый ключ
Код: plaintext
<RSAKeyValue><Modulus>2+VvfVJXR7JUmg65U/njAelZisE2LyEP7JGVVn38COECz++uhviKs+MAr6eB5LROwTd4GaZFj6WefO8FAw8sY16hIsrXn2wvA8r4+FoXsVoyUtt7ifbx7rAARTrGljaYi0CLnbktSg1+A6Rf50nAuJmTIBsFbFl7XHFT2YRvUP0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

с помощью него должен шифровать строку:
и делаю что то вроде этого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
byte[] modBytes = "2+VvfVJXR7JUmg65U/njAelZisE2LyEP7JGVVn38COECz++uhviKs+MAr6eB5LROwTd4GaZFj6WefO8FAw8sY16hIsrXn2wvA8r4+FoXsVoyUtt7ifbx7rAARTrGljaYi0CLnbktSg1+A6Rf50nAuJmTIBsFbFl7XHFT2YRvUP0=".getBytes(StandardCharsets.UTF_8);
        byte[] expBytes = "AQAB".getBytes(StandardCharsets.UTF_8);

        BigInteger modules = new BigInteger(1, modBytes);
        BigInteger exponent = new BigInteger(1, expBytes);

        KeyFactory rsaFactory = KeyFactory.getInstance("RSA");

        RSAPublicKeySpec rsaKeyspec =
                new RSAPublicKeySpec(modules, exponent);
        PublicKey pk = rsaFactory.generatePublic(rsaKeyspec);

        System.out.println("----" + pk);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pk);
        byte[] bytes = cipher.doFinal(DigestUtils.md5Hex("MyTestText".toLowerCase()).getBytes(StandardCharsets.UTF_8));

        System.out.println(Arrays.toString(bytes));



правильно ли я шифрую текст MyTestText (по ТИ текст должен быть представлен в МД5)
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086529
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не можете шифровать используя только открытый ключ.
Асимметричное шифрование всегда использует ключевую пару - открытый ключ (как правило, "обёрнут" в сертификат) и закрытый ключ, хранящийся "где-то".
Из-за очень низкой скорости асимметричное шифрование используют только для очень коротких данных: электронная подпись (хэш плюс имитовставка) или (ваш случай) для безопасной передачи ключа симметричного шифрования (которое на порядки быстрее).
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086537
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Не понял как закрытый ключ? Закрытый же должен храниться только у поставщика вроде как?
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086540
Музаффар, да, все верно. У тебя есть открытый ключ, которым ты можешь зашифровать данные. У поставщика будет закрытый ключ, которым он может расшифровать данные.

Как правило когда речь заходит про онлайн общение (узлы общаются друг с другом интерактивно), то данные шифруют симметричным ключом (например, AES). Потому как асимметричный (RSA) работает намного медленней. Когда же речь про оффлайн общение (например, зашифровать письмо), то да - приходится использовать асимметричное шифрование.

Твой же пример выглядит рабочим (ты не сказал что у тебя не работает), однако не понятно чего ты пытаешься добиться. Ведь ты шифруешь не текст, а MD5 хеш от текста. Ну расшифруют с той стороны этот хеш, а что с ним делать будут? Возможно ты перепутал и нужно не зашифровать, а подписать сообщение? Т.е. само сообщение шлем (может даже и в открытом виде), а затем еще подпись чтоб убедиться что подписал именно ты. В таком случае мы сначала вычисляем хеш, а затем прогоняем через RSA подпись (не шифрование). Но подпись наоборот - делают закрытым ключом. Ведь принимающая сторона хочет убедиться что это именно ты послал.

В общем дай больше информации.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086546
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

интересно да оказывается на самом деле нужно подписать...
т.е. вот такие этапы:
1. Получить хеш метода путем конкатенации Ключа Приложения и вызываемого метода
2. Подписать хеш публичным ключом и получить токен


т.е. получается все это время шифровал а не подписал походу...
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086547
Музаффар

1. Получить хеш метода путем конкатенации Ключа Приложения и вызываемого метода
2. Подписать хеш публичным ключом и получить токен


т.е. получается все это время шифровал а не подписал походу...
Не совсем:
1. Конкатенировать ничего не надо, первый шаг - это просто получить хеш (aka digest) от текста.
2. Получить подпись этого хеша твоим приватным ключом. Ведь только ты должен мочь подписаться под своим сообщением.

Ну и самому хеш вычислять не надо, вот пример отсюда , Java сама и хеш подсчитает, и подпись сформирует:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public static String sign(String plainText, PrivateKey privateKey) throws Exception {
    Signature privateSignature = Signature.getInstance("SHA256withRSA");
    privateSignature.initSign(privateKey);
    privateSignature.update(plainText.getBytes(UTF_8));

    byte[] signature = privateSignature.sign();
    ...
}

Дальше если надо - эти байты можно в строку превратить то ли в Base64, то ли в hex.

Но с той стороны (которая будет проверять подпись) нужно чтоб они могли проверить подпись. Т.е. им нужны будут: твой публичный ключ, эта подпись, а так же контент который был подписан.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086552
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

авторНе совсем:
1. Конкатенировать ничего не надо, первый шаг - это просто получить хеш (aka digest) от текста.
2. Получить подпись этого хеша твоим приватным ключом. Ведь только ты должен мочь подписаться под своим сообщением.


так я поднял техИнструкцию и там точно так написано
и у меня нет приватного ключа у меня есть только
Код: plaintext
<RSAKeyValue><Modulus>2+VvfVJXR7JUmg65U/njAelZisE2LyEP7JGVVn38COECz++uhviKs+MAr6eB5LROwTd4GaZFj6WefO8FAw8sY16hIsrXn2wvA8r4+FoXsVoyUtt7ifbx7rAARTrGljaYi0CLnbktSg1+A6Rf50nAuJmTIBsFbFl7XHFT2YRvUP0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
т.е. как я понимаю должен подписать некий хэшированный `текст` с помощью полученного РСАКейВелью...

завтра на работе попробую, спасибо.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086587
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас должна быть собственная ключевая пара.
Асимметричное шифрование выполняется на паре "открытый ключ получателя - закрытый ключ отправителя". Расшифровка делается на паре "закрытый ключ получателя - открытый ключ отправителя".

Для электронной подписи, которую должны проверять все, создаётся эфемерная ключевая пара. Далее формируем имитовставку (псевдослучайное число) и криптостойкий хэш сообщения (дайджест).
Шифруем дайджест с имитовставкой на паре "эфемерный открытый ключ - собственный закрытый ключ" и уничтожаем эфемерный открытый ключ. К зашифрованным данным добавляем пару "собственный открытый ключ - эфемерный закрытый ключ" и получаем электронную подпись.
Проверяющий самостоятельно вычисляет дайджест сообщения, расшифровывает данные ЭП и сверяет вычисленный дайджест с имеющимся. Совпадение гарантирует, что шифрование выполнял владелец ключевой пары, открытый ключ которой "приложен" к ЭП.
Имитовставка гарантирует, что каждая электронная подпись (даже одинаковых данных) будет уникальной.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086616
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я правильно понял методы должны выгладит примерно вот так?
т.е. то что оттуда приходит <RSAKeyValue><Modulus>2+VvfVJXR7JU...Fl7XHFT2YRvUP0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue> для меня будет закрытым ключом и с помощью него подписываю хэшировнный текст?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
void textSign() {
        byte[] modBytes = "v5JmVyqYui4Hg/D2Z+l6tkMgH6aq1O3MuKB05EhrPRifJ4gfbnGZbIuom6FnLMwiC3XM5kVvxwuesTS9lPbPmWYiDk0vjzV/UlC4XJa7tXDFOyRtzUxSWPaVvWB9A8OY0AhYFQYXNqvtql0Z4SxwYMAbzuNpolD2Mi9uEQf2v9s=".getBytes(StandardCharsets.UTF_8);
        byte[] expBytes = "AQAB".getBytes(StandardCharsets.UTF_8);

        BigInteger modules = new BigInteger(1, modBytes);
        BigInteger exponent = new BigInteger(1, expBytes);

        KeyFactory rsaFactory = KeyFactory.getInstance("RSA");

        RSAPrivateKeySpec rsaKeyspec =
                new RSAPrivateKeySpec(modules, exponent);
        PrivateKey pk = rsaFactory.generatePrivate(rsaKeyspec);

        System.out.println(sign(DigestUtils.md5Hex("myTestText".toLowerCase()), pk));
    }

    String sign(String plainText, PrivateKey privateKey) throws Exception {
        Signature privateSignature = Signature.getInstance("SHA256withRSA");
        privateSignature.initSign(privateKey);
        privateSignature.update(plainText.getBytes(StandardCharsets.UTF_8));

        byte[] signature = privateSignature.sign();
        return Arrays.toString(signature);
    }
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086639
Basil A. Sidorov
У вас должна быть собственная ключевая пара.
Асимметричное шифрование выполняется на паре "открытый ключ получателя - закрытый ключ отправителя". Расшифровка делается на паре "закрытый ключ получателя - открытый ключ отправителя".
Но ему не нужно шифрование. Во всяком случае он об этом не говорит.
Basil A. Sidorov

Для электронной подписи, которую должны проверять все, создаётся эфемерная ключевая пара.
Шифруем дайджест с имитовставкой на паре "эфемерный открытый ключ - собственный закрытый ключ" и уничтожаем эфемерный открытый ключ. К зашифрованным данным добавляем пару "собственный открытый ключ - эфемерный закрытый ключ" и получаем электронную подпись.
Тут видимо речь про сохранение конфединциальности. Т.е. никто кроме проверяющего не знает кем было подписано сообщение. Если же нам нужна обычная подпись, то шифровать (и генерировать эфемерные ключи) не надо насколько мне известно.

Музаффар , да, это похоже на работающий код. Вот только еще обрати внимание на это:
Basil A. Sidorov
Далее формируем имитовставку (псевдослучайное число)
Имитовставка гарантирует, что каждая электронная подпись (даже одинаковых данных) будет уникальной.
Вот этого (называется padding) у тебя не происходит. Это менее безопасно. И в стандартной JDK нет такого алгоритма, для этого нужно подключать BouncyCastle , и инициализировать вот так:
Код: java
1.
2.
3.
4.
Security.addProvider(new BouncyCastleProvider());
...
Signature s = Signature.getInstance("SHA256withRSA/PSS");
s.setParameter(new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1));

Ну а затем подписывать как подписывал.

Если твой продукт очень важен и его обязательно нужно сделать правильно, то вам прийдется нанять какого-то security эксперта. Я эту тему знаю постольку поскольку. Не знаю насчет Basil A. Sidorov. На то что тебе на программерских форумах говорят про security нужно смотреть скептически.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086668
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

ещё один интересный момент, в техинструкции показан пример на СиШарп... но у этого кода результате всегда положительные числа, у меня как положительные так и отрицательные... скорее всего я что то пропускаю, а сам не совсем знаком с этим языком...
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086694
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Тут видимо речь про сохранение конфединциальности. Т.е. никто кроме проверяющего не знает кем было подписано сообщение.
Это не конфиденциальность, а возможность проверки только ограниченным кругом лиц.
Открытый ключ, по своей сути, предполагает сколь угодно широкое распространиение. "Как есть" или "завёрнутым" в сертификат - не так важно.Если же нам нужна обычная подпись, то шифровать (и генерировать эфемерные ключи) не надо насколько мне известно.А теперь подумайте, только медленно и вдумчиво: как без эфемерной ключевой пары обеспечить проверку электронной подписи неопределённым (неограниченным) кругом лиц.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086709
Музаффар , в C# и на Java все будет похоже работать. Там нет проблем прочесть код на другом языке, важно - понимать механизмы, а синтаксис и так поймешь.
Музаффарно у этого кода результате всегда положительные числаЭто значит что в байтах не заполнен 1ый бит. Скорей всего это не бинарные данные, а ASCII текст. Бинарные подписи могут закодировать в Base64 или hex для удобства.

И не нужно пытаться сравнивать подписи по форме байт. У тебя есть способ проверить эту подпись:
Код: java
1.
2.
3.
4.
5.
Signature s = Signature.getInstance("SHA256withRSA/PSS");
s.setParameter(new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1));
s.initVerify(key);
s.update(signedData);
s.verify(signature);



Basil A. Sidorov
Stanislav Bashkyrtsev
Тут видимо речь про сохранение конфединциальности. Т.е. никто кроме проверяющего не знает кем было подписано сообщение.
Это не конфиденциальность, а возможность проверки только ограниченным кругом лиц.
Выше в своем сообщении ты писал про проверку неограниченным кол-вом лиц.
Basil A. Sidorov

Открытый ключ, по своей сути, предполагает сколь угодно широкое распространиение. "Как есть" или "завёрнутым" в сертификат - не так важно.Если же нам нужна обычная подпись, то шифровать (и генерировать эфемерные ключи) не надо насколько мне известно.
А теперь подумайте, только медленно и вдумчиво: как без эфемерной ключевой пары обеспечить проверку электронной подписи неопределённым (неограниченным) кругом лиц.Ну так может не будешь выкабениваться и просто расскажешь в чем проблема? Если бы в security protocol'ах легко было логически вывести все нюансы, то их все бы знали.

Я не вижу проблем:
1. Мой открытый ключ публикуется в доверенном хранилище (GPG хранилище которому доверяет третья сторона, или на моем сайте, или у меня его можно запросить лично).
2. Я подписываю своим закрытым ключом данные и эти открытые данные распространяю вместе с открытой подписью.
3. Мои коллеги могут скачать как данные, так и подпись. Также они могут получить мой открытый ключ из доверенного хранилища. И проверить подпись.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086713
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Выше в своем сообщении ты писал про проверку неограниченным кол-вом лиц
... и утверждал, что для этого нужна эфемерная ключевая пара. В каком месте я противоречу себе ?
2. Я подписываю своим закрытым ключом данные и эти открытые данныеПомедитируйте над тем, что именно содержат открытые данные ЭП и как именно они проверяются.
Ну или почему алгоритмы (де)шифрования на ключевых парах называются а симметричными.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086716
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,

авторв C# и на Java все будет похоже работать. Там нет проблем прочесть код на другом языке, важно - понимать механизмы

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
var dataToEncrypt = _encoder.GetBytes(data);
var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray();
var length = encryptedByteArray.Count();
var item = 0;
var sb = new StringBuilder();
foreach (var x in encryptedByteArray)
{
    item++;
    sb.Append(x);
    if (item < length)
        sb.Append(",");
}

return sb.ToString();



в том то дело, по ТИ написано надо подписать а тут вроде как шифруется?
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086721
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Цифровая подпись ДОКУМЕНТА?
Или устраивает https по ГОСТ?
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086723
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
А теперь подумайте, только медленно и вдумчиво: как без эфемерной ключевой пары обеспечить проверку электронной подписи неопределённым (неограниченным) кругом лиц.

Внезапно: распространить среди них открытый ключ. В сертификате или явно.

PS: На самом деле тут маленькая терминологическая путаница: с асимметричными алгоритмами открытый текст можно сначала "расшифровать" закрытым ключом, а потом "зашифровать" открытым для получения оригинала. Это и происходит в процессе подписи, но при чтении его описания - вгоняет в ступор.
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086724
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

не совсем документа, вот что написано в ТИ

Вызов каждого метода должен сопровождаться подписью в заголовке запроса. Подписывается только хеш строки состоящей из Ключа приложения и вызываемого метода. Общий алгоритм подписи выглядит так:
1. Получить хеш метода путем конкатенации Ключа Приложения и вызываемого метода
2. Подписать хеш публичным ключом и получить токен
3. Добавить в запрос на сервер 2 заголовка с Именем Приложения и Токеном

1. Уже сделал получил <RSAKeyValue>....</RSAKeyValue>
2. а вот на втором топчусь на одном месте...
3. для реализации 3 нужен 2 )

выше кидал пример кода на шарпе...
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086731
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Имхо вы https изобретаете.
Зачем на уровне приложения каждый get сопровождать подписью?
Есть https, есть токены (подписанные и шифрованные)
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086735
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Внезапно: распространить среди них открытый ключ. В сертификате или явно.
Да не вопрос.
Как использовать только открытый ключ без парного ему закрытого? Свой - нельзя. Чужой? А чей?
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086739
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

к сожалению это не моя затея, дали задачу сказали подключиться и получить инфо, а ихними разрабами пока не удалось наладит контакт...

при этом экспайред тайм у этого ключа примерно одна минута ) т.е. при каждом любом запросе я должен получить открытый ключ с ним подписать запрашиваемый метод потом дальше работать... вот как подписать хз если не помогут более знающие в этой области )
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086740
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Просто если сайт на https, то там как раз при вводе пароля и стоит RSA.
2. Он медленный поэтому его не используют с каждым запросом.
Imho
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086744
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Они обязаны были дать демку.
Ты счас без подписи что получаешь от них? Ошибка какая?
Или вообще все с нуля?
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086748
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,
Будет прикольно, если они тебя тестирует и подключится надо просто по SSL)))
...
Рейтинг: 0 / 0
RSA шифрование с помощью открытого ключа
    #40086751
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

так говорю же по ихнему ТИ
по первому пункту честно получаю
Код: plaintext
<RSAKeyValue><Modulus>2+VvfVJXR7JUmg65U/njAelZisE2LyEP7JGVVn38COECz++uhviKs+MAr6eB5LROwTd4GaZFj6WefO8FAw8sY16hIsrXn2wvA8r4+FoXsVoyUtt7ifbx7rAARTrGljaYi0CLnbktSg1+A6Rf50nAuJmTIBsFbFl7XHFT2YRvUP0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

и все сходится с ТИ, дальше уже с помощью этого должен подписать строку хэшированную...
кстати пример кода на Шарпе уже кидал
ну а дальше хз чем они думали

авторОшибка какая?

вроде подписал, но в моих полученных байтах имеются и отрицательные числа...
далее в последнем запросе если что то не так ответом будет (по инструкции) 400 –Bad Request
(ну в общем написан так: Перед тем как вызвать запустить вызываемой метод, Api проведет валидацию подписи с помощью закрытого ключа, и запустит проверку прав доступа Приложения к конкретному методу.
В случае ошибки, Приложение получает ошибку 400 –Bad Request)
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / RSA шифрование с помощью открытого ключа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]