2011-09-22 40 views
1

我想用Zend_Filter_Encrypt函數對某些數據做一些對稱加密。問題是如果我加密一些數據然後解密它,解密數據後面有空字節,我不知道爲什麼。Zend Filter Encryption/Decryption在解密時添加空字節

例如: 明文:測試加密:PK解密的:測試

這似乎是在解密文本的結尾填充nullbytes使它的長度等於一些2^n(11個字符的字符串被填充以適合16 => 2^4)。最明顯的情況是將這些字符去掉,但我想知道爲什麼會發生這種情況...

這是我使用的代碼,與文檔要求你做它的方式不同,因爲它們代碼只是不爲我工作(見:http://framework.zend.com/manual/en/zend.filter.set.html

define('VECTOR','EXfPCW23'); //example, not the actual used VECTOR/KEY 
    $key = 'lolwatlolwat'; 

    public function encryptPassword($password, $key) 
    { 
      $filter = new Zend_Filter_Encrypt(); 
      $filter->setEncryption(array('key' => $key));  
      $filter->setVector(VECTOR); 

      return $filter->filter($password);  
    } 

    public function decryptPassword($password, $key) 
    { 
      $filter = new Zend_Filter_Decrypt(); 
      $filter->setEncryption(array('key' => $key)); 
      $filter->setVector(VECTOR); 

      return $filter->filter($password); 
    } 
+0

嗯我剛剛意識到「測試」是4個字符是2^2所以現在我完全不明白._。 – shokora

回答

0

是否Zend的文件告訴你如何指定填充?如果是,則指定可逆填充;正如你所發現的,零填充是不可逆的。否則,找出Zend預期的填充明文大小,並自己添加PKCS7填充。這很容易識別,之後可以移除。

1

你必須使用rtrim函數Decrypt字符串。

例子:

public function decryptPassword($password, $key) 
    { 
      $filter = new Zend_Filter_Decrypt(); 
      $filter->setEncryption(array('key' => $key)); 
      $filter->setVector(VECTOR); 

      return rtrim($filter->filter($password); 
    }