A kako bi drugačije, jedino Debugging.
Ne koristim Visual Studio pa ne znam...
A kako bi drugačije, jedino Debugging.
Ne koristim Visual Studio pa ne znam...
Misliš zbog sigurnosti? Ma daj, znam gro igara koje svoje data fajlove kriptiraju xor enkripcijom i jednim jedinim ključem. Jest da "velikim hakerima" to ne predstavlja veliku prepreku, ali dovoljna je da one znatiželjnije drži podalje.
A sada ako bi imao ključ koji je dulji od podatka koji se kriptira i koji se koristi samo jednom, onda stvari postaju zanimljive.
Imam pitanje vezano za tu XOR enkripciju. Namjeravam .lic file od svog programa zaštiti sa time (i neke stringove koji idu u registry). Zanima me koliko je to sigurna procedura i jesu li 64 inta (potpuno random - sa random.org) u rasponu 0-256, razdvojeni sa ; dovoljna zaštita tj. hoće li to otjerati barem one malo manje uporne.
Kriptirani string koji izbaci se čak neda ni kopirati ovamo na forum... Editor izbaci neke znakove.
Imam pitanje vezano za tu XOR enkripciju. Namjeravam .lic file od svog programa zaštiti sa time (i neke stringove koji idu u registry). Zanima me koliko je to sigurna procedura i jesu li 64 inta (potpuno random - sa random.org) u rasponu 0-256, razdvojeni sa ; dovoljna zaštita tj. hoće li to otjerati barem one malo manje uporne.
Kriptirani string koji izbaci se čak neda ni kopirati ovamo na forum... Editor izbaci neke znakove.
Evo ovdje dosta toga pise.
Misliš zbog sigurnosti? Ma daj, znam gro igara koje svoje data fajlove kriptiraju xor enkripcijom i jednim jedinim ključem. Jest da "velikim hakerima" to ne predstavlja veliku prepreku, ali dovoljna je da one znatiželjnije drži podalje.
A sada ako bi imao ključ koji je dulji od podatka koji se kriptira i koji se koristi samo jednom, onda stvari postaju zanimljive.
Imam pitanje vezano za tu XOR enkripciju. Namjeravam .lic file od svog programa zaštiti sa time (i neke stringove koji idu u registry). Zanima me koliko je to sigurna procedura i jesu li 64 inta (potpuno random - sa random.org) u rasponu 0-256, razdvojeni sa ; dovoljna zaštita tj. hoće li to otjerati barem one malo manje uporne.
Kriptirani string koji izbaci se čak neda ni kopirati ovamo na forum... Editor izbaci neke znakove.
XOR je kranje minimalna transformacija (namjerno ne zovem enkripcijom) koja ima tek 256 mogućih kombinacija. Znači, za nešto ozbiljno - ni slučajno. U ovisnosti o jeziku i IDE-u kojeg koristiš razmisli o implementaciji pravih enkripcijskih algoritama poput blowfish, Rijndeal i sl. Ako je riječ o C++u probaj si instalirati Crypto++ (link).
Evo ovdje dosta toga pise.
Čitao sam i čini mi se da je 256 znakova dovoljno (ako sam dobro skužio tekst jer nisam vičan u enkripciji).
XOR je kranje minimalna transformacija (namjerno ne zovem enkripcijom) koja ima tek 256 mogućih kombinacija. Znači, za nešto ozbiljno - ni slučajno. U ovisnosti o jeziku i IDE-u kojeg koristiš razmisli o implementaciji pravih enkripcijskih algoritama poput blowfish, Rijndeal i sl. Ako je riječ o C++u probaj si instalirati Crypto++ (link).
Nije c++, .net je. Znam, tamo ima i Rijndeal ali treba mi nešto brzo za implementaciju i bez previše kompliciranja. Posebno mi je zanimljiv ovaj dio u članku kojeg je dao 1domagoj1:
"If the key is random and is at least as long as the message, the XOR cipher is much more secure than when there is key repetition within a message. When the keystream is generated by a pseudo-random number generator, the result is a stream cipher. With a key that is truly random, the result is a one-time pad, which is unbreakable even in theory."
Ključ i je random, dužine je ukupno 234 znaka i nije pseudorandom, riječ je o nizu brojeva sa random.org
Misliš zbog sigurnosti? Ma daj, znam gro igara koje svoje data fajlove kriptiraju xor enkripcijom i jednim jedinim ključem. Jest da "velikim hakerima" to ne predstavlja veliku prepreku, ali dovoljna je da one znatiželjnije drži podalje.
A sada ako bi imao ključ koji je dulji od podatka koji se kriptira i koji se koristi samo jednom, onda stvari postaju zanimljive.
Imam pitanje vezano za tu XOR enkripciju. Namjeravam .lic file od svog programa zaštiti sa time (i neke stringove koji idu u registry). Zanima me koliko je to sigurna procedura i jesu li 64 inta (potpuno random - sa random.org) u rasponu 0-256, razdvojeni sa ; dovoljna zaštita tj. hoće li to otjerati barem one malo manje uporne.
Kriptirani string koji izbaci se čak neda ni kopirati ovamo na forum... Editor izbaci neke znakove.
Vjerovatno ce biti i vise nego dovoljno, itako nemas neki pravi nacin da zastitis kljuc. Nece nitko ici brute force-ati enkripciju kad ga moze samo
iscitati iz binary-a ako je plaintext ili memorije u krajnjem slucaju.
Vjerovatno ce biti i vise nego dovoljno, itako nemas neki pravi nacin da zastitis kljuc. Nece nitko ici brute force-ati enkripciju kad ga moze samo
iscitati iz binary-a ako je plaintext ili memorije u krajnjem slucaju.
Sad već lagano ulazimo u sivu zonu obfuscatora... 
Mislim, sumnjam da će itko ići crackirati ovo što ja radim (skidrow sigurno ne) ali jel ima neki način kako zaštiti taj ključ (koji mora biti u aplikaciji)? Barem da ga neki priučeni VB vikend-koder ne može izvući van.
tj. hoće li to otjerati barem one malo manje uporne.
Ovisi koliku točno razinu upornosti želiš spriječiti :D
Postavi si pitanje, može li napadač lako doči do ključeva potrebnih za dekripciju (čitanjem iz memorije?)? Koliko su dugi ključevi? Kaniš li koristiti jedan ključ za više stvari?
Kriptirani string koji izbaci se čak neda ni kopirati ovamo na forum... Editor izbaci neke znakove.
Naravno da ga ne možeš ovdje staviti jer su se normalni tekstualni znakovi transformirali u sve i svašta, tako da tu onda ima i kontrolnih kodova i znakova iznad 127-og znaka ASCII tabele. Ukratko dobio si nečitku skupinu znakova, što ti je i bio prvotan cilj, zar ne?
Što se sigurnosti tiče, kao što je Tracer rekao, to je prilično slab algoritam čija snaga leži u potpunosti u ključu. Ako imaš potpuno nasumičan ključ, čija je duljina jednaka duljini podataka koje pokušavaš kriptirati, ako taj ključ iskoristiš samo jednom (dakle ne isti ključ za više različitih stvari), te u konačnici ako ga možeš držati na sigurnom, tada u teoriji imaš savršenu enkripciju. Kao što vidiš to je jako puno "ako", stoga nije ni čudo da su izmišljeni praktičniji algoritmi.
Ovisi koliku točno razinu upornosti želiš spriječiti :D
Postavi si pitanje, može li napadač lako doči do ključeva potrebnih za dekripciju (čitanjem iz memorije?)? Koliko su dugi ključevi? Kaniš li koristiti jedan ključ za više stvari?
1. Vjerojatno može, pošto je to .net. Naravno, nadam se da će neki obfuscator uspjeti prikriti ključ (jer se pomalo ističe od ostalih varijabli po dužini).
2. Ključ ima 234 znaka. Varijable koje planiram kriptirati sa njime su do 20ak znakova.
3. Jedan ključ za cijeli .lic file (file sa licencom). Drugi ključ (iste dužine) za neke varijable koje idu u registry (informacije o trialu i instalaciji).
Što se sigurnosti tiče, kao što je Tracer rekao, to je prilično slab algoritam čija snaga leži u potpunosti u ključu. Ako imaš potpuno nasumičan ključ, čija je duljina jednaka duljini podataka koje pokušavaš kriptirati, ako taj ključ iskoristiš samo jednom (dakle ne isti ključ za više različitih stvari), te u konačnici ako ga možeš držati na sigurnom, tada u teoriji imaš savršenu enkripciju. Kao što vidiš to je jako puno "ako", stoga nije ni čudo da su izmišljeni praktičniji algoritmi.
Da, znakovi su iznad 127og znaka.
Pitanje vezano za dužinu ključa - ako je ključ duži od varijable, jel to utječe na njegovu sigurnost? Jel bolje da ključ bude duži ili jednak varijabli? Nije problem sakupiti toliko ključeva niti ih staviti u program, riječ je o 4-5 varijabli koje treba zaštiti.
Sve ovisi o tome koliko će netko biti voljan kopati po programu u potrazi za ključem...
Dovoljno je da je jednako dugačak, ne treba biti dulji budući da one ostale znakove ključa nećeš koristiti.
Što se tiče onog ključa od 234 znaka, nadam se da ćeš koristiti nekakav nekakav offset, a ne kriptirati svih 5 varijabli sa prvih 20 znakova ključa.
Nekako me zabrinjava ta tvoja krajnja izvedba toga. Možda da ipak iskoristiš ono što ti .net nudi?
Prvi put radim sa nekom enkripcijom, ovo je više vježbanje.
Pošto je riječ o malo varijabli, mislim da ću napraviti ključ za svaku i to bi bilo to (da se ne igram sa ovim velikim ključem - strši među ostalim varijablama po dužini). Osim toga, potencijalni cracker će imati 5-6 ključeva za skupiti.
Kad završim taj program, budem vam poslao ga poslao na testiranje. Ako ovo brzo padne, idem na verziju sa Rijndaelom koji je implementiran u .net. Doduše, već sad znate sa čime je kriptirano pa će biti još lakše...
[edit] - nije ovo neka AAA aplikacije koja će ići u distribuciju naveliko nit je za nekog izdavača... Bit ću sretan ako prodam 5 kopija :D
Ovako, uhvatio sam se malo onoga što sam propustio u dosadašnjem učenju programiranja, ima dosta rupa u znanju, pretežno pokazivača.
Trebam rješiti ovaj zadatak:
Prva greska ti je ovo:
temp = new char [n];
for(int i=0; i<n; i++)
{
if(s2[i]!='\0')
{
temp[i]=s2[i];
}
}
To jednostavno nema smisla. Ti ides po drugome nizu, i prepisujes dok ne dodes do null charactera, a onda nista ne uradis. Ne znam sto si ovime htio postici. Taj drugi niz temp ti uopce nije potreban, i cijeli ovaj dio koda ti je nepotreban.
for(int i=0; s1!='\0'; i++)
{
if(s1[i] == '\0')
{
temp_index=i;
}
}
Kao sto si sam primjetio ovo ti nije dobro. Puno bi bolje to bilo izvesti ovako:
for(temp_index = 0; s1[temp_index] != '\0';temp_index++);
Na ovaj nacin for petlja ce se vrtiti i uvijek povecavati varijablu temp_index dok ne dode do null charactera. Na kraju ce u varijabli temp_index ostati pohranjena pozicina null charactera.
Sada krenes sa prepisivanjem prvih n charactera drugoga niza i to napravis:
for(int i = 0; i<n;i++)
s1[temp_index+i] = s2[i];
Dakle ovime dopisujes na niz s1 prvih n clanova niza s2, sa pocetnom pozicijom na null characteru prvoga niza(varijabal temp_index)>
I sada ti samo ostaje da provjeris je li zadnji clan nadopisanog dijela null character:
if(s2[n-1] != '\0')
s1[temp_index+n] = '\0';
Super, hvala!
Pozdrav svima, trebam pomoć oko code::blocks-a, kako u code::blocks-u promjeniti ikonu .exe datoteke.
Hvala ovo mi je puno pomoglo.
Ljudi trebam par savjeta kako da izbjegnem da mi na takmicenju zadatak ne probije vrijeme ili memoriju??
Hvala
Ljudi trebam par savjeta kako da izbjegnem da mi na takmicenju zadatak ne probije vrijeme ili memoriju??
Hvala
Brzim algoritmima i dobrim memory managementom.
Ljudi trebam par savjeta kako da izbjegnem da mi na takmicenju zadatak ne probije vrijeme ili memoriju??
Hvala
Kao što je Domagoj napomenuo, poboljšanjem (optimizacijom) algoritama. Generalno, treba što više smanjiti njihovu složenost, a to najčešće znači izbjegavati ugnježđene petlje.
for(...
for(...
for(...
A za memoriju se ne trebaš toliko brinuti. Pogotovo ako koristiš preciznu dinamičku alokaciju.
Ljudi trebam par savjeta kako da izbjegnem da mi na takmicenju zadatak ne probije vrijeme ili memoriju??
Hvala
Kao što je Domagoj napomenuo, poboljšanjem (optimizacijom) algoritama. Generalno, treba što više smanjiti njihovu složenost, a to najčešće znači izbjegavati ugnježđene petlje.
for(...
for(...
for(...
A za memoriju se ne trebaš toliko brinuti. Pogotovo ako koristiš preciznu dinamičku alokaciju.
Znaci sto manje kod-a to bolje...
Znaci sto manje kod-a to bolje...
To uopce nije tocno. On je rekao da tezis sto brzemu algoritmu. Brzi algoritam ne znaci nuzno manji kod, vec upravo suprotno, kod brzih i slozenih algoritama kod je velik
#include <iostream>
using namespace std;
class Monster
{
private:
string m_Name;
int m_Health;
int m_Strenght;
public:
Monster () { cout << "Building a Monster." << endl; }
~Monster () { cout << "Destroying a Monster." << endl; }
string GetName () { return m_Name; }
void SetName (string x) { m_Name = x; }
int GetHealth () { return m_Health; }
void SetHealth (int x) { m_Health = x; }
int GetStrenght () { return m_Strenght; }
void SetStrenght (int x) { m_Strenght = x;}
};
class Dragon : public Monster
{
public:
Dragon () { cout << "Building a Dragon." << endl; }
~Dragon () { cout << "Destroying a Dragon." << endl; }
void Fire()
{
cout << "Dragon breathing fire!" << endl;
}
};
//---------------------------------------------------------------------------//
void Sort(Dragon *array, int *size, bool (*pComparison)(int, int))
{
bool swap = true;
while(swap)
{
swap = false;
int yTMP;
int zTMP;
string strTMP;
for (int iii=0; iii<*size-1; iii++)
{
if(pComparison(array[iii].GetHealth, array[iii+1].GetHealth))
{
strTMP = array[iii].GetName();
array[iii].GetName() = array[iii+1].GetName();
array[iii+1].GetName() = strTMP;
yTMP = array[iii].GetHealth();
array[iii].GetHealth() = array[iii+1].GetHealth();
array[iii+1].GetHealth() = yTMP;
zTMP = array[iii].GetStrenght();
array[iii].GetStrenght() = array[iii+1].GetStrenght();
array[iii+1].GetStrenght() = zTMP;
swap = true;
}
}
}
}
bool Ascending(int nX, int nY)
{
return nY < nX;
}
bool Descending(int nX, int nY)
{
return nY > nX;
}
//---------------------------------------------------------------------------//
int main()
{
cout << "Enter the number of dragons you want to create:" << endl;
int *size = new int;
cin >> *size;
Dragon *array[*size];
for(int iii=0; iii<*size; iii++)
{
array[iii] = new Dragon();
}
for (int iii=0; iii<*size; iii++)
{
cout << "Enter the name of the " << iii+1 << ". dragon:" << endl;
string x;
cin.ignore();
getline(cin, x);
cout << "Enter " << x << "'s health:" << endl;
int y;
cin >> y;
cout << "Enter " << x << "'s strenght:" << endl;
int z;
cin >> z;
array[iii] -> SetName(x);
array[iii] -> SetHealth(y);
array[iii] -> SetStrenght(z);
}
cout << endl;
for (int iii = 0; iii<*size; iii++)
{
cout << "Name: " << array[iii] -> GetName() << endl;
cout << "Health: " << array[iii] -> GetHealth() << endl;
cout << "Strenght: " << array[iii] -> GetStrenght() << endl;
cout << endl;
}
char * YN = new char;
cout << "Would you like to sort the array? <Y/N>" << endl;
do
{
cin >> *YN;
if (*YN != 'y' && *YN != 'Y' && *YN != 'n' && *YN != 'N')
{
cout << "Invalid input." << endl;
}
} while ( *YN != 'y' && *YN != 'Y' && *YN != 'n' && *YN != 'N');
/*int aaa;
cout << "Sort by: " << endl;
cout << "1. Health" << endl;
cout << "2. Strenght" << endl;*/
int bbb;
cout << "Sort in:" << endl;
cout << "1. Ascending order" << endl;
cout << "2. Descending order" << endl;
do
{
cin >> bbb;
if (bbb != 1 && bbb != 2)
{
cout << "Invalid input." << endl;
}
} while ( bbb != 1 && bbb != 2);
if(bbb == 1)
{
Sort(*array, size, Ascending);
}
else if (bbb == 2)
{
Sort(*array, size, Descending);
}
for(int iii=0; iii<*size; iii++)
{
delete array[iii];
}
delete size;
delete YN;
system("pause");
return 0;
}
Posto kod nema komentara, da objasnim sta bi program trebao raditi:
Program je s //-----// podijeljen na tri dijela: u prvom su proglasene dvije klase.
U drugom je bubble sort kod kojega se i javlja problem. U trecemu je glavna funkcija u kojoj je smjestena mreza tih "zmajeva" i za svakoga se trazi da se unese ime, i dvije vrijednosti koje predstavljaju zivot i snagu (kao u igrama). Zatim se nudi opcija da se ti "zmajevi" sortiraju ili po zdravlju ili po snazi (makar je u gornjem kodu to iskomentirano) i redosljed sortiranja, uzlazni ili silazni. Zato se u drugom dijelu u void Sort() funkciji nalazi jedna bool funkcija kao parametar i onda usporeduje dva argumenta. Problem je sto ne znam sta da postavim kao parametar, (int, int) ocito ne funkcionira. Funkciji se treba proslijediti dvije vrijednosti koje su u biti integeri ali i elementi mreze te Dragon klase.
Ovo su greske koje mi javlja:
In function `void Sort(Dragon*, int*, bool (*)(int, int))':
argument of type `int (Monster::)()' does not match `int'
i u zadnja cetiri reda oznacena zutim non-lvalue in assigment
Ovo oznaceno zelenim markerom; zar ne bi delete [] array; imalo isti efekt?
I kod unosa stringa, onaj cin.ignore() je tamo zato sto inace program prestane raditi kada se unese razmak.
@Rattner
Koristi što više STL C++-a.Ovdje imaš svoju verziju sorta , kontejner kroz matricu ... , program radi i daje neki rezultat. ali može to sigurnije , brže , preglednije ... kroz STL C++-a. On je sastavni dio jezika i lupaj po njemu što više i u sve svrhe. Nećeš biti zakinut za "ispod haube znanje" jer učenjem STL-a naučit ćeš sve homemade verzije čega se god sjetiš ali izvedene na najbži i najoptimizarniji način a u pozadini svakog #include // stdTempLib C++ leži low-level.
Pozz svima
Moze li mi neko uraditi ovaj zadatak sa for petljama? Ja imam uradjen na ovaj nacin ali ako moze bez ovog bool da se uradi bio bih vam zahvalan.
#include <iostream>
using namespace std;
int main()
{
int niz[10];
bool jeste = true;
cout<<"Unesi brojeve: "<<endl;
for(int i=0; i<10; i++)
cin>>niz[i];
for(int i=0; i<9; i++)
if(niz[i]>=niz[i+1])
if(jeste == true)
cout<<"jeste rastuci"<<endl;
else
cout<<"nije rastuci"<<endl;
system("pause");
return 0;
}
Samo zamijeni bool sa int.
neradi tj radi ali nedaje tacne rezultate
ako si ti mislio da ovo uradim
int main (){
int niz[10];
int jeste = true;
cout<<"Unesi brojeve: "<<endl;
for(int i=0; i<10; i++)
cin>>niz[i];
for(int i=0; i<9; i++)
if(niz[i]>=niz[i+1])
if(jeste == true)
cout<<"jeste rastuci"<<endl;
else
cout<<"nije rastuci"<<endl;
ako vam nije problem da mi napisete novi program
Ma naravno, uvjek ti izbacuje "Niz jeste rastući".
Ja bih to uradio ovako:
#include <iostream>
using namespace std;
int main()
{
int jeste=0;
int niz[10];
for(int i=0; i<10; i++)
{
cin>>niz[i];
}
for(int i=0; i<10; i++)
{
if(niz[i]<=niz[i+1])
{
jeste=1;
break;
}
}
if(jeste)
{
cout<<"Niz je rastuci!"<<endl;
}
else
{
cout<<"Niz je opadajuci"<<endl;
}
system("PAUSE");
return 0;
}
hvala sto si se potrudio ali i ovdje uvijek mi ispise niz je rastuci
hvala sto si se potrudio ali i ovdje uvijek mi ispise niz je rastuci
To ovisi šta unosiš, unosi slijedno niz, recimo po jedan manje: