View difference between Paste ID: u2i7RXfT and mTqWrAPS
SHOW: | | - or go back to the newest paste.
1
#include <string>
2
#include <map>
3
#include <fstream>
4
#include <iostream>
5
#include <sstream>
6
using namespace std;
7
8
//Text file called pwlist.txt
9
//Duncan,WANIS
10
//James,OOIWDFV
11
12
void main(){ 
13
    map<string,string> pws;
14
15
    ifstream pf("pwlist.txt");
16
    for(string pw, user, line; pf.good() && getline(pf,line);pws.insert(pair<string,string>(user,pw)))
17
    {
18
        stringstream strm(line);
19
        getline(strm,user,',');
20
        getline(strm,pw,',');
21
    };
22
    pf.close();
23
24-
    cout<<('D'^116);
24+
25
    cout<<"Please enter username:\n";
26
    cin>>username;
27
    cout<<"Please enter password:\n";
28
    cin>>password;
29
30
    for( unsigned int i = 0; i < password.size(); ++i )
31
    {
32
        //A little bit encrpyted just to spice things up
33
        password[i] = 'A'+(password[i]^username[i%username.size()])%26;
34
    }
35
    
36
    if ( pws.find(username) != pws.end() && pws.find(username)->second == password )
37
    {
38
        cout<<"Correct Login Well Done!\n";
39
    }
40
    else
41
        cout<<"Incorrect please do not try again!\n";
42
43
    //Now to see if we can create a cracker.
44
    //The encrypted password is what needs to be modified we want another password that will colide
45
    //Assume we know the first pw char is W and real pw is R and the username is Duncan
46
    //R^D = 82^68 = 22
47
    //22%26 = 22
48
    //22+'A' = 'W'
49
    //So we need something else that creates W
50
    //So we need something so that x%26 = 22
51
    //x could be 22+26*anything lets try 48
52
    //So what ^ with 'D' = 48 well 116 does
53
    //116 = 't' therefore t would work instead of 'R'
54
    //And sure enough that came out correct so we have a collision.
55
    
56
    //We can work out all possible passwords from the password list as follows.
57
    //Remember max char is 128 128/26 = ~4.9
58
    //Assume passwords are in the range 32-126 ie special chars, chars, numerical
59
    
60
    username = "James";
61
    string encryptedpw = pws.find(username)->second;
62
63
    for( unsigned int i = 0; i < encryptedpw.size(); ++i )
64
    {
65
        int beforemod = encryptedpw[i]-'A';
66
        cout<<"Character "<<i<<" is one of: ";
67
        for( ; beforemod < 128; beforemod+=26 )
68
        {
69
            char possible = (char)beforemod^username[i%username.size()];
70
            if ( possible > 31 && possible < 127 ){
71
                cout<<possible<<", ";
72
            }
73
        }
74
        cout<<endl;
75
    }
76
    //From this response it is clear that it would still take a small amount of work to
77
    //calculate the original. Although ultimatly it doesn't matter as we have now a list
78
    //of valid passwords.
79
80
    //Pause until we are done
81
    cin>>username;
82
}