3des加密中- pkcs#5和pkcs#7填充的區別


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

最近做到了關於加密和解密的部分。

使用算法AES的時候,涉及到數據填充的部分,數據的填充有很多種方案,用的比較多的有pkcs#5,pkcs#7,

下面的都是從網上轉來的。結論就是在AES 的使用中,pkcs#5填充和pkcs#7填充沒有任何區別。

 

PKCS #7 填充字符串由一個字節序列組成,每個字節填充該填充字節序列的長度。

假定塊長度為 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

簡單地說, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)

有如下相同的特點:
1)填充的字節都是一個相同的字節
2)該字節的值,就是要填充的字節的個數

如果要填充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


####################################################

php 3des 加密

pkcs7_pad()

pkcs7_unpad()

php3des加密向量初始化

php版3des 工作模式是ecb 與java兼容

廣大phper在工作中如果有幸給電信運營商(移動,聯通,電信)提供服務的話,一般會遇到加密算法,由於一般接觸不到,做的時候大多會多費一番功夫

因為php的3des與電信運營商們普遍使用的java,.net加密有一定的不同,我是在那邊的技術支持的幫助下,稀里糊塗的做出來的。

我碰到的用到cbc加密

function EncrypTtripleDESHash($value,$key=null,$vi=null)
{
$hashResult = mhash(MHASH_SHA1,$value);//做sha1摘要
$to3DES = base64_encode($hashResult);                    //為摘要作base64加密
$k = $key == null ? $this->key : $key;            //准備3des密鑰
$i = $vi == null ? $this->vi : $vi;                //准備3des初始向量
$to3DES .= “”;                            //加””是因為php mcrypt加密包的bug
//$desResult = mcrypt_cbc(MCRYPT_TripleDES,$k,$to3DES,MCRYPT_ENCRYPT,$i);    //3des加密 這個函數已經廢止,換成下面一堆

$td = mcrypt_module_open(MCRYPT_3DES, ”, MCRYPT_MODE_CBC, ”);
$iv = $this->iv;
$key = $this->key;
mcrypt_generic_init($td, $key, $iv);
$desResult = mcrypt_generic($td, $to3DES);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return (base64_encode($desResult));                    //返回base64后的加密結果
}

對於程序做幾點解釋

1.  這個東西,你拷貝到php 代碼中就可以了,這個是補足用的,當然你也可以用什么 pkcs5, pkcs7之類的補足算法

2. mcrypt_cbc 這個函數目前已經廢棄, 但是我的php版本5.9 依然可以運行,為了你的代碼有更好的向上兼容性,你應該切換到下面的一堆

mcrypt_generic_init($td, $key, $iv);
$desResult = mcrypt_generic($td, $to3DES);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

3. 2中的這兩種方式(cbc方式)所接受  $key是24位,$vi是8位,新手一般高不清楚應該如何處理加密向量和密鑰

所以如果你的得到的 $key為48位, $vi 為16位, 那么請用 pack()函數來處理他們兩個

不了解的清查下手冊,本站提供中文手冊下載。

php中文手冊免費下載:download

$key = pack(‘H48′,$key);結果為24位

$vi = pack(‘H16′,$vi);結果為8位

如果你得到的key  為32位 vi為 12位

可以對他們進行如下處理

$key = base64_decode($key);結果為24位

$vi = base64_decode($vi);結果為8位

如果本身就為 24位和8位,那你就帶入試一下吧

3.如果用到 hash 的sha1算法,那么你可能需要試一下

因為現在 提供了 sha1(),這個函數,專門做sha1摘要,但是我的程序里面,sha1函數和 mhash(MHASH_SHA1,$value);的結果是不一樣的, mhash的結果是正確的,所以你可能需要兩個函數都試一下。

另外,貼上補足算法  pkcs7pkcs5

/**
*param $text string 需要pkcs5填充的字符串
*param $blocksize 填充方式,塊大小
*
*return 填充的結果
**/
private function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize – (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
/**
*param $text string 需要pkcs5你填充的字符串
*
*return 解碼的結果
**/
private 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);
}

private function pkcs7_pad ($data, $blocksize)
{
//$block_size = mcrypt_get_block_size(‘tripledes’, ‘ecb’);
$padding_char = $blocksize – (strlen($data) % $blocksize);
$data .= str_repeat(chr($padding_char), $padding_char);
return $data;
}
private function pkcs7_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);
}

就啰嗦這么多了,希望對你們有幫助。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com