PHP的libmcrypt模塊不支持 PKCS#5 padding的處理

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($textchr($pad), strlen($text) - $pad) != $pad) return false
    return 
substr($text0, -$pad); 

?> html




pkcs#5和pkcs#7填充的區別

轉自: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

相關文章
相關標籤/搜索