程序中对密码进行加解密的C代码示例
2015-04-14 18:46
381 查看
问题的提出
在实际的软件项目中,经常涉及到对密码的处理,如用户登录密码、数据库密码、FTP密码等。为了增加软件的灵活性,一般都要求将这些密码放到一个配置文件中。但密码原文容易记录,若被软件入侵者获取,则后果不堪设想。因此我们不能直接将密码原文填入配置文件中,而要先对密码进行加密,然后将加密之后的密文填入配置文件,等程序读取配置之后再进行解密处理。
整个流程如图1所示。
图1 加解密总体流程
示例程序流程
为了演示整个加解密的流程,设计了一个演示程序,其执行流程如图2所示。
图2 示例程序流程
示例程序代码
配置文件示例
配置文件命名为Config.ini,其设置如图3所示。
图3 配置文件内容
程序执行结果
1. iDecryptFlag为0时:
执行结果如图4所示:
图4 iDecryptFlag为0时的执行结果
查看配置文件,这时密码值为加密之后的密文。
2. iDecryptFlag为1时:
执行结果如图5所示:
图5 iDecryptFlag为1时的执行结果
查看配置文件,这时密码值经历了“原文-->密文-->原文”的过程。
在实际的软件项目中,经常涉及到对密码的处理,如用户登录密码、数据库密码、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 < iInPwdLen; iLoopFlag ++) { if (iOperFlag == 1) // 加密 { pszPwdStr[iLoopFlag] = pszPwdStr[iLoopFlag] + 16; } else // 解密 { pszPwdStr[iLoopFlag] = pszPwdStr[iLoopFlag] - 16; } } return 0; // 返回0表示该函数执行成功 }
配置文件示例
配置文件命名为Config.ini,其设置如图3所示。
图3 配置文件内容
程序执行结果
1. iDecryptFlag为0时:
执行结果如图4所示:
图4 iDecryptFlag为0时的执行结果
查看配置文件,这时密码值为加密之后的密文。
2. iDecryptFlag为1时:
执行结果如图5所示:
图5 iDecryptFlag为1时的执行结果
查看配置文件,这时密码值经历了“原文-->密文-->原文”的过程。
相关文章推荐
- 实现对文件进行加密,解密程序代码
- N点主机管理系统密码解密代码程序
- 使用Python进行AES加密和解密的示例代码
- 微信小程序对wx.request函数进行封装操作的代码示例
- android中使用Socket连接进行聊天程序示例
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- openssl aes 加密解密示例程序
- java 图形用户界面 之 用户名和密码输入 示例程序
- 采用密码加密的javascript字符串加密、解密程序
- jquery 实现密码框的显示与隐藏示例代码
- 《Python进行自然语言处理》代码笔记(一):第一章示例
- 微信公众平台安全模式消息体签名及加解密PHP代码示例
- 用LINQ to SQL 进行数据访问、更新和删除(附Demo示例程序下载)
- 用Java进行HTTP请求的代码示例
- Lixux修改root密码,不管是忘记了,还是没设过;vim简单用法;程序安装包;程序,程序代码所在位置
- Ext GridPanel加载完数据后进行操作示例代码
- Java对xls文件进行读写操作示例代码
- WordPress注册时不能发邮件,修改程序代码直接显示密码的方法
- 文件中用tobase() && frombase64() 对密码进行加密和解密遇到的问题
- Unix网络编程代码 第5章 TCP客户/服务器程序示例