首页
登录 | 注册

程序中对密码进行加解密的C代码示例

问题的提出

在实际的软件项目中,经常涉及到对密码的处理,如用户登录密码、数据库密码、FTP密码等。为了增加软件的灵活性,一般都要求将这些密码放到一个配置文件中。但密码原文容易记录,若被软件入侵者获取,则后果不堪设想。因此我们不能直接将密码原文填入配置文件中,而要先对密码进行加密,然后将加密之后的密文填入配置文件,等程序读取配置之后再进行解密处理。

整个流程如图1所示。

程序中对密码进行加解密的C代码示例

图1 加解密总体流程

 

示例程序流程

为了演示整个加解密的流程,设计了一个演示程序,其执行流程如图2所示。

程序中对密码进行加解密的C代码示例

图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所示。

程序中对密码进行加解密的C代码示例

图3 配置文件内容

 

程序执行结果

1. iDecryptFlag为0时:

执行结果如图4所示:

程序中对密码进行加解密的C代码示例

图4 iDecryptFlag为0时的执行结果

查看配置文件,这时密码值为加密之后的密文。

 

2. iDecryptFlag为1时:

执行结果如图5所示:

程序中对密码进行加解密的C代码示例

图5 iDecryptFlag为1时的执行结果

查看配置文件,这时密码值经历了“原文-->密文-->原文”的过程。

 




2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号