I'm working on a simple data storing program for my senior year (Secondary School / Grade 12), and there is a user sign-in functionality I've decided to implement. The way I've done this is by storing the usernames and passwords in a text file. They are stored as follows:
userName password
userName password
...
The usernames, I've decided to leave as plain text, as is decided by the user upon registration. The passwords however, I've decided to encrypt by inserting a special character ( '/' , '?' , ':', ...) between each of the characters entered by the user. This is simple to code as I've done:
// password is passed to the function as a string parameter
fstream writer;
writer.open("database.txt", ios::app);
int separators[16];
for (int i = 0; i < 16; i++)
{
int randomi = rand() % (47 - 33 + 1) + 33;
separators[i] = randomi;
}
for (int j = 0; j < password.length(); j++)
{
int randomIndex = rand() % 6;
writer << (int)password[j] << separators[randomIndex];
}
writer << "\n";
For the time being, I've decided to only use on of the special characters to figure out the decryption mechanism. So, using '/'
as the special character, the following is my decryption code:
...
__int64 l=0;
...
for (int i = 0; i < a.length(); i = i + 2) //a is the password read from the file as a string.
{
if (a[i] - 48 > 4) //greater than 4 as the ASCII values of alphabets are above 50
{
l = l * 10;
l = l + (a[i] - 48); //yields the int value from the ASCII number.
l = l * 10;
l = l + (a[i + 1] - 48);
}
}
The above code, takes in the password from the file, and scans for the number 4 (explained in the comment above); if the current number is not 4, it stores its int
value in a variable called l
. (Pardon the insignificant naming please), and does the same for the next letter, before incrementing i
by 2, as the special character's ASCII value is 2 numbers.
There are drawbacks of this, mentioned at the bottom.
The verification mechanism for this system is as:
...
__int64 dy=0;
...
for (int i = 0; i < c.length(); i++) //password passed to decrypt function as string
{
dy = dy * 100;
dy = dy + (toupper(c[i])); //toupper so that the alphabet's ASCII value is only 2 digits
}
if (dy == l) // `l` from the decryption mechanism
{
cout << "VALID";
}
else
{
cout << "INVALID";
}
This works on the basis that it takes every character's ASCII value and converts it into an int
for the entire word.
Example:
User entered password : Mayur Stored password (in file after encryption) : 77476547894785478247 //while using only the special character `/` Password converted into `int` format : 7765898582 //each 2 digits corresponds to a character in the user entered password Decrypted password : 7765898582 Passwords match! Valid!
Major drawbacks:
At the moment, I have difficulties with decrypting for lower case alphabets due to triple digit ASCII values
Password size small due to overflow conditions of the integer format the decryted password is stored to verify.
At the moment, uses same special character to separate alphabets of actual password
I'd like you to pretty much to judge the system, and maybe if someone will post an estimate as to how hard this system would be to crack (given that the special characters will be random), and if there are more efficient ways to go about making this system more secure. (I might decided to encrypt usernames as well).