为什么如下内容无法解密?有什么办法吗?

hi 大家好.

我用 crypto-js 在客户端加密:

function encrypt(str) {
    var key = $.cookie('key');
    var encrypted = CryptoJS.TripleDES.encrypt(str, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding});    return encrypted;
}

服务端:

$decrypt = mcrypt_decrypt (MCRYPT_3DES, $_SESSION['key'], $encrypted_str_from_client, MCRYPT_MODE_ECB); 

print ($decrypt);

这样子无法解密.

请问大家有没有办法做到在客户端 用3DES ECB模式加密,后端能够解密的?


小唯快跑啊
浏览 74回答 1
1回答

MMMHUHU

<?phpsession_start();/**&nbsp;PBKDF2&nbsp;Implementation&nbsp;(as&nbsp;described&nbsp;in&nbsp;RFC&nbsp;2898); &nbsp;* &nbsp;*&nbsp;&nbsp;@param&nbsp;string&nbsp;p&nbsp;password &nbsp;*&nbsp;&nbsp;@param&nbsp;string&nbsp;s&nbsp;salt &nbsp;*&nbsp;&nbsp;@param&nbsp;int&nbsp;c&nbsp;iteration&nbsp;count&nbsp;(use&nbsp;1000&nbsp;or&nbsp;higher) &nbsp;*&nbsp;&nbsp;@param&nbsp;int&nbsp;kl&nbsp;derived&nbsp;key&nbsp;length &nbsp;*&nbsp;&nbsp;@param&nbsp;string&nbsp;a&nbsp;hash&nbsp;algorithm &nbsp;* &nbsp;*&nbsp;&nbsp;@return&nbsp;string&nbsp;derived&nbsp;key &nbsp;*/function&nbsp;pbkdf2_helper_for_javascript(&nbsp;$p,&nbsp;$s,&nbsp;$c,&nbsp;$kl,&nbsp;$a&nbsp;=&nbsp;'sha256'&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;$hl&nbsp;=&nbsp;strlen(&nbsp;hash(&nbsp;$a,&nbsp;null,&nbsp;true&nbsp;)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;$kb&nbsp;=&nbsp;ceil(&nbsp;$kl&nbsp;/&nbsp;$hl&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;$dk&nbsp;=&nbsp;'';&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;$block&nbsp;=&nbsp;1;&nbsp;$block&nbsp;<=&nbsp;$kb;&nbsp;$block++&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ib&nbsp;=&nbsp;$b&nbsp;=&nbsp;hash_hmac(&nbsp;$a,&nbsp;$s&nbsp;.&nbsp;pack(&nbsp;'N',&nbsp;$block&nbsp;),&nbsp;$p,&nbsp;true&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;$i&nbsp;=&nbsp;1;&nbsp;$i&nbsp;<&nbsp;$c;&nbsp;$i++&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ib&nbsp;^=&nbsp;(&nbsp;$b&nbsp;=&nbsp;hash_hmac(&nbsp;$a,&nbsp;$b,&nbsp;$p,&nbsp;true&nbsp;)&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$dk&nbsp;.=&nbsp;$ib; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;substr(&nbsp;$dk,&nbsp;0,&nbsp;$kl&nbsp;); }function&nbsp;dectypt_from_javascript_encrypt($dectypted_str,&nbsp;$callback&nbsp;=&nbsp;null)&nbsp;{ $salt&nbsp;=&nbsp;$_SESSION['password_salt']; $secret_key&nbsp;=&nbsp;$_SESSION['password_secret'];&nbsp;&nbsp;&nbsp;&nbsp;//get&nbsp;the&nbsp;cipher&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;pbkdf2_helper_for_javascript(&nbsp;$secret_key,&nbsp;$salt,&nbsp;1000,&nbsp;32&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;//get&nbsp;the&nbsp;IV &nbsp;&nbsp;&nbsp;&nbsp;$iv64&nbsp;=&nbsp;$_REQUEST['iv'];&nbsp;&nbsp;&nbsp;&nbsp;$iv&nbsp;=&nbsp;base64_decode($iv64);&nbsp;&nbsp;&nbsp;&nbsp;//get&nbsp;the&nbsp;HMAC &nbsp;&nbsp;&nbsp;&nbsp;$hmac&nbsp;=&nbsp;$_REQUEST['hmac'];&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;initialise&nbsp;mcrypt.&nbsp;NB&nbsp;Rijndael-128&nbsp;covers&nbsp;all&nbsp;variants&nbsp;of&nbsp;AES &nbsp;&nbsp;&nbsp;&nbsp;$td&nbsp;=&nbsp;mcrypt_module_open(&nbsp;MCRYPT_RIJNDAEL_128,&nbsp;'',&nbsp;MCRYPT_MODE_NOFB,&nbsp;''&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;do&nbsp;encryption &nbsp;&nbsp;&nbsp;&nbsp;$input&nbsp;=&nbsp;base64_decode($dectypted_str);&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_init($td,&nbsp;$key,&nbsp;$iv);&nbsp;&nbsp;&nbsp;&nbsp;$plain&nbsp;=&nbsp;mdecrypt_generic($td,&nbsp;$input);&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_deinit($td);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;shutdown&nbsp;mcrypt &nbsp;&nbsp;&nbsp;&nbsp;mcrypt_module_close($td);&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;create&nbsp;HMAC&nbsp;for&nbsp;message &nbsp;&nbsp;&nbsp;&nbsp;$hmacActual&nbsp;=&nbsp;hash_hmac('sha256',&nbsp;$plain,&nbsp;$iv);&nbsp;&nbsp;&nbsp;&nbsp;if($hmac&nbsp;==&nbsp;$hmacActual)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;($callback&nbsp;&&&nbsp;is_callable($callback))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; $callback('success',&nbsp;$plain); &nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; //解密失败,提示提醒用户 &nbsp;&nbsp;&nbsp;&nbsp; $callback('error',&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//session&nbsp;用完后清除 &nbsp;&nbsp;&nbsp;&nbsp;$_SESSION['password_secret']&nbsp;=&nbsp;null; }if&nbsp;($user&nbsp;=&nbsp;@$_POST['user']&nbsp;&&&nbsp;$password&nbsp;=&nbsp;@$_POST['password'])&nbsp;{&nbsp;&nbsp; dectypt_from_javascript_encrypt($_POST['password'],&nbsp;function&nbsp;($status,&nbsp;$password)&nbsp;{&nbsp;&nbsp; print&nbsp;$password; &nbsp;&nbsp; }); }//&nbsp;每次发生请求,生成一次key用来解密.$key&nbsp;=&nbsp;uniqid();//发送到客户端cookiesetcookie("password_secret",&nbsp;$key,&nbsp;0);setcookie("password_salt",&nbsp;"tuding_salt");//并且保存到session用来后续的解密$_SESSION['password_secret']&nbsp;=&nbsp;$key;$_SESSION['password_salt']&nbsp;=&nbsp;'tuding_salt';?><!DOCTYPE&nbsp;HTML><html&nbsp;lang="en"> <head> <meta&nbsp;charset="utf-8"/> <script&nbsp;type="text/javascript"&nbsp;src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.5.3-crypto.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.5.3-sha256.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.3.0-hmac.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.3.0-pbkdf2.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.3.0-aes.js"></script> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;type='text/javascript'&nbsp;src="http://crypto-js.googlecode.com/files/2.5.3-blockmodes.js"></script> <script&nbsp;type="text/javascript"> function&nbsp;doEncrypt(message)&nbsp;{ var&nbsp;secret&nbsp;=&nbsp;$.cookie('password_secret'); var&nbsp;salt&nbsp;=&nbsp;$.cookie('password_salt'); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bytes_iv&nbsp;=&nbsp;Crypto.util.randomBytes(16); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;base64_iv&nbsp;=&nbsp;Crypto.util.bytesToBase64(bytes_iv); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;hmac&nbsp;=&nbsp;Crypto.HMAC(Crypto.SHA256,&nbsp;message,&nbsp;bytes_iv); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;key&nbsp;=&nbsp;Crypto.PBKDF2(secret,&nbsp;salt,&nbsp;32,&nbsp;{hasher:Crypto.SHA256,&nbsp;iterations:1000,&nbsp;asBytes:true}); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;cipher&nbsp;=Crypto.AES.encrypt(message,&nbsp;key,&nbsp;{iv:bytes_iv,&nbsp;mode:new&nbsp;Crypto.mode.OFB,&nbsp;asBytes:false}); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{iv:&nbsp;base64_iv,&nbsp;hmac:&nbsp;hmac,&nbsp;cipher:&nbsp;cipher}; } $(document).ready(function&nbsp;()&nbsp;{ $('#submit').click(function&nbsp;()&nbsp;{ var&nbsp;user&nbsp;=&nbsp;$('input[name="user"]').val(); var&nbsp;pwd&nbsp;=&nbsp;$('input[name="password"]').val(); try&nbsp;{ var&nbsp;encrypt_pwd&nbsp;=&nbsp;doEncrypt(pwd); $('input[name="hmac"]').val(encrypt_pwd['hmac']); $('input[name="password"]').val(encrypt_pwd['cipher']); $('input[name="iv"]').val(encrypt_pwd['iv']); } catch&nbsp;(exception)&nbsp;{ //TODO: } }); }); </script> </head> <body> <form&nbsp;action="/index_bk.php"&nbsp;name="login"&nbsp;method="post"> <div> <label&nbsp;for="user">User</label> <input&nbsp;type="text"&nbsp;value=""&nbsp;placeholder="Your&nbsp;login&nbsp;name"&nbsp;name="user"/> </div> <div> <label&nbsp;for="password">Password</label> <input&nbsp;type="password"&nbsp;placeholder="your&nbsp;password"&nbsp;name="password"&nbsp;/> <input&nbsp;type="hidden"&nbsp;name="hmac"&nbsp;value=""/> <input&nbsp;type="hidden"&nbsp;name="iv"&nbsp;value=""/> </div> <input&nbsp;type="submit"&nbsp;value="Login"&nbsp;id="submit"/> </form> </body></html>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript