一、填充模式:PKCS#5/PKCS7介绍

参考:https://blog.csdn/test1280/article/details/75268255

其实最核心的是:

PKCS#5在填充方面,是PKCS#7的一个子集:

PKCS#5只是对于8字节(BlockSize=8)进行填充,填充内容为0x01-0x08;

但是PKCS#7不仅仅是对8字节填充,其BlockSize范围是1-255字节。

所以,PKCS#5可以向上转换为PKCS#7,但是PKCS#7不一定可以转换到PKCS#5(用PKCS#7填充加密的密文,用PKCS#5解出来是错误的)。
注意:想要实现PKCS5的代码,只用把下面代码的 blocksize 设置为8即可。

二、PHP代码实现

    private function pkcs7Pad($string, $blocksize = 32)
    {
        $len = strlen($string);
        $pad = $blocksize - ($len % $blocksize);
        $string .= str_repeat(chr($pad), $pad);
        return $string;
    }

    private function pkcs7Unpad($string)
    {
        $pad = ord ($string {strlen($string) - 1});
        if ($pad > strlen($string)) {
            return false;
        }
        if (strspn ($string, chr ($pad), strlen($string) - $pad) != $pad) {
            return false;
        }
        return substr($string, 0, - 1 * $pad);
    }

三、java代码实现

    private static byte[] pkcs7_pad(byte[] source, int blocksize) {
        int sourceLength = source.length;
        int padDataLen = blocksize - (sourceLength % blocksize);
        int afterPadLen = sourceLength + padDataLen;
        byte[] paddingResult = new byte[afterPadLen];
        System.arraycopy(source, 0, paddingResult, 0, sourceLength);
        for (int i = sourceLength; i < afterPadLen; i++) {
            paddingResult[i] = (byte)padDataLen;
        }
        return paddingResult;
    }

    private static byte[] pkcs7_unpad(byte[] data)throws Exception {
        int lastValue = data[data.length-1];
        byte[] unpad = new byte[data.length - lastValue];
        System.arraycopy(data, 0, unpad, 0, unpad.length);
        return unpad;
    }

 

更多推荐

PKCS7填充模式实现代码PHP版和Java版