Dekrypcja tekstu zakodowanym kluczem

Dekrypcja tekstu zakodowanym kluczem
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

@Shalom:

Mimo, ostatniej pomocy, nadal nie ogarniam krypto na tyle zeby ogarnac prosty mechanizm.

kod javovy

Kopiuj
	public static String decrypt(String cipherText, PrivateKey privateKey,
			String encryptedKey) throws Exception {

		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.PRIVATE_KEY, privateKey);
		byte[] decryptedKey = cipher.doFinal(Base64.getDecoder().decode(
				encryptedKey));

		// Convert bytes to AES SecretKey
		SecretKey originalKey = new SecretKeySpec(decryptedKey, 0,
				decryptedKey.length, "AES");

		Cipher aesCipher = Cipher.getInstance("AES");

		aesCipher.init(Cipher.DECRYPT_MODE, originalKey);

		byte[] bytes = Base64.getDecoder().decode(cipherText);

		return new String(aesCipher.doFinal(bytes), UTF_8);

	}
  1. dekodujemy z base64 encrypted key na byte[]
  2. kluczem dekodujemy byte[] za pomoca RSA/ECB/PKCS1Padding". Tutaj nie do konca wiem jak to ustawic w c#
  3. bierzemy zdekodowany klucz i go kodujemy za pomoca AES dzieki czemu powstaje oryginalny klucz.
  4. nastepnie za pomoca orignalnego klucza mozemy zrobic decrypt za pomoca AES na zakodowanym tekscie. zamienic byte[] na string za pomoca utf8

I troche sie zatrzymalem.

  1. podpunkt zrobilem, z drugim mam juz troszke problemy, w sensie nie jestem pewien czy dobrze zrobilem. 3) nie ogarniam bo nie mam Key ani IV do aes crypto i nie wiem skad je wziac (czy je w ogole potrzebuje) do 4) jeszcze nie doszedlem :D
Kopiuj
        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);
            //var str = System.Text.Encoding.Default.GetString(decryptedKeyData);
            //var result = Convert.ToBase64String(decryptedKeyData);
            using (MemoryStream mStream = new MemoryStream(decryptedKeyData))
            using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
            {
                using (CryptoStream cryptoStream = new CryptoStream(mStream,
                    aesProvider.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) // nie mam skad wziac Key ani IV. Juz wiem ze robie cos zle :D
                {
                    cryptoStream.Read(decryptedKeyData , 0, decryptedKeyData .Length);
                }
                var plain = mStream.ToArray();
            }
            
            return result;
        }

troche stoje w miescu, wiec cokolwiek byloby bardzo pomocne zeby mnie popchac w jakims kierunku :)

edytowany 3x, ostatnio: fasadin
Visual Code
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:107
1

https://docs.microsoft.com/pl-pl/dotnet/api/system.security.cryptography.aesmanaged?view=netframework-4.7.2
Edit:
The size of the IV property must be the same as the BlockSize property divided by 8. why

Kopiuj
int keySize = 16; // 16, 24 or 32 
string keyString = // > keySize 
int IvLength = 16;
UTF8Encoding encoder;
AesManaged aes;

encoder = new UTF8Encoding();
aes = new AesManaged { Key = encoder.GetBytes(keyString).Take(keySize).ToArray() };
aes.BlockSize = IvLength * 8; // 128-bit block size AES

// buffer, key = aes.Key, IV = vector
byte[] bytesDecrypted
using (ICryptoTransform decryptor = aes.CreateDecryptor(key, IV))
{
bytesDecrypted = decryptor.TransformFinalBlock(buffer, 0, buffer.Length);
}
result = encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);
edytowany 4x, ostatnio: Visual Code
fasadin
bylem tu wielokrotnie ;)
fasadin
Twoj kod sie nie kompiluje ;) ale rozumiem idee
Visual Code
o to chodzi 😄
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

No to znów: bez danych do walidacji się niestety nie obejdzie :) Generalnie wygląda to tak:

  1. Bierzesz zaszfrowany klucz
  2. Dekodujesz go za pomocą klucza prywatnego RSA. Jeśli zrobiłeś to poprawnie to wyszedł ci klucz AESa więc będzie miał 128/192/256 bitów. To taka pierwsza asercja -> jeśli wyszło cokolwiek innego to coś jest nie tak. To co wychodzi to jest aes key. Daj jakąś asercje na to swoje decryptedKeyData i upewnij się że wyszło coś o sensownej długości.
  3. Jeśli nie jest podane inaczej to może jest to AES-ECB, więc żadne IV nie jest ci potrzebne. Ale dla spokoju możesz dać IV 16 bajtów \0, w najgorszym wypadku popsuje ci to pierwszy blok plaintextu (jeśli to jakieś CBC), ale reszta będzie ok. Niemniej często też IV jest po prostu pierwszym blokiem ciphertextu (bo nie musi wcale być tajne), więc gdyyb się okazało ze po ustawieniu IV na same 0 masz na początku 16 losowych bajtów ale plaintext wygląda na "cały" to znaczy ze IV jest zapewne pierwszym blokiem ciphertextu.
  4. Pomieszałeś strasznie bo próbujesz "deszyfrować klucz" zamiast twojego encryptedMessage :P

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 3x, ostatnio: Shalom
fasadin
4. A nie jest czasem tak, ze najpierw decryptuja klucz a pozniej tym kluczem ktory zostal odekryptowany deszyfruja encryptedMessage ?
Shalom
No jest ale klucz jest zaszyfrowany RSA a message zaszyfrowane AESem. Deszyfrujesz za pomocą RSA klucz, który następnie dajesz AESowi.
fasadin
SecretKey originalKey = new SecretKeySpec(decryptedKey, 0, decryptedKey.length, "AES"); czyli zle zrozumialem ta linijke. Znasz moze jakis odpowienik w C# albo pod czym szukac?
Shalom
To jest tylko załadowanie klucza do jakiejś klasy która go opakowuje, nic więcej.
fasadin
ok :)
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

wiec w mailu jest napisany ze jest to AES 128 Bitowy

@Shalom jako znasz holenderski to przekleje. Jezeli potrzeba to moge przetlumaczyc

  1. We genereren een unieke symetrische sleutel (128 bits AES)
  2. We versleutelen de payload met deze sleutel. Dit levert de EncryptedPayload op.
  3. We halen de publieke sleutel op van het Foo certificaat
  4. We versleutelen de unieke sleutel (stap 1) met de publieke sleutel uit stap 3. (hiervoor gebruiken als Cipher RSA. In java (RSA/ECB/PKCS1Padding)). Dit zal een ‘EncryptedKey’ opleveren.

teraz kod wyglada tak

Kopiuj

        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var encoder = new UTF8Encoding();
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);

            var aes = new AesManaged { Key = decryptedKeyData.Take(16).ToArray() };
            aes.BlockSize = 16 * 8; // 128-bit block size AES

            byte[] bytesDecrypted;
            var ecryptedMessageData = Convert.FromBase64String(encryptedMessage);
            using (ICryptoTransform decryptor = aes.CreateDecryptor())
            {
                bytesDecrypted = decryptor.TransformFinalBlock(ecryptedMessageData, 0, ecryptedMessageData.Length);
            }
            var result = encoder.GetString(bytesDecrypted, 0, bytesDecrypted.Length);

            return result;
        }

bytesEncryptedKey ma 256 bajtow

natomiast decryptedKeyData ma 16 bajtow. Niestety nie wiem czy jest to poprawne czy nie, ale sadze ze tak. Skoro ma byc 128 bitowy to 16 * 8 = 128

ale przy bytesDecrypted = decryptor.TransformFinalBlock(ecryptedMessageData, 0, ecryptedMessageData.Length); dostaje

Padding is invalid and cannot be removed.

Jeszcze jedna rzecz z certyfikatu, biore tylko prywatny klucz. Moze to jest problemem?

Kopiuj
 rsaCryptoServiceProvider = (RSACryptoServiceProvider)certificate.PrivateKey;

tylko ze jak daje publiczny to mam blad ze klucz nie istnieje

edytowany 1x, ostatnio: fasadin
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No opisali dokładnie to co napisałem wyżej :P

bytesEncryptedKey ma 256 bajtow

I dobrze bo masz tam 2048 bitów RSA :)

natomiast decryptedKeyData ma 16 bajtow

Póki co jest dobrze, bo gdyby źle sie zdekoowało coś to wyszłoby znowu jakieś 256 bajtów. Jak jest 16 to jest spoko!

Padding is invalid and cannot be removed.

Może to nie jest AES-CBC tylko AES-ECB po prostu? Certyfikatu ani tego RSA nie ruszaj, to jest ok. Ten AesManaged ma Mode -> https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.aesmanaged.mode?view=netframework-4.7.2 spróbuj dać tam ECB.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
Zobacz pozostałe 3 komentarze
fasadin
co potrzebujesz :)? napisze to co mam w nowym poscie
fasadin
ecb nie dziala
fasadin
poki co musze isc, bede zapewne pozniej kolo 16-17 :) WALE W TYNKI to ide z Dorota do Ume :)
Shalom
uu widze powodzi się :P
fasadin
Przy dziecku wyjście gdzieś to wiesz. Jak wakacje :D
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

encryptedmessage

Kopiuj
foVP0YwWMIDTg1YUzg2Vj/8AVFbu/XvAzWH1kaMp5nPO7YVD9T9haUIgSFvEWiVZK5k/Ny6jhJL+C+8wLC9kjl5NFmlfEQH5bGdu7MaAuBurEYa/AOt+erPqIUt45f85Bc+97jzw0DtVSOaUiK/x9h87EFOHSmwpi/s7753v9HSvFbn3nDhXV3MOrEKhW7nAn9ueroxlxf0jxpTZoP0HVm9AAdmWvuJeYJhdE14F68uMc+IAXekm+MAPoMNZCOsyTUOyYXIXfmnK/1rysNqjcDK41sAnGxierwoE8pNOQEAnKh5HpBI3W8AH+YNKR2xfLLtcgHmhunBDoEM/2YD2Li2Qv6OyjvUWn/7PNkp6shrMLf0SjqgCj2ia9gKVzZcPz5TH1xPjrBJBqGPJ9cSfDBBd9CqW4+D+owF1v6806AZUcVdfuzltSXLHOuLfbCGsUZZaaVJhPhP+QLAlC5v3XzgxxSVQ8OLUGhF3SxXrY0UICUJOunfm6vnqMAT36m8Ydsjc8qqV/Km1Fj5g+q4nJ3LLVwjyvlpBxOOhDi3W0y2SGh5l8JNtgKFuYKBVSUOeBwc3aX2r4jG+PzCObU6jvyiftc5Civ5Bl3NIwg30nyhk1035AaQEl4svCqCPiAz0+1xBtq7YeW4KwaMPjJHAwcgMY04Urm4ir2fiNpKy6Au1D/Giy4rYRF5/KoOv79GNdvMyL1PM7HhS6hqnc/YtXIggJkYh6STAzSlgVUb4C/X59wdaq736CQG0bm/0x56gSdNflDAXb4zsafFkN3daGTeY22xqPEOihLTYNdd4n2UDRKZdrn4dACEE8XskZsyK3I9fwbqj05COQJHRXfx9d9QNYL8g6BLsqpJGMT+zEtwOH18Yrzd7fGJ3uFFTa1GnhWhV00oCTClbLpJ1KI6FSGnC0iSFr/KwAQk1oCPKkrzDx4hwOsMxc/oQ52Kwjt5JP18SnSCWEmiu4ovQV95FUsMKzHaBjaKs109DrKWTHSgWLqFle/P3q6aa39PRggmbBLLcDQLLlri/6kBlHdFknnP1OIwNQhWgFAd0hgQK1FA7RAUak/PoOhaP1l1C0r8n0fTnU88rxWepXQJ47KEZQnm116c0S+O83iiBhRuM3jE0Dh6R3kpGAPrEk26/1IxF4tQi85gDRfdNTF1rUR/ijGZZXADwJxYgiIHhiyZIjKTcSuct/D7dQkxLZFtQ77xq7ZwRLY3BpiumoyDxXcOLREM4DsHkL/3xctgA81a9SjpVulal4SkzZqWL/8R0gKqIROpZuzA8bRxJizgl4lIrJ7HdNje+y4g79439acLjrGYkLkCZb7e1xOMS5rAuRLs4Fcdjc2rE1AzL5GEmZXfNjDddr6y5LWorojmBl28OP1Ft4YraeFd4vvh6VIOjgAE7xnuxBmyCXQ9+xV9Gr4pIk8tagSIU34orgDSwsbmVVdBCiz1i0SScVMwBtaEZadaevwh/vWqnZn8dSmoqvIdgsuaChwjPSgFbERcZ/+y5+c04Je1nSMXLa0G9T6g1hwtA214amkiwD4RuIg4kgA2eu9r22Hpc902WRiBl5ADCtWMDZJcmwQ6vNVyMcJMvuXH9/lsL548iSAdZrM5sd+aFGbc52FifFgKlYQdBti9DDUsi8FS79bR4nxLXuy37m9q0gdMcEm7XZRPzSksXiVhGm+lafw53muNCJwMLh7fwXB0IOqJ5zhfl6dYbSDOMisVa

encrypted key

Kopiuj
ZOtFWxzwk19GFi2VFdUtoNLAgMY0TdbvqKXF8fekTJCqWf74GF32Kgw1lE481b9kW0ZbuARR7/Ofn3aAaF1U4FMXNu5CKt25vPPlBnzrpgdQlun5bEmVnwoZtpgx9ZN1bgEnkw/rGWx+TtYahxIBjSfemgufEZg7fHNswWM/eWAa/iA4Hv43dgNEiLk9RnNru9Iy6MEuoe+e4I2vnOin0HXTDfy4zEP7yxAgXNzvcIQm7kscNAMnGo++ww5VFYG73ydmLo0IB7NOtmDoJzDk6ReE03S6p1gf1quE/bfufzoxW9bVnLax8ZTIJfRu6NguOYtLjQUGTZrvNagj3JGizA==

zamienilem decryptedKeyData na base64 wiec bez problemu mozesz do byte[] zrobic :)

Kopiuj
mzpxo8onsMBiIX7fcUhWfQ==
edytowany 2x, ostatnio: fasadin
Shalom
To jest zwykły AES-ECB, początek plaintextu to {"SalaryStatemen
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Tak jak pisałem wyżej -> to jest AES-ECB a nie CBC, więc musisz sprawdzić sobie jak zmienic mode na ECB i powinno pyknąć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

zapomnialem odpisac!

bylbym tym co moze ktos wejdzie tutaj i bedzie szukal rozwiazania i bedzie jak w tym rysunku WHERE ARE YOU czy tam cos tam. Wiec zignorowalem odpowiedz @Visual Code (wybacz ;P) i po nakierowaniu przez @Shalom finalnie wyglada to tak

Kopiuj
        public static string Decrypt(string encryptedMessage, RSACryptoServiceProvider privateKey, string encryptedKey)
        {
            var encoder = new UTF8Encoding();
            var bytesEncryptedKey = Convert.FromBase64String(encryptedKey);
            var decryptedKeyData = privateKey.Decrypt(bytesEncryptedKey, false);
            var ecryptedMessageData = Convert.FromBase64String(encryptedMessage);

            string plaintext = string.Empty;

            using (RijndaelManaged rijAlg = new RijndaelManaged { Mode = CipherMode.ECB})
            {
                rijAlg.Key = decryptedKeyData;

                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                using (MemoryStream msDecrypt = new MemoryStream(ecryptedMessageData))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;
        }

czego mi brakowalo to Mode = CipherMode.ECB}

edytowany 1x, ostatnio: fasadin
Shalom
Ten AesManaged nie wspiera ECB jako mode? Niby AES to jest de facto Rijndael, ale nie każdy moze o tym wiedzieć no i są tryby Rijndaela które nie są w standardzie AESa (w szczególnosci Rijndael wspiera bloki rozmiaru 128/192/256 bitów, podczas gdy standard AESa zakłada tylko 128 bitowe bloki).
fasadin
wspiera. Ale nadal mial problem z paddingiem. Wiec stwierdzilem, ze pojde droga ktora jest najczesciej linkowana w google ;)
fasadin
jezeli chodzi o prace z certyfikitami to przyznam, ze zawiedzony jestem ze C# tak slabo to wspiera i tak malo jest pomocy odnosnie C#
Shalom
Moze to celowe? :D Taki sanity check czy developer rozumie co się tam dzieje pod spodem, a nie tylko wrzuca jakieś krzaczki do API i wierzy że to jakośtam działa? ;)
fasadin
:D mozliwe, ale znajac m$ to pewnie jakis backward compability problem, przez co maja X rozwiazan ale tylko 1 dziajalace bo reszta jest ale w sumie nie dziala :D btw co polecasz jako czytanie do crypto? jakis taki nutshell, a dopiero pozniej bym cos poczytal co jest bardziej rozbudowane :)
fasadin
uuu nie znalem tego :) bardzo fajne
Visual Code
dzięki za podzielenie się kodem, tylko po co pisać "zignorowałem", nie ładniej "wybrałem inną drogę zaproponowaną przez..." ;), poza tym to był copy paste z githuba więc nie mam żalu
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)