2011-12-10 37 views
1

我想通过php加密邮件,但在客户端,我想javascript解密它。我曾尝试Blowfish(使用mcrypt),但是我发现php回显非字母数字字符和Javascript显示字母数字。我使用ajax,以便页面不会重新加载。在PHP中加密邮件,在JavaScript中解密

我测试过代码http://aam.ugpl.de/?q=node/1060http://www.php-einfach.de/blowfish_en.php#ausgabe

任何帮助表示赞赏。

编辑:我使用Diffie-Hellman来计算随机生成的数字a和b的密钥。下面是源于PHP代码

class Encryption 
{ 
const CYPHER = 'blowfish'; 
const MODE = 'cbc'; 
const KEY = '26854571066639171754759502724211797107457520821'; 

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'); 
$decrypted_string = Encryption::decrypt($encrypted_string); 

echo "encrypted: $encrypted_string<br>"; 
echo "decrypted: $decrypted_string<br>"; 

encrypted: µ˜?r_¿ÖŸŒúw‰1‹Žn!úaH 
decrypted: this is a test 
+6

为什么你需要这样做?如果是为了传输安全,您必须**使用HTTPS,因为否则通过相同的线路传输密钥,攻击者可以轻松解密您的数据。如果您想阻止用户查看数据与Firebug:如果有人想看到它,他会的。 – ThiefMaster

+0

这有什么用?任何人都可以获取用于解密的密钥。 – Ikke

+0

OP没有说他/他会通过电线转移钥匙。如果它是通过用户注册后通过电子邮件等方式进行分发的,则可以正常工作,但它肯定不是100%安全的... – ampersand

回答

3

从几斯坦福大学的学生这个JavaScript AES加密库是我见过的最好的:

http://crypto.stanford.edu/sjcl/

但要注意他们的告诫:

我们相信SJCL提供了在Javascript中实际可用的最佳安全性。 (不幸的是,这是因为它是不可行的,完全防止代码注入,恶意服务器和侧信道攻击并不像桌面应用程序一样大。)

UPDATE:

在PHP中,使用base64_encode()在解密之前加密并且base64_decode()。通过这种方式,它将以字符安全传输。在浏览器中,使用atob()btoa()

+0

Great链接,谢谢。但在服务器端,PHP正在回应奇怪的符号,我认为JavaScript无法使用SJCL对其进行解密。 –

+0

如果你的问题是与PHP,你需要发布相关的代码,所以我们可以看到这个符号是什么,可以做些什么来帮助你... – ampersand

+0

我很抱歉,迟到的回应,我真的有事要做,直到只是现在。我发布服务器端的代码 –