Πρόβλημα με Brute force

...IDE, compilers, κλπ

Συντονιστής: konnn

Πρόβλημα με Brute force

Δημοσίευσηαπό mortis1572 » 04 Ιουν 2010, 12:56

Καλημέρα ,
Το πρόγραμμα που θέλω να κάνω έχει ως σκοπό να παίρνει ένα αρχείο σε zip μορφή με κρυπτογράφηση AES και να βρίσκει τον κωδικό είτε με brute force είτε με επίθεση λεξικού.
Τον κώδικα για την επίθεση λεξικού τον έχω κάνει αλλά για την brute force έχω κάποιο πρόβλημα.
Το πρόβλημα μου είναι το εξής:Για κάποιον λόγο όταν το μήκος του κωδικού είναι πάνω από 7 χαρακτήρες(όσο είναι το μήμος του κλειδιού ανάλογα προσαρμόζω και το μήκος του πίνακα) δεν μου εμφανίζει των κωδικό που θέλω αλλά κάποιον άλλο σαν να μπερδεύει τα νούμερα(π.χ αν ο κωδικός είναι 12345678 αυτό μου βγάζει σαν απότελεσμα 12272312).Ενώ όταν ο κωδικός είναι μικρότερος από 7 χαρακτήρες το βρίσκει κανονικά.
'Εχω κολήσει και δεν μπορώ να βρω το λάθος.
Ο κώδικας που έχω γράψει είναι ο παρακάτω:

Κώδικας: Επιλογή όλων
import java.io.*;
import java.*;
import com.javamex.arcmexer.*;

public class New{
private static char charList[] = {/*'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z','0',*/'1','2','3','4','5','6','7','8'};
private static int len = 8;
private static String foundWord;
private static String inputLine;
private static boolean stop;

public static void main(String[] args)
{
prompt();
}

public static void prompt()
{
try {
System.out.println("Give the path of the file");
BufferedReader flnm = new BufferedReader(new InputStreamReader(System.in));
inputLine = flnm.readLine();
System.out.println("What is the password of " + inputLine + " ? ");
System.out.println("Working...");
findWord();
System.out.println("The password is: " + foundWord);
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
}

public static void findWord()
{
StringBuffer sb = new StringBuffer(len);
char currChar = charList[0];
for(int a = 0; a < len; a++)
sb.append(currChar);

cycleChars(0, sb);
}

public static StringBuffer cycleChars(int pos, StringBuffer sb)
{
try{
FileInputStream f = new FileInputStream(inputLine);
ArchiveReader r = ArchiveReader.getReader(f);
ArchiveEntry entry ;
while ((entry = r.nextEntry())!= null){
if (stop == false)
{
for(int i = 0; i < len; i++)
{
sb.setCharAt(pos, charList[i]);
if (pos == len - 1)
{
if (entry.isProbablyCorrectPassword(sb.toString())){
stop = true;
foundWord = sb.toString();
break;
}
}else
cycleChars(pos + 1, sb);
}
}
}
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
mortis1572
babeTUX
babeTUX
 
Δημοσιεύσεις: 8
Εγγραφή: 21 Μαρ 2009, 00:40
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό AxlD » 04 Ιουν 2010, 13:57

Ειναι σε Java το προγραμμα και δεν ξερω καθολου Java, αλλα θα σου πω το πιο απλο, ετσι για να αποκλεισουμε παν ενδεχομενο. Την μεταβλητη του κωδικου, την εχεις ορισει double, ή την αντιστοιχη double της Java?

edit: Πολυ ενδιαφερον παντως, αυτο το κανεις για προσωπικο πειραματισμο? (το ειδες πουθενα σε κανα totalXAKER?) ή ειναι καποια εργασια σε κανα μαθημα Ασφαλεια Δεδονμενων?

edit2: Φτιαξε αν μπορεις τον signature σου... :)
Γνώσεις: Linux: Χαμηλό ┃ Προγραμματισμός: Προσπαθώ σε C++ και βλέπουμε... ┃ Αγγλικά: Πολύ Καλά
OS: Ubuntu 10.04 64 bit + Windows 7 64 bit (Games) (dual boot)
CPU: AMD Phenom II 965 3.4GHz Black Edtion
MoBo: ASUS Crosshair III Formula
RAM: Corsair Dominator DDR3 3X2GB 1600MHz
GPU: Sapphire Radeon Vapor-X HD 4890 2GB GDDR5
Monitor: Samsung Syncmaster P2370 23"
Άβαταρ μέλους
AxlD
babeTUX
babeTUX
 
Δημοσιεύσεις: 122
Εγγραφή: 23 Οκτ 2009, 17:18
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mathpoet » 04 Ιουν 2010, 15:26

Δεν το έψαξα όλο το πρόγραμμα, αλλά φαίνεται να είναι θέμα της isProbablyCorrectPassword(). Όπως λέει και το όνομά της, δεν είναι 100% σωστή. Για να είσαι σίγουρος πρέπει για όσα σου γυρίζει true να δοκιμάζεις ότι λειτουργεί η αποκρυπτογράφηση...

The method doesn't have to decrypt the data to make this decision, so it's faster than just trying to call getInputStream(). It has a false-positive rate of about 1 in 65 thousand (i.e. for every 65,000 or so candidate passwords you supply, it will spuriously return true even though that isn't the real password). This means that in a real-life application, you would probably want to modify code such as the above so that when isProbablyCorrectPassword() returned true, it actually decrypted the data and inspected it before concluding that the correct password had been found.

http://www.javamex.com/arcmexer/zip_pas ... very.shtml
mathpoet
babeTUX
babeTUX
 
Δημοσιεύσεις: 72
Εγγραφή: 27 Νοέμ 2008, 16:27
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mortis1572 » 06 Ιουν 2010, 18:35

Αυτό το θέμα είναι η πτυχιακή μου και έχω φάει αρκετό χρόνο για αυτό και δεν μπορω να καταλάβω το λάθος μου.Μίλησα με τον καθηγητή μου καιμ ου λέει ότι είναι κάποιο λογικό λάθος.Γιατί δεν μπορεί με μικρότερο μήκος κλειδιού να το βρίσκει αλλά με μεγαλύτερο να μην το βρίσκει.
'Εχω δοκιμάσει να κάνω το ίδιο κωδικα χωρίς λογική μεταβλητή αλλά σε εκείνο των κώδικα είναι ότι βρίσκει οποιονδήποτε κωδικό αλλά δεν τον εμφανίζει και σε αυτό τον κώδικα(Δηλαδή αν ο κωδικός είναι το 12345678 , εμφανίζει τον με το μύνημα ότι δεν το βρήκε This in not the password , try again
12345675 ,
This in not the password , try again
12345677 , παραλείπει τον 12345678 και εμφανίζει το μύνημα
Password found και συνεχίζει μέχρι να φτάσει στο 88888888 )
μου είπε ότι μάλλον δεν βλέπει κάποιο break ή ότι ξέχασα κάποιο break.
Αν θέλετε να του ρίξετε μια ματιά τον παραθέτω παρακάτω:

Κώδικας: Επιλογή όλων
import java.io.*;
import java.*;
import com.javamex.arcmexer.*;
public class Geo{
private static char fCharList[] = {'1','2','3','4','5','6','7','8'};
private static final int len = 8;
//private static boolean stop;
private static String foundWord;

public static void Brute()
{
StringBuffer sb = new StringBuffer(len);
char currentChar = fCharList[0];
for (int i = 0; i < len; i++)
{
sb.append(currentChar);
}

ChangeCharacters(0, sb);
}

public static StringBuffer ChangeCharacters(int pos, StringBuffer sb)
{
try {
FileInputStream f = new FileInputStream("C://12.zip");
ArchiveReader r = ArchiveReader.getReader(f);
ArchiveEntry entry ;
while ((entry = r.nextEntry())!= null){
//if (stop == false){
for (int i = 0; i < len ; i++){
sb.setCharAt(pos, fCharList[i]); //Αποθηκεύει τον χαρακτήρα fCharList[i] στη θέση pos
if (pos == len - 1)
{
if (entry.isProbablyCorrectPassword(sb.toString())){
System.out.println("This is the password");
foundWord = sb.toString();
//stop = true;
break;
}else{
System.out.println("This in not the password , try again");
}
System.out.println(sb.toString());
/*stop = true;
foundWord = sb.toString();
break;*/
}else
{
ChangeCharacters(pos + 1 , sb);
}
}
// }
}
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
return sb;
}
public static void Read(){
try {
/*System.out.println("Give the path of the file");
BufferedReader flnm = new BufferedReader(new InputStreamReader(System.in));
inputLine = flnm.readLine();
System.out.println("What is the password of " + inputLine + " ? ");*/
//System.out.println("Working...");
Brute();
System.out.println("The password is: " + foundWord);
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
}
public static void main(String[] args) {
Read();
}
}
mortis1572
babeTUX
babeTUX
 
Δημοσιεύσεις: 8
Εγγραφή: 21 Μαρ 2009, 00:40
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mathpoet » 07 Ιουν 2010, 19:49

Δεν μπορώ να δω όλο τον κώδικά σου, αλλά μπορώ να σου δώσω κάποιες κατευθύνσεις.

Καταρχήν όπως σου είπα και παραπάνω, η isProbablyCorrectPassword() θα σου γυρίσει true για περισσότερα από 1 strings. Έτσι είναι φτιαγμένη. Οπότε όταν σου γυρίσει true πρέπει ή να επιβεβαιώσεις ότι όντως είναι ο σωστός κωδικός και μετά να σταματήσεις το ψάξιμο, ή να εμφανίσεις το string ως πιθανό κωδικό και να συνεχίσεις το ψάξιμο μέχρι το τέλος για να σου φέρει και τους υπόλοιπους πιθανούς. Κάποιος κωδικός από αυτούς θα είναι ο σωστός.

Επίσης ρίξε μια ματιά στον παρακάτω κώδικα που παράγει όλα τα strings μέχρι ένα μέγεθος. Νομίζω ότι μπορείς πολύ εύκολα να τον προσαρμόσεις σε αυτό που θέλεις.

Κώδικας: Επιλογή όλων

private static char fCharList[] = {'a', 'b', 'c', 'd'};
private static final int maxLen = 3;

private static void generateStrings(StringBuffer sb) {
if (sb.length() < maxLen) {
for (int i = 0; i < fCharList.length; i++) {
sb.append(fCharList[i]);
System.out.println(sb);
generateStrings(sb);
sb.deleteCharAt(sb.length() - 1);
}
}
}

public static void main(String[] args) throws Exception {
generateStrings(new StringBuffer());
}
mathpoet
babeTUX
babeTUX
 
Δημοσιεύσεις: 72
Εγγραφή: 27 Νοέμ 2008, 16:27
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mortis1572 » 08 Ιουν 2010, 23:28

Για την συγκεκριμένη συνάρτηση isProbablyCorrectPassword() όταν την χρησιμοποίησα στη επίθεση λεξικού έτρεξε κανονικά μου έβγαζε μόνο ένα String το οποίο ήταν και το σωστό.'Οσο για των κώδικα που μου έχεις γράψει τον είχα κάνει και εγώ.
Αλλά επειδή τα αποτέλεσματα δεν ήταν με την μορφή που τα ήθελα το άφησα και δεν συνέχισα.
Με τον δεύτερo κώδικα που έγραψα μου λες ότι δεν μπορείς να το δεις.Υπάρχει κάποιο πρόβλημα έτσι όπως το έγραψα ή δεν κατεβαίνει η μπάρα για να τον διαβάσεις όλο?
Θέλεις να σου τον στείλω με pm?
mortis1572
babeTUX
babeTUX
 
Δημοσιεύσεις: 8
Εγγραφή: 21 Μαρ 2009, 00:40
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mathpoet » 09 Ιουν 2010, 12:52

Το ότι το έτρεξες μερικές φορές και σου έβγαλε με τη 1 το password δεν λέει κάτι. Αφού σου εξηγούν οι άνθρωποι που την έφτιαξαν ότι δεν δουλεύει έτσι όπως θες.

Στον κώδικά σου είδα αυτό:
Κώδικας: Επιλογή όλων

if (entry.isProbablyCorrectPassword(sb.toString())){
...
break;
}


Αν η isProbablyCorrectPassword γυρνάει true μόνο για το σωστό κωδικό, είναι οκ. Διαφορετικά, προφανώς δεν είναι οκ
mathpoet
babeTUX
babeTUX
 
Δημοσιεύσεις: 72
Εγγραφή: 27 Νοέμ 2008, 16:27
Εκτύπωση

Re: Πρόβλημα με Brute force

Δημοσίευσηαπό mortis1572 » 12 Ιουν 2010, 01:14

Είχες δίκιο η συγκεκριμένη συνάρτηση isProbablyCorrectPassword() όταν είναι είναι σωστό το απότελεσμα επιστρέφει true και επειδή χεησιμοποιούσα και εγώ μια λογική μεταβλητή , εκεί παρουσιάζονταν το πρόβλημα και έβγαζε σαν αποτέλεσμα λάθος κωδικούς και όχι τον σωστό.
Αλλά πάλι δεν καταλαβαίνω γιατί στο δεύτερο κώδικα που έγραψα ενώ βρίσκει τον κωδικό δεν σταματάει το πρόγραμμα , αλλά σταματάει μόνο όταν εμφανίσει όλους τους πιθανούς κωδικούς.
Σαν να μην βλέπει το break ή να έχω ξεχάσει κάποιο break.

Κώδικας: Επιλογή όλων
import java.io.*;
import java.*;
import com.javamex.arcmexer.*;

public class New{
private static char charList[] = {/*'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z','0',*/'1','2','3','4','5','6','7','8'};
private static int len = 8;
private static String foundWord;
private static String inputLine;
private static boolean stop;

public static void main(String[] args)
{
prompt();
}

public static void prompt()
{
try {
System.out.println("Give the path of the file");
BufferedReader flnm = new BufferedReader(new InputStreamReader(System.in));
inputLine = flnm.readLine();
System.out.println("What is the password of " + inputLine + " ? ");
System.out.println("Working...");
findWord();
System.out.println("The password is: " + foundWord);
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
}

public static void findWord()
{
StringBuffer sb = new StringBuffer(len);
char currChar = charList[0];
for(int a = 0; a < len; a++)
sb.append(currChar);

cycleChars(0, sb);
}

public static StringBuffer cycleChars(int pos, StringBuffer sb)
{
try{
FileInputStream f = new FileInputStream(inputLine);
ArchiveReader r = ArchiveReader.getReader(f);
ArchiveEntry entry ;
while ((entry = r.nextEntry())!= null){
if (stop == false)
{
for(int i = 0; i < len; i++)
{
sb.setCharAt(pos, charList[i]);
if (pos == len - 1)
{
if (entry.isProbablyCorrectPassword(sb.toString())){
stop = true;
foundWord = sb.toString();
break;
}
}else
cycleChars(pos + 1, sb);
}
}
}
}catch (Exception e){
System.out.println("Exception raised!");
e.printStackTrace();
}
mortis1572
babeTUX
babeTUX
 
Δημοσιεύσεις: 8
Εγγραφή: 21 Μαρ 2009, 00:40
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού