2010-04-18 68 views
0

我不想使用Open SSL或任何非常大的非內置庫。 我只希望能夠使用密鑰加密字符串,所以如果沒有密鑰就無法解密。使用密鑰加密字符串而不使用Open SSL的強大而簡單的方法是什麼?

順便說一下,我已經在stackoverflow做了很長時間的搜索,我已經檢查了那些unsecure ways,但我想要一些健壯的像md5(可以用密鑰解密)。

感謝

+0

md5具有相當的健壯性,但僅僅因爲它__cannot__無法解密。 – 2010-04-18 21:39:37

+0

SSL不僅僅是加密字符串,它主要是關於如何以安全的方式交換密鑰。你將如何分配鑰匙? – 2010-04-18 21:41:39

回答

1

mcrypt東西可能是你在找什麼。它具有雙向加密功能,散列功能(如MD5)不會這樣做。

嘗試使用mcrypt進行加密的PHP5類。在這種情況下,它使用blowfish加密。您需要更改每個使用它的網站的密鑰。如果你至少不使用它,它可能會指導你編寫你自己的版本。

<?php 

class Encryption 
{ 
    const CYPHER = 'blowfish'; 
    const MODE = 'cfb'; 
    const KEY = '7QQvcT9Ga7R6QC3'; 

    public function encrypt($plaintext) 
    { 
     $td = mcrypt_module_open(self::CYPHER, '', self::MODE, ''); 
     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
     mcrypt_generic_init($td, self::KEY, $iv); 
     $crypttext = mcrypt_generic($td, $plaintext); 
     mcrypt_generic_deinit($td); 
     return $iv.$crypttext; 
    } 

    public function decrypt($crypttext) 
    { 
     $plaintext = ''; 
     $td  = mcrypt_module_open(self::CYPHER, '', self::MODE, ''); 
     $ivsize = mcrypt_enc_get_iv_size($td); 
     $iv  = substr($crypttext, 0, $ivsize); 
     $crypttext = substr($crypttext, $ivsize); 
     if ($iv) 
     { 
      mcrypt_generic_init($td, self::KEY, $iv); 
      $plaintext = mdecrypt_generic($td, $crypttext); 
     } 
     return $plaintext; 
    } 
} 

?> 

用法:

$encrypted_string = Encryption::encrypt('this is a test'); // Åž-\Ž「kcþ1ÿ4gî:Xƒã% 
$decrypted_string = Encryption::decrypt($encrypted_string); // this is a test 
-1

最簡單的方法是使用XOR運算

+0

-1。這很容易和平庸的失敗。 – jmkeyes 2012-11-26 08:25:31

0

大多數建議都將留下兩件事情關鍵安全加密字符串:

1:隨機數。任何安全操作模式都將採用隨機數(或「IV」),對於每個加密操作都必須有所不同。這使得攻擊者更難利用不同加密操作之間的關係來了解明文:一個簡單的例子是,使用不同的nonces加密兩次的相同明文產生不同的密文。

2:MAC。除非你是專業的密碼專家,否則無論何時進行加密,都應將其視爲必不可少的。這是一個代碼,用於檢查消息的完整性,並確保只有使用該密鑰加密的真正密文才會解密。

我強烈建議在EAX或GCM模式下使用AES;它們具有靈活的隨機數處理,並在一個包中管理加密和身份驗證,並具有良好的實證。

相關問題