推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  71 随笔 :: 14 文章 :: 378 评论 :: 13 引用
没有想到,上个随笔的代码在POS机上出错,查了半天,如果去掉malloc和free,就没有事了。
所以,把现在的不用动态内存分配的算法记录下
/*
    功能:用mode = cbc , padding = pkcs7 来加密
         如果to == NULL, 则返回加密后数据的长度
    书写:evlon ,QQ:273352165
*/

int des_cbc_pkcs7_encrypt(uchar* from, int nLength,  uchar * to, uchar key[],uchar iv[])
{
    
//uchar buffer[8];
    int nSize = nLength % 8 ?(nLength + 7/ 8 * 8 : nLength + 8;
    
if(to == NULL)
    
{
        
//计算长度
        return nSize;
    }

    
else
    
{
        deskey(key,EN0);
        uchar preEnc[
8];
        memcpy(preEnc,iv,
8);
        
        
//加密块
        int i=0;
        
for(; i < nSize; i+=8)
        
{
            uchar
*     ps = from + i;
            uchar
*     pd = to + i;

            
if(nSize - i > 8)
            
{
                
//XOR
                for(int j = 0; j < 8++j)
                
{
                    preEnc[j] 
^= *(ps + j);
                }

            }

            
else
            
{
                
//XOR
                for(int j = 0; j < nLength - i; ++j)
                
{
                    preEnc[j] 
^= *(ps + j);
                }


                
for(int j = nLength - i; j < 8++j)
                
{
                    preEnc[j] 
^= nSize - nLength;
                }

            }


            des(preEnc,pd);

            
//保存前一个输出
            memcpy(preEnc, pd,8);

        }

        
return i;
    }

}




int des_cbc_pkcs7_decrypt(uchar* from, int nLength,  uchar * to, uchar key[], uchar iv[])
{

    
if(nLength % 8)
        
return 0;    //数据不正确


    
//uchar* toBackup = to;
    
//to = (uchar*)malloc(nLength);    //申请内存

    
//XOR
    uchar preEnc[8],buffer[8];
    memcpy(preEnc,iv,
8);

    deskey(key,DE1);

    
int i = 0;
    
for(; i < nLength; i+=8)
    
{
        uchar
*     ps = from + i;
        uchar
*     pd = to + i;

        des(ps,buffer);

        
//XOR
        for(int j = 0; j < 8++j)
        
{
            buffer[j] 
^= preEnc[j];
        }



        
if(nLength - i > 8)
        
{
            
//保存前一个输出
            memcpy(preEnc, ps,8);
            memcpy(pd,buffer,
sizeof(buffer));
        }

        
else
        
{
            
//去除数据尾
            uchar chEnd = buffer[sizeof(buffer) - 1];
            
if(chEnd > 0 && chEnd < 9)
            
{
                
//有可能是填充字符,去除掉
                for(int j = sizeof(buffer) - 1; j >= (int)(sizeof(buffer) - chEnd); --j)
                
{
                    
if(buffer[j] != chEnd)
                        
return 0;
                }


                
int nSize =nLength - chEnd;

                memcpy(pd, buffer, 
sizeof(buffer) - chEnd);
                
                
return nLength - chEnd;

            }

            
else
            
{
                
//数据格式不正确
                return 0;
            }

            
        }

    }


    
return 0;
}

posted on 2007-11-13 14:38 阿牛 阅读(237) 评论(1)  编辑 收藏 所属分类: C++

评论

你好!看到你的博客非常高兴,我现在正在做有关C与C#通讯加密的项目,要求单片机加密数据后传到服务器解密,单片机是用C语言写的DES加密,服务器是用C#写的DES解密,服务器的解密软件是客户用C#写的,我只写单片机这端的加密,程序是写出来了,单片机用C语言写的DES能够正确的加密和解密,但是用服务器的解密软件却无法解密,也就是C#写的解密软件无法解密单片机用C写的加密数据,不知什么原因,如果你知道希望你能告诉我,先谢谢了!客户有提供C#的DES算法程序给我,我看到程序里有用IV,猜想应该是CBC模式,可是单片机端的C语言DES不管我用EBC还是CBC加密,C#的解密都不成功,这个问题已经困扰我好久了,到现在还没解决,请你帮我一下好吗?如果你需要看C#的加解密源码,我可以发给你。
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-22 16:04 编辑过


相关链接: