好的,所以我正在为大学课程构建一个程序,这是一个简单的程序,它使用结构来模拟用户信息和用户名和密码的数据库。为了获得实验室的额外信用,我们可以加密密码。这不是什么特别的......我们没有使用MD5或类似的任何高级。
我需要做的就是能够将大写字符切换为小写,小写字符为大写,最后,我遇到麻烦的部分,将十进制整数转换为十六进制。
我会尝试仅发布程序的相关部分而不是整个程序。
这是结构:
struct Info
{
string sFname;
string sLname;
string sUname;
string sPword;
string sAddress;
string sEmail;
string sPhone;
};
注意:这是一个动态的结构数组
Info *Users;
Users = new Info[size];
这是我到目前为止加密密码的代码:
//string length for controlling loops
strlen = Users[iUsrCount].sPword.length();
//temp string to hold the encrypted version of password
string temp;
//switch uppercase characters to lowercase and vice versa, and convert
//decimal integers into hexadecimal
for(int i=0; i<strlen; i++)
{
cout << "\n\nInside encryption for loop iteration " << i << "\n\n";
if(islower(Users[iUsrCount].sPword[i]))
{
temp += toupper(Users[iUsrCount].sPword[i]);
continue;
}
else if(isupper(Users[iUsrCount].sPword[i]))
{
temp += tolower(Users[iUsrCount].sPword[i]);
continue;
}
else if(isdigit(Users[iUsrCount].sPword[i]))
{
char charNum = Users[iUsrCount].sPword[i];
int iDec = charNum - '0';
//get integer
while((i+1) < strlen && isdigit(Users[iUsrCount].sPword[i+1]))
{
i++;
iDec = iDec * 10 + Users[iUsrCount].sPword[i] - '0';
cout << " " << iDec << " ";
}
char hexTemp[10];
//convert
sprintf(hexTemp, "%x", iDec);
temp += hexTemp;
//debugging cout to make sure hexes are properly calculated
cout << " " << hexTemp << " ";
continue;
}
}
//debugging cout to make sure that password is properly encrypted
cout << endl << endl << temp << endl << endl;
strlen = temp.length();
//overwrite the plain text password with the encrypted version
for(int i=0; i<strlen; i++)
Users[iUsrCount].sPword[i] = temp[i];
//debugging cout to make sure copy was successful
cout << endl << endl << Users[iUsrCount].sPword;
所以,如果你的密码是:
456Pass45word87
加密时看起来像这样:
1c8pASS2dWORD57
我们还必须反转字符串,但这很简单。
我的两个问题是:
有没有更简单的方法呢?
在我的生活中,我不能找出解密密码的正确算法,我需要这样做,以便当用户登录时,计算机可以将他们输入的内容与纯文本进行比较他们的密码版本。
注意:我绝不是一个专业的程序员,所以请怜悯一个菜鸟,尽量不要对我太过先进。我到处都看了,但是找不到任何能帮助我解决具体情况的事情。
所以我将自己置身于互联网的怜悯之中。 :d
答案 0 :(得分:1)
- 你的方法似乎很好。你的方式很简单明了。
- 您不应该尝试解密密码。用户登录时,使用加密密码进行比较。
答案 1 :(得分:0)
使用boost和C ++ 11有更简单的方法可以做到这一点,但如果你不介意vanilla C ++ 98,那么你可以使用STL和一元函数 < / p>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <sstream>
#include <cctype>
#include <vector>
#include <iterator>
using namespace std;
//modified from here:
//https://stackoverflow.com/a/313990/866930
char flipcase (char in) {
if (in<='Z' && in>='A')
return in-('Z'-'z');
else if (in<='z' && in>='a') {
return in+('Z'-'z');
}
return in;
}
int main() {
string test = "456Pass45word87";
transform(test.begin(), test.end(), test.begin(), flipcase);//this flips uppercase to lowercase and vice-versa
string nums, text;
vector<string> parts;
//break the string into its constituent number and textual parts and operate
//on them accordingly.
//for text, store all until a non-text character is reached. Reset.
//for numbers, keeping iterating until the first non-digit character
//is reached. Store, then reset.
for (int i = 0; i < test.length(); i++) {
if (isdigit(test[i])) {
nums += test[i];
if (!text.empty()) {
parts.push_back(text);//store the text
}
text.clear();//reset the memory in it
}
else {
text += test[i];
if (!nums.empty()) {
int n = atoi(nums.c_str());
stringstream ss;
//now reinsert back into the string stream and convert it to a hexadecimal:
ss << std::hex << n;
parts.push_back(ss.str());//now store it
nums.clear();//clear the number string
}
}
}
//at this point the vector contains the string broken into different parts
//that have been correctly modified.
//now join all the strings in the vector into one:
//adapted from here:
//https://stackoverflow.com/a/5689061/866930
ostringstream oss;
copy(parts.begin(), parts.end(), ostream_iterator<string>(oss,""));//we want no character delimiter between our strings
cout << oss.str();
return 0;
}
打印:
1c8pASS2dWORD57
根据需要。
注:
迭代字符串时可以使用迭代器,但这是你可以为自己做的事情。
参考文献:
https://stackoverflow.com/a/313990/866930
答案 2 :(得分:0)
对于您的加密,您可以将以下内容设置为参数:
//switch uppercase characters to lowercase and vice versa, and convert
//decimal integers into hexadecimal
所以要解密所有你需要做的就是扭转周期:
你将拥有解密版本。
如果您需要更多详细信息,请告诉我,我今天可以尝试提供帮助。