程序中对密码进行加解密的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 

 

配置文件示例

配置文件命名为Config.ini,其设置如图3所示。

图3 配置文件内容

 

程序执行结果

1. iDecryptFlag为0时:

执行结果如图4所示:

图4 iDecryptFlag为0时的执行结果

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

 

2. iDecryptFlag为1时:

执行结果如图5所示:

图5 iDecryptFlag为1时的执行结果

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

 

时间: 2024-10-13 16:35:59

程序中对密码进行加解密的C代码示例的相关文章

asp.net程序中最常用的三十三种编程代码

asp.net|编程|程序 asp.net程序中最常用的三十三种编程代码,为初学者多多积累经验,为高手们归纳总结,看了觉得很有价值~,大家不妨参考下!  1. 打开新的窗口并传送参数:   传送参数:  response.write("<script>window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"')</script>") 

程序中传递密码给数据库文件

有些数据库文件在打开的时候要求输入密码,在程序中自动传递密码的方法为: 1.把Table及DataSource设置好,指向该数据库,Table的Active为false; 2.添加Session->AddPassword(12345); //12345为打开该数据库的密码 Table->Active=true; //就可以打开该表了 3.移去密码:Session->RemovePassword(12345);

Java中RSA非对称密钥加解密使用示例

一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法. 二.RSA的公钥.私钥的组成,以及加密.解密的公式可见于下表 三.使用方式: ① 假设A.B机器进行通信,已A机器为主: ② A首先需要用自己的私钥为发送请求数据签名,并将公钥一同发送给B

在程序中压缩sql server2000的数据库备份文件的代码_MsSql

怎样压缩sql server2000的数据库备份文件,像rar一样?小弟有一7m的sql server2000 数据库备份文件,在程序中怎样压缩啊? 复制代码 代码如下: procedure TForm1.Button2Click(Sender: TObject);  var    SHExecInfo: SHELLEXECUTEINFO;  begin   SHExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);    SHExecInfo.fMask :=

在程序中压缩sql server2000的数据库备份文件的代码

怎样压缩sql server2000的数据库备份文件,像rar一样?小弟有一7m的sql server2000 数据库备份文件,在程序中怎样压缩啊? 复制代码 代码如下: procedure TForm1.Button2Click(Sender: TObject);  var    SHExecInfo: SHELLEXECUTEINFO;  begin   SHExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);    SHExecInfo.fMask :=

结构体中指针赋值问题的分析及C代码示例

问题描述 某结构体的定义如下: typedef struct { int iAge; // 年龄 char szAddr1[100]; // 地址1 char *pszAddr2; // 地址2 char **pszAddr3; // 地址3 } T_PeopleInfo; 请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值? 问题分析及C代码示例 我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr

ASP程序中使用断开的数据记录集的代码_应用技巧

因此为了节省服务器资源,应该尽可能关闭连接以释放连接所占有的资源,这种关闭记录集的连接而不关闭记录集的技术叫做断开记录集,这个记录集本身则称为断开的记录集. 下面我们就通过一个实例来说明这种技术的使用方法(NorthWind.mdb是Microsoft Access97自带的一个数据库,文件adovbs.inc可在C:\Program Files\Common Files\System\ADO下找到): 复制代码 代码如下: <% @LANGUAGE = VBScript %> <!--

ASP程序中使用断开的数据记录集的代码

因此为了节省服务器资源,应该尽可能关闭连接以释放连接所占有的资源,这种关闭记录集的连接而不关闭记录集的技术叫做断开记录集,这个记录集本身则称为断开的记录集. 下面我们就通过一个实例来说明这种技术的使用方法(NorthWind.mdb是Microsoft Access97自带的一个数据库,文件adovbs.inc可在C:\Program Files\Common Files\System\ADO下找到): 复制代码 代码如下: <% @LANGUAGE = VBScript %> <!--

VBS 加解密 For CAPICOM

这篇文章主要介绍了vbs中通过CAPICOM进行加解密的实现代码,需要的朋友可以参考下   复制代码 代码如下: '****************************************************************************** ' ' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, ' EITHER EXPRESSED OR IMPLIE