• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfr cezara PHP

Object Storage Arubacloud
0 głosów
1,347 wizyt
pytanie zadane 29 maja 2018 w PHP przez OdsetekGlupoty Pasjonat (15,360 p.)

Witam,

Za niedługo będę się uczył OOP w języku PHP, ale zanim to zrobię chciałbym jeszcze trochę poćwiczyć logiczne myślenie i różne funkcje wbudowane PHP. Postanowiłem zrobić skrypt, który zaszyfrowywałby podane zdania/słowa szyfrem cezara. 

Jednak zatrzymałem się w jednym miejscu i nie wiem co dalej zrobić, a do tego substring mi nie działa.

Kod:

<?php
for ($i = 0; $i < 26; $i++) $alphabet[$i] = chr($i+65);
if ($_POST)
{	
	$codelength = strlen($_POST['code']);
	for ($i = 0; $i < $codelength; $i++)
	{
		$letter[$i] = strtoupper(substr($_POST['code'], $i, $i+1));
                //...
	}
}
?>

Nie wiem czy w ogóle dobrze kombinuje. Poza tym jest pewien błąd w substringu (substr). Jeśli wpiszę 1 lub 2 litery a potem to wypiszę to zwraca normalnie, ale jeśli podam 3 lub więcej znaków to już dzieją się dziwne rzeczy.

Z góry dziękuję za pomoc.

1 odpowiedź

0 głosów
odpowiedź 30 maja 2018 przez Wisnia Bywalec (2,770 p.)
wybrane 2 czerwca 2018 przez OdsetekGlupoty
 
Najlepsza

substr nie działa: substr(string, from, to) tylko 

string substr ( string $string , int $start [, int $length ] )

Czyli powinieneś mieć:

 $letter[$i] = strtoupper(substr($_POST['code'], $i, 1));

 

Co do samego pomysłu to zamiast tworzyć alfabet i próbować w nim potem odnajdywać poszczególne litery można po prostu w czasie szyfrowania dodawać odpowiednią wartość do każdego znaku.

komentarz 30 maja 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
Dzięki, z substringiem rzeczywiście się pomyliłem. Jednak nie rozumiem o co Ci chodzi gdy mówisz, żeby w czasie szyfrowania dodawać odpowiednią wartość do każdego znaku. Podczas szyfrowania czyli gdzie? Jeśli chodzi o to, żeby zrobić ciąg IFów to chyba nie byłoby to zbyt profesjonalnie zrobione?
komentarz 30 maja 2018 przez Wisnia Bywalec (2,770 p.)
Zapisz może najpierw do końca jak Ty to chcesz zrobić, to wtedy porozmawiamy o tym rozwiązaniu i opiszę też dokładnie o co mi chodzi. Teraz tylko domniemywam co zamierzasz zrobić.
komentarz 30 maja 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
Chciałem to zrobić jakoś tak, że PHP wyszukiwałby literę w zmiennej $letter a następnie "zwiększał" tę literę o np. 5.
komentarz 1 czerwca 2018 przez Wisnia Bywalec (2,770 p.)

No to chyba nie wyszukiwał, tylko po prostu po kolei brał każdą literę?
I w takim razie po co Ci ta linia:


for ($i = 0; $i < 26; $i++) $alphabet[$i] = chr($i+65);

?

komentarz 1 czerwca 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)

Ok, zostawiłem tego fora i zrobiłem ifa, który sprawdza co wypluje substr i jeśli jest to równe chr($i+65) to tworzy zmienną $klucz = $i + 3 a później wypisuje to na ekran. Jednak to sprawdza po kolei litery alfabetu i kod musi być taki: abcdefg itd... Nawet jeśli podam coś w stylu ACEGIKM itd... (co druga litera) to też nie działa :\

for ($i = 0; $i < $codelength; $i++)
{
	if (strtoupper(substr($_POST['code'], $i, 1)) == chr($i+65))
	{
		$klucz = $i+3;
		echo chr($klucz+65);
	}
}

 

komentarz 1 czerwca 2018 przez Wisnia Bywalec (2,770 p.)

No to powiedz jeszcze po co ten warunek?

if (strtoupper(substr($_POST['code'], $i, 1)) == chr($i+65))

Nie rozumiem jeszcze dla czego masz i zmienną $klucz i 65 ?

No i dla czego robisz

echo chr($klucz+65)

który nie ma nic wspólnego ze znakami, które masz szyfrować. ?

Szyfr Cezara to po prostu przesunięcie liter o zadaną ilość znaków. Jeśli Cię interesuje mieć tylko znaki z alfabetu A-Z to wtedy musisz jeszcze uwzględnić zakres kodów ASCII tyczących się A-Z i odpowiednio przypisać wartości które wykraczają poza A-Z po dodaniu klucza.

zobacz jeszcze fukcje ord(String), myślę, że Ci się tu przyda.

komentarz 2 czerwca 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)
Dzięki, ord() pomogło i teraz kod już działa. Jednak mam ustawiony w kodzie klucz (liczba liter do przesunięcia) i nie mogę go zmienić, bo zepsuję system zabezpieczający przed wyjściem poza ASCII jeśli chodzi o litery (żeby po wpisaniu np. Z nie wyświetlał się jakiś dziwny znaczek tylko alfabet leciał od nowa). Jedyne co teraz chcę zrobić to właśnie umożliwić użytkownikowi podanie swojego klucza i zmiana znaków polskich na łacińskie (A = Ą, Ż = Z itd...). Jednak funkcja strtr nie działa. Daję naj, ponieważ kod szyfrujący już właściwie działa :)

Dzięki :)

Podobne pytania

0 głosów
0 odpowiedzi 481 wizyt
pytanie zadane 11 lipca 2018 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 362 wizyt
pytanie zadane 19 maja 2018 w C i C++ przez Saddre Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 646 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez Duke_Astaroth Nowicjusz (240 p.)

92,555 zapytań

141,402 odpowiedzi

319,552 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...