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

问题的提出

在实际的软件项目中,经常涉及到对密码的处理,如用户登录密码、数据库密码、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时的执行结果

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

 


某同学在宿舍公用计算机上面使用文本文件来记录每天的心情故事,但是宿舍公用计算机不能设置密码,同学担心自己的日记被偷看,特委托你来完成如下加密程序: 该程序是一个可加密数据的日记记录工具,具有如下功能要求: 1. 运行系统后,系统给出三个选项:1)新增日记;2)阅读日记;3)退出系统 2. 选择功能1)后,系统提示用户输入日记文件名称和路径,并创建文本文件;同时,用户输入两个字符a和b,作为密钥;创建文件后,用户开始输入日记内容,日记内容为文本形式,将日记内容加密,然后将加密后的内容写入文件; 3. 选择功能2)后,系统提示用户输入要打开的日记文件的路径和名称,打开文件后,读取文件的密文,解密后显示出来; 4. 加密算法推荐大家采用简单的文本加密算法来实现,算法思想如下,从明文读入一个字符(英文),使用密钥a与该字符做异或操作,将结果作为密文保存下来,再读入第二个字符,使用密钥b与该字符做异或操作,同样保存结果,以此类推加密全文;解密过程可将密文作为输入完成整个加密过程,返回就是明文。如果同学们有兴趣加密文,那么可将文的高八位使用密钥a加密,低八位使用密钥b加密,完成加密过程。 这个加密算法需要使用C语言的位运算运算符,包括:& 按位与、| 按位或、^ 按位异或、~ 取反、<> 右移。 那么本算法的异或可用如下方法完成,c为明文取得的一个字符,该字符加密(解密)指令如下: c = plaintext[i]; //i+1是奇数使用密钥a,是偶数采用密钥b cipher[i] = c ^ a; 那么在cipher[i]保存的就是c的密文。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值