2010-04-18 65 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;它们具有灵活的随机数处理,并在一个包中管理加密和身份验证,并具有良好的实证。

相关问题