问题的提出
在实际的软件项目中,经常涉及到对密码的处理,如用户登录密码、数据库密码、FTP密码等。为了增加软件的灵活性,一般都要求将这些密码放到一个配置文件中。但密码原文容易记录,若被软件入侵者获取,则后果不堪设想。因此我们不能直接将密码原文填入配置文件中,而要先对密码进行加密,然后将加密之后的密文填入配置文件,等程序读取配置之后再进行解密处理。
整个流程如图1所示。
图1 加解密总体流程
示例程序流程
为了演示整个加解密的流程,设计了一个演示程序,其执行流程如图2所示。
图2 示例程序流程
示例程序代码
/********************************************************************** *版权所有 (C)2015, Zhou Zhaoxiong。 * *文件名称:EncryptPwdAndDecryptPwd.c *文件标识:无 *内容摘要:从配置文件中读取密码并进行加解密 *其它说明:无 *当前版本:V1.0 *作 者:Zhou Zhaoxiong *完成日期:20150306 * **********************************************************************/ #include #include // 重新定义数据类型 typedef unsigned char UINT8; typedef int INT32; typedef unsigned int UINT32; // 对函数进行声明 INT32 EncryptPwdStr(UINT8 *pszPwdStr, UINT32 iInPwdLen, UINT32 iOperFlag); INT32 main(); /********************************************************************** *功能描述:主函数 *输入参数:无 *输出参数:无 *返 回 值:无 *其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------------- * 20150306 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { UINT8 szConfigFile[128] = {0}; UINT8 szPassword[128] = {0}; INT32 iRetVal = 0; UINT32 iDecryptFlag = 0; // 获取配置文件全路径(包括文件名) GetCurrentDirectory(sizeof(szConfigFile)-1, szConfigFile); strcat(szConfigFile, "\\"); strcat(szConfigFile, "Config.ini"); // 读入密码明文 GetPrivateProfileString("PWDINFO", "Password", "", szPassword, sizeof(szPassword), szConfigFile); iRetVal = EncryptPwdStr(szPassword, strlen(szPassword), 1); // 加密 if (iRetVal == 0) // 加密成功 { printf("Encrypt password successfully! Password is: %s\n", szPassword); } else { printf("Encrypt password failed!\n"); return -1; // main函数执行失败返回-1 } // 将加密后的密码写入配置文件中 printf("Write the encrypted password into config file.\n"); WritePrivateProfileString("PWDINFO", "Password", szPassword, szConfigFile); // 判断是否对加密后的密码进行解密 printf("To decrypt the encrypted password or not? 0-No, 1-Yes\n"); scanf("%d", &iDecryptFlag); if (iDecryptFlag != 0 && iDecryptFlag != 1) // 判断输入值是否正确 { printf("Input error, you must input 0 or 1, please check!\n"); return -1; } if (iDecryptFlag == 1) // 需要解密, 并将解密后的密码写入配置文件中 { iRetVal = EncryptPwdStr(szPassword, strlen(szPassword), 2); // 解密 if (iRetVal == 0) // 解密成功 { printf("Decrypt password successfully! Password is: %s\n", szPassword); } else { printf("Decrypt password failed!\n"); return -1; // main函数执行失败返回-1 } // 将解密后的密码写入配置文件中 printf("Write the decrypted password into config file.\n"); WritePrivateProfileString("PWDINFO", "Password", szPassword, szConfigFile); } else { printf("Don't decrypt the encrypted password.\n"); } return 0; // main函数执行成功返回0 } /********************************************************************** *功能描述:对密码字符串的每一位进行加解密处理 *输入参数:*pszPwdStr-输入/输出密码字符串 iInPwdLen-输入密码字符串长度 iOperFlag-操作标识, 1-加密, 2-解密 *输出参数:*pszPwdStr-输入/输出密码字符串 *返 回 值: 0-成功 -1-失败 *其它说明: 密码字符串的每一位的ASCII码值加上16或减去16 * 修改日期 版本号 修改人 修改内容 * -------------------------------------------------------------------- * 20150306 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 EncryptPwdStr(UINT8 *pszPwdStr, UINT32 iInPwdLen, UINT32 iOperFlag) { UINT32 iLoopFlag = 0; if (pszPwdStr == NULL) // 异常保护 { printf("EncryptPwdStr: Input string is NULL!\n"); return -1; // 返回-1表示该函数执行失败 } for (iLoopFlag = 0; iLoopFlag
配置文件示例
配置文件命名为Config.ini,其设置如图3所示。
图3 配置文件内容
程序执行结果
1. iDecryptFlag为0时:
执行结果如图4所示:
图4 iDecryptFlag为0时的执行结果
查看配置文件,这时密码值为加密之后的密文。
2. iDecryptFlag为1时:
执行结果如图5所示:
图5 iDecryptFlag为1时的执行结果
查看配置文件,这时密码值经历了“原文-->密文-->原文”的过程。
时间: 2024-10-13 16:35:59