• C与C#通讯加密之C语言DES的cbc pkcs7的实现(二)


    没有想到,上个随笔的代码在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;
    }

  • 相关阅读:
    ajax技术
    JSDOM获取子节点的一些方法
    防止a标签跳转的几种方法
    关于childNodes和children
    三种预览图片的方法
    异步加载js文件的方法
    跨域访问的解决方案
    关于在JS中设置标签属性
    Eclipse导入web项目发布项目时报Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web错误解决方案
    Maven构建项目报No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题的解决方案
  • 原文地址:https://www.cnblogs.com/evlon/p/958014.html
Copyright © 2020-2023  润新知