银行加密算法之——数据打解包

来源:互联网 发布:阿里云服务器如何分区 编辑:程序博客网 时间:2024/05/16 14:34

       在银行业务中,我们要对数据进行加密处理,这点事显而易见的,但无论是我们进行软件加密还是硬件加密,都需要对待加密的数据之前需要对数据进行打包处理。在解密数据后,无论是硬件加密还是软件加密都还需要进行相应的解包处理。这样才能得到我们想要的正确数据,在接下来的文章内将主要介绍打解包的处理和程序示例。

            这其实就是一个将字符串数据转换成16进制数的问题,首先是打包(PACK),将如字符串"1234567FE" 转换成十六进制数0x12 0x34 0x56 0xE0等,因为字符串的长度是9程序会自动成偶数。尤其是在硬件加密方面,密码键盘是无法识别字符串的。在此过程中数据的长度会变为原来的一半,这是因为他会将原来的两位字符组成一个新的十六进制数,在字符串不足偶数时会在后面自动补0,由此转换为的数据就可以用来异或,活着Des,3Des操作。

以下是函数的实现过程

int Pack( unsigned char *pbyInBuffer,  unsigned char *pbyOutBuffer, int   iInBuffLen )
{
 unsigned char n;
 int iLen,i;
 
 /*
 **  whether InBuffer data's len can be divided by 2
 */
 if(iInBuffLen%2)
  iLen=iInBuffLen+1;
 else
  iLen=iInBuffLen;
 
 for (i=0; i<iInBuffLen; i++)
 {
  pbyInBuffer[i]=(unsigned char) toupper(pbyInBuffer[i]);
  
  if (i%2!=0)    /* if odd number */
  {           
   n =(unsigned char) (pbyInBuffer[i] - 0x30);
   /*
   **  Note: 'A' = 65, 'F'= 70.  65-48 = 17, 17-7=10.
   **  For example, this will convert 'A' to value 10.
   */
   if (n>9)
    n = n-7;
   pbyOutBuffer[i/2] = pbyOutBuffer[i/2] | n;
  }
  else
  {
   pbyOutBuffer[i/2] = ( (n=pbyInBuffer[i]-0x30)>9 ? n-7:n ) << 4;
  }
 }
 
 return(iLen/2);
 
}

 

      以上函数中*pbyInBuffer为传入参数,需要压缩数据的指针形如字符串"1234567FE" 。

                        *pbyOutBuffer 为传出参数,压缩完数据的指针形如十六进制数0x12 0x34 0x56 0xE0

                          iInBuffLen 为传入参数,需要压缩数据的长度

 

 

     当数据从密码键盘等解密传出后,我们同样需要对数据进行解密,这样解包操作。过程就是将上面的操作反过来形如输入数据为: 0x12 0x34 0x56 0x7F 0xE0 ,输入长度为5,输出的字符串为 "1234567fe0"。解包后的数据长度为原长度的2倍。

 

int Unpack( unsigned char *pbyInBuffer, unsigned char *pbyOutBuffer, int  iInBufLen )
{
 int i,j;
 
 for (i=0,j=0; j<iInBufLen; j++, i=i+2)
 {
  if ( (pbyInBuffer[j]/16)>9 )
   pbyOutBuffer[i] = (pbyInBuffer[j]/16)+'0'+7;
  else
   pbyOutBuffer[i] = (pbyInBuffer[j]/16)+'0';
  
  if ( (pbyInBuffer[j]%16)>9 )
   pbyOutBuffer[i+1] = (pbyInBuffer[j]%16)+'0'+7;
  else
   pbyOutBuffer[i+1] = (pbyInBuffer[j]%16)+'0';
 }
 
 return(0);
 
}

 

以上函数中*pbyInBuffer为传入参数,需要解压数据的指针形如十六进制数0x12 0x34 0x56 0xE0。

                  *pbyOutBuffer 为传出参数,解压完数据的指针形如字符串"1234567FE"

                    iInBuffLen 为传入参数,需要解压数据的长度