admin管理员组

文章数量:1794759

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

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

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

参考: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; }

 

本文标签: 模式代码PHPjava