SSL3填充模式

对于很多区块加密算法,  要加密的明文长度,很多时候,并不是  区块长度的整数倍.  因此,必须填充一个额外的数据, 使得待加密的信息,恰好是区块长度的整数倍.

1)SSL 3 Padding Mode
SSL3中定义的填充模式

2)PKCS #5 Padding Mode
是在PKCS #5 基于口令的加密标准中定义的填充模式

事实上,SSL3Padding跟PKCS5Padding只是稍有不同
PKCS5 Padding填充的值是 要填充的字节数, 而SSL 3 Padding 是要填充的字节数 减去1

3)OAEP(Optimal Asymmetric Encryption Padding )
在PKCS#1中定义

4) PKCS7Padding
是在PKCS #7(Cryptographic Mesage Syntax Statndard)中定义填充模式
这种填充方式也只是跟PKCS5Padding稍微不一样
当 块长为128bits时, 与PKCS5是一样的

5) Zero Padding
最简单的填充, 不足的地方都补充为0

6) Space Padding
都填充空格(0x20)

简单地说, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)

有如下相同的特点:
1)填充的字节都是一个相同的字节
2)该字节的值,就是要填充的字节的个数

如果要填充8个字节,那么填充的字节的值就是0x8;
要填充7个字节,那么填入的值就是0x7;

如果只填充1个字节,那么填入的值就是0x1;

给出一个PHP的 SSL Padding实现

function ssl3_pad ($text, $blocksize)
{
$pad = $blocksize – (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad-1), $pad);
}

再给一个C#实现

public static byte[] PadSSL3(byte[] Input, int BlockSize)
{
int paddingBytes = BlockSize – (Input.Length % BlockSize);
byte[] Output = new byte[Input.Length + paddingBytes];
Input.CopyTo(Output, 0);
for (int i=1; i <= paddingBytes; i++)
{
Output[Output.Length – i] = (byte)(paddingBytes -1);
}
return Output;
}

unpad的PHP版本
function ssl3_unpad($text)
{
$text_len = strlen($text);
$pad = ord($text{$text_len-1});
$pad_len = $pad + 1;

if ($pad_len > $text_len) {
return false;
}

if (strspn($text, chr($pad), $text_len – $pad_len) != $pad_len) {
return false;
}
return substr($text, 0, -1 * $pad_len);
}

给一个PHP的实例
$crypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, $iv);
echo bin2hex($crypttext);
echo “n”;
$crypttext = ssl3_unpad($crypttext);
echo bin2hex($crypttext);

可以明显看到SSL 3是怎么填充的

SSL3填充模式》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注