http://php.net/manual/en/ref.mcrypt.php php
For those of you that need to use PKCS#5 padding, the mcrypt API's for PHP do not support it. However, you can DIY using the following:
<?php
function encrypt_something($input)
{
$size = mcrypt_get_block_size('des', 'ecb');
$input = pkcs5_pad($input, $size);
$key = 'YOUR SECRET KEY HERE';
$td = mcrypt_module_open('des', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
?> html
轉自:http://hi.baidu.com/tweetyf/item/36d2f94a8639320ae8350480
算法
最近作到了關於加密和解密的部分。 加密
使用算法AES的時候,涉及到數據填充的部分,數據的填充有不少種方案,用的比較多的有pkcs#5,pkcs#7, spa
下面的都是從網上轉來的。結論就是在AES 的使用中,pkcs#5填充和pkcs#7填充沒有任何區別。 .net
PKCS #7 填充字符串由一個字節序列組成,每一個字節填充該填充字節序列的長度。 code
假定塊長度爲 8,數據長度爲 9,
數據: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07 orm
簡單地說, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax) htm
有以下相同的特色:
1)填充的字節都是一個相同的字節
2)該字節的值,就是要填充的字節的個數 ip
若是要填充8個字節,那麼填充的字節的值就是0×8;
要填充7個字節,那麼填入的值就是0×7;
…
若是隻填充1個字節,那麼填入的值就是0×1;
這種填充方法也叫PKCS5, 剛好8個字節時還要補8個字節的0×08
正是這種即便剛好是8個字節也須要再補充字節的規定,可讓解密的數據很肯定無誤的移除多餘的字節。
標準
PKCS #7: Cryptographic Message Syntax
在 10.3節中講到了上面提到的填充算法, 對Block Size並無作規定
PKCS #5: Password-Based Cryptography Specification
在6.1.1 中對 填充作了說明
可是由於該標準 只討論了 8字節(64位) 塊的加密, 對其餘塊大小沒有作說明
其 填充算法跟 PKCS7是同樣的
後來 AES 等算法, 把BlockSize擴充到 16個字節
好比, Java中
Cipher.getInstance(「AES/CBC/PKCS5Padding」)
這個加密模式
跟C#中的
RijndaelManaged cipher = new RijndaelManaged();
cipher.KeySize = 128;
cipher.BlockSize = 128;
cipher.Mode = CipherMode.CBC;
cipher.Padding = PaddingMode.PKCS7;
的加密模式是同樣的
由於AES並無64位的塊, 若是採用PKCS5, 那麼實質上就是採用PKCS7