补位算法:
PKCS7填充算法规则:
PKCS7填充单位为16Byte,对于不满16Byte的数据,以【16-数据长度】字符进行填充。其实现算法如下:
byte [ ] PKCS7(byte [] pucData)
{
if(pucData == null)
{
return null;
}
byte [ ] ret = (byte [ ]) null ;
int p =16 - pucData.length%16 ;
ret = new byte[pucData.length+p];
System.arraycopy(pucData,0,ret,0,pucData.length);
for(int i=0;i<p;i++){
ret[pucData.length+i] = (byte) p;
}
return ret ;
}
PKCS5填充算法规则:
PKCS5填充单位为8Byte,对于不满8Byte的数据,以【8-数据长度】字符进行填充。其实现算法如下:
byte [ ] PKCS5(byte [] pucData)
{
if(pucData == null)
{
return null;
}
byte [ ] ret = (byte [ ]) null ;
int p =8 - pucData.length%8 ;
ret = new byte[pucData.length+p];
System.arraycopy(pucData,0,ret,0,pucData.length);
for(int i=0;i<p;i++){
ret[pucData.length+i] = (byte) p;
}
return ret ;
}
上面是基础的补位算法,但是实际使用的过程中,这俩补位对于SM4算法来说是一样的。即设置的pkcs5补位,实际是pkcs7补位。这是因为算法决定的,sm4算法密钥是128字节,即16个byte。所以明文处理时,都是补位成16的倍数,可以百度下SM4算法原理就知道。