Szyfrowanie Tekstów i Plików dla Programistów

Szyfrowanie losowymi metodami tekstów, ciągów tekstowych i plików w kodach źródłowych wraz z generowaniem kodu deszyfrującego w wybranym języku programowania.

Problem

Sam jestem programistą, kocham programować. Oprócz tego zajmuję się również inżynierią wsteczną oprogramowania. W swojej pracy wykonuję szereg analiz kodu zamkniętego i skompilowanego oprogramowania. Czasami znajduję w skompilowanych aplikacjach rzeczy, które nie powinny być widoczne na pierwszy rzut oka dla każdego, kto wie jak skorzystać z hex edytora.

Co można znaleźć w binariach aplikacji?

Poniżej kilka przykładów, niektóre z tych rzeczy nie powinny być nawet umieszczone w aplikacjach (złe założenia projektowe), ale obecność innych jest czasami nieunikniona.

Hasło do bazy danych
Hasła do baz danych
Dane do logowania do różnych usług
Dane do logowania do różnych usług
Klucz szyfrujący i deszyfrujący
Klucze szyfrujące i deszyfrujące
Kod źródłowe w języku skryptowym
Kody źródłowe w językach skryptowych
Zapytanie SQL w czystym tekście
Skomplikowane zapytania SQL w czystym tekście
Ukryte adresy sieciowe
Ukryte adresy sieciowe

Dlaczego powinienem się martwić?

Wszystkie te rzeczy w nieodpowiednich rękach mogą być wykorzystane przeciwko twojemu oprogramowaniu i otaczającej go infrastrukturze.

Hasło do bazy danych jawnym tekstem widziane w hex edytorze HIEWin HIEW hex editor
Nie chcesz żeby to przydarzyło się twojemu oprogramowaniu.

Dla przykładu weźmy hasła do baz danych. Mogą być użyte przez twoją konkurencję do przeglądania struktury twojej bazy danych, czy zrzucenia całej jej zawartości. Cała ciężka praca idzie na marne, tylko dlatego, że ktoś podejrzał hasło zapisane jawnym tekstem w aplikacji korzystając z prostego hex edytora.

Rozwiązanie — String Encrypt

Postanowiłem stworzyć prostą usługę o nazwie String Encrypt dla programistów, która pozwala na szybkie szyfrowanie tekstów (ciągów tekstowych) i plików bez konieczności tworzenia specjalnych narzędzi szyfrujących do tego celu.

String Encrypt pozwoli Ci ukryć rzeczy, które nie powinny być widoczne dla pierwszej z brzegu osoby z hex edytorem.

Usługa posiada interfejs Web API pozwalający zautomatyzować proces szyfrowania danych np. każdorazowo przy kompilacji twojego projektu.

Jak to działa?

Lubię prostotę i String Encrypt jest bardzo łatwy w użyciu. Wystarczy tylko, że:

  • Wpiszesz tytuł ciągu tekstowego, powiedzmy "szSecret"
  • Wpiszesz zawartość ciągu tekstowego, np. "Hello"
  • Wybierzesz wyjściowy język programowania dla kodu deszyfrującego
  • Naciśniesz przycisk Encrypt and Generate Decryptor

Rezultaty

String Encrypt używa każdorazowo losowego kodu szyfrującego i przykładowy rezultat może wyglądać tak dla obsługiwanych języków programowania:

// zaszyfrowane przez www.stringencrypt.com (v1.0.0) [C/C++]
// szSecret = "Hello World!"
wchar_t szSecret[13] = { 0xB13D, 0xB159, 0xB15F, 0xB160, 0xB168, 0xB11A, 0xB152, 0xB169,
			 0xB15F, 0xB16A, 0xB14F, 0xB10B, 0xB0F1 };

for (unsigned int fstHM = 0, TLuIA = 0; fstHM < 13; fstHM++)
{
	TLuIA = szSecret[fstHM];
	TLuIA = ~TLuIA;
	TLuIA --;
	TLuIA = ~TLuIA;
	TLuIA -= 0xA90C;
	TLuIA ^= fstHM;
	TLuIA += 0xF816;
	szSecret[fstHM] = TLuIA;
}

wprintf(szSecret);
// zaszyfrowane przez www.stringencrypt.com (v1.0.0) [C#]
// szSecret = "Hello World!"
String szSecret = "\uFFB6\uFF99\uFF92\uFF92\uFF8F\uFFDE\uFFA7\uFF8F\uFF8C\uFF92\uFF9A\uFFDD";

for (int hcGUs = 0, JBonk = 0; hcGUs < 12; hcGUs++)
{
	JBonk = szSecret[hcGUs];
	JBonk ++;
	JBonk = ~JBonk;
	JBonk -= hcGUs;
	JBonk += hcGUs;
	szSecret = szSecret.Substring(0, hcGUs) + (char)(JBonk & 0xFFFF) + szSecret.Substring(hcGUs + 1);
}

MessageBox.Show(szSecret);
// zaszyfrowane przez www.stringencrypt.com (v1.0.0) [Delphi / Pascal]
var
  // szSecret = "Hello World!"
  szSecret: array[0..13] of WideChar;
  YhZsX: Integer;
  XMSIh: Integer;

begin

  szSecret[12] := WideChar($421E); szSecret[3] := WideChar($427D);
  szSecret[10] := WideChar($427C); szSecret[4] := WideChar($4285);
  szSecret[1] := WideChar($4276); szSecret[5] := WideChar($4237);
  szSecret[6] := WideChar($426F); szSecret[7] := WideChar($4286);
  szSecret[2] := WideChar($427C); szSecret[0] := WideChar($425A);
  szSecret[8] := WideChar($428C); szSecret[11] := WideChar($4238);
  szSecret[9] := WideChar($4277);

  for XMSIh := 0 to 13 do
  begin
    YhZsX := Ord(szSecret[XMSIh]);
    YhZsX := YhZsX xor XMSIh;
    YhZsX := not YhZsX;
    YhZsX := YhZsX + $4212;
    YhZsX := not YhZsX;
    szSecret[XMSIh] := WideChar(YhZsX);
  end;

  ShowMessage(szSecret);
// zaszyfrowane przez www.stringencrypt.com (v1.0.0) [Java]
// szSecret = "Hello World!"
String szSecret = "\uD161\uD14B\uD143\uD144\uD142\uD18E\uD178\uD13F" +
		  "\uD153\uD14E\uD143\uD181";

for (int PznwK = 0, NKJoC = 0; PznwK < 12; PznwK++)
{
	NKJoC = szSecret.charAt(PznwK);
	NKJoC -= PznwK;
	NKJoC += PznwK;
	NKJoC ++;
	NKJoC ^= PznwK;
	NKJoC += 0x16BF;
	NKJoC ^= 0xE869;
	szSecret = szSecret.substring(0, PznwK) + (char)(NKJoC & 0xFFFF) + szSecret.substring(PznwK + 1);
}

System.out.println(szSecret);
<script type="text/javascript">
// zaszyfrowane przez www.stringencrypt.com (v1.0.0) [JavaScript]
// szSecret = "Hello World!"
var szSecret = "\uD2B6\uD29C\uD298\uD297\uD2B1\uD309\uD2CB\uD298\uD298\uD2B1\uD2C8\uD302";

for (var cXIBk = 0, fyBrc = 0; cXIBk < 12; cXIBk++)
{
	fyBrc = szSecret.charCodeAt(cXIBk);
	fyBrc += 0x26EE;
	fyBrc ^= 0x0613;
	fyBrc = ~fyBrc;
	fyBrc += cXIBk;
	fyBrc ^= cXIBk;
	fyBrc -= cXIBk;
	szSecret = szSecret.substr(0, cXIBk) + String.fromCharCode(fyBrc & 0xFFFF) + szSecret.substr(cXIBk + 1);
}

alert(szSecret);
</script>
# zaszyfrowane przez www.stringencrypt.com (v1.0.0) [Python]
# szSecret = "Hello World!"
szSecret = [ 0x0046, 0x0061, 0x006E, 0x006C, 0x006D, 0x0020, 0x0055, 0x005F,
             0x0070, 0x006C, 0x0066, 0x0021 ]

for WRUGp in range(12):
  BMbPZ = szSecret[WRUGp]
  BMbPZ += 1
  BMbPZ ^= WRUGp
  BMbPZ += 1
  BMbPZ ^= WRUGp
  szSecret[WRUGp] = BMbPZ

szSecret = ''.join(chr(BMbPZ & 0xFFFF) for BMbPZ in szSecret)

del WRUGp, BMbPZ

print(szSecret)
-- zaszyfrowane przez www.stringencrypt.com (v1.0.0) [Haskell]
module Main where

import qualified Data.Char
import qualified Data.Bits

main = do
  putStrLn $ szSecret

-- szSecret = "Hello World!"
szSecret = zipWith f [0..] [ 0x751D, 0x753C, 0x7531, 0x7537, 0x753E, 0x754F, 0x7512, 0x753A,
                             0x7527, 0x7533, 0x7549, 0x7588 ]
  where
    f pahnq frsop = let wpsnl0 = frsop
                        wpsnl1 = wpsnl0 `Data.Bits.xor` pahnq
                        wpsnl2 = wpsnl1 + 1
                        wpsnl3 = wpsnl2 - pahnq
                        wpsnl4 = Data.Bits.complement wpsnl3
                        wpsnl5 = wpsnl4 `Data.Bits.xor` 0x8AA6
                        wpsnl6 = wpsnl5 + 1
                    in Data.Char.chr (wpsnl6 Data.Bits..&. 0xFFFF)
; zaszyfrowane przez www.stringencrypt.com (v1.0.0) [MASM Assembler (32 bit)]

.data

	; szSecret = "Hello World!"
	szSecret dw 0D7B3h, 0D799h, 0D791h, 0D792h, 0D798h, 0D7E0h, 0D7B6h, 0D7A1h, 0D791h, 0D7A8h, 0D7A1h, 0D7E7h, 0D807h

.code
	mov	ecx, offset szSecret
	mov	eax, 13
	sub	edx, edx

@@:
	mov	bx, word ptr [ecx + edx]
	add	ebx, 02804h
	sub	ebx, edx
	not	ebx
	add	ebx, edx
	xor	ebx, edx
	mov	word ptr [ecx + edx], bx
	inc	edx
	dec	eax
	jne	@b

	push	0
	push	ecx
	push	ecx
	push	0
	call	MessageBoxW
; zaszyfrowane przez www.stringencrypt.com (v1.0.0) [FASM Assembler (32 bit)]

section '.data' data readable writable

	; szSecret = "Hello World!"
	szSecret dw 09AD0h, 09AF5h, 09AFCh, 09AFCh, 09AF9h, 09A88h, 09AC1h, 09AF7h
		 dw 09AF6h, 09AFCh, 09AC4h, 09A89h, 06568h

section '.text' code readable executable

	mov	ebx, szSecret
	mov	eax, 13
	and	edx, 0

@@:
	mov	cx, word [ebx + edx]
	xor	ecx, 09A97h
	xor	ecx, edx
	inc	ecx
	add	ecx, edx
	mov	word [ebx + edx], cx
	inc	edx
	dec	eax
	jne	@b

	push	0
	push	ebx
	push	ebx
	push	0
	call	[MessageBoxW]

Całkowita ochrona oprogramowania

Szyfrowanie tekstów i plików to tylko jedna warstwa zabezpieczeń. Być może zainteresuje Cię również moje rozwiązanie do ochrony oprogramowania — PELock. Pomoże Ci w ochronie twojego oprogramowania nawet przed ludźmi z dużym doświadczeniem w inżynierii wstecznej i crackerami.

Masz pytania?

Jeśli chciałbyś mnie zapytać o usługę String Encrypt, coś nie jest do końca jasne, napisz do mnie, z miłą chęcią Ci pomogę.