在银行业务中,我们要对数据进行加密处理,这点事显而易见的,但无论是我们进行软件加密还是硬件加密,都需要对待加密的数据之前需要对数据进行打包处理。在解密数据后,无论是硬件加密还是软件加密都还需要进行相应的解包处理。这样才能得到我们想要的正确数据,在接下来的文章内将主要介绍打解包的处理和程序示例。
这其实就是一个将字符串数据转换成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);
}
```