那位大神能把我這個(gè)Java的md5的加密方法寫(xiě)個(gè)php版本哦,感激噢,Java代碼如下!寫(xiě)這個(gè)的人 描述的思路如下1.將秘鑰、源串分別轉(zhuǎn)換byte數(shù)組2.聲明2個(gè)64位數(shù)組 將key的byte數(shù)組分別做異或運(yùn)算填充進(jìn)去 并分別補(bǔ)充 54、92 補(bǔ)滿(mǎn)64長(zhǎng)度3.獲得md5摘要算法的MessageDigest 對(duì)象4.使用其中一個(gè)數(shù)組及源串的數(shù)組更新MessageDigest 摘要 完成哈希計(jì)算5.重置摘要 6.使用另一個(gè)數(shù)組更新摘要 使用4中結(jié)果 從0到16開(kāi)始更新摘要 完成哈希計(jì)算7.轉(zhuǎn)換字符串public String cryptMd5(String source, String key) { byte[] k_ipad = new byte[64];byte[] k_opad = new byte[64];byte[] keyb;byte[] value;try { byte[] keyb = key.getBytes("UTF-8");value = source.getBytes("UTF-8");}catch (UnsupportedEncodingException e){byte[] value;keyb = key.getBytes();value = source.getBytes();}Arrays.fill(k_ipad, keyb.length, 64, 54);Arrays.fill(k_opad, keyb.length, 64, 92);for (int i = 0; i < keyb.length; i++){k_ipad[i] = (byte)(keyb[i] ^ 0x36);k_opad[i] = (byte)(keyb[i] ^ 0x5C);}MessageDigest md = null;try{md = MessageDigest.getInstance("MD5");}catch (NoSuchAlgorithmException e){return null;}md.update(k_ipad);md.update(value);byte[] dg = md.digest();md.reset();md.update(k_opad);md.update(dg, 0, 16);dg = md.digest();return toHex(dg); }public static String toHex(byte[] input){if (input == null) {return null;}StringBuffer output = new StringBuffer(input.length * 2);for (int i = 0; i < input.length; i++){int current = input[i] & 0xFF;if (current < 16)output.append("0");output.append(Integer.toString(current, 16));}return output.toString();}
3 回答

慕容森
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
function cryptMd5($source, $key) { if(! mb_check_encoding($source, 'utf-8')) $source = mb_convert_encoding($source, "utf-8", "auto"); if(! mb_check_encoding($key, 'utf-8')) $key = mb_convert_encoding($key, "utf-8", "auto"); $k_ipad = str_pad($key, 64, chr(54)); $k_opad = str_pad($key, 64, chr(92)); for($i=0; $i<strlen($key); $i++) { $k_ipad{$i} = $key{$i} ^ chr(0x36); $k_opad{$i} = $key{$i} ^ chr(0x5c); } $dg = md5($source . substr($k_ipad, strlen($source)), true); $dg = md5(substr($dg, 0, 16) . substr($k_opad, 16), true); return bin2hex($dg); }

開(kāi)心每一天1111
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
我想說(shuō)你的代碼里好像有點(diǎn)問(wèn)題。所以對(duì)理解你的代碼有點(diǎn)困難。有些可以大體猜到你的目的。但是下邊這兩句就很難猜了:
Arrays.fill(k_ipad, keyb.length, 64, 54);
Arrays.fill(k_opad, keyb.length, 64, 92);
最后一個(gè)參數(shù)應(yīng)該是byte變量吧。

慕后森
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
public function md5Encrypt($encryptString='', $encryptKey='') { $keyByte = $this->getBytes($encryptKey); $keyIpad = array(); for ($i = 0; $i < 64; $i++) { $keyIpad[] = (isset($keyByte[$i]) ? $keyByte[$i] : 0) ^ 54; } $keyOpad = array(); for ($i = 0; $i < 64; $i++) { $keyOpad[] = (isset($keyByte[$i]) ? $keyByte[$i] : 0) ^ 92; } $string = md5($this->byteToString($keyIpad) . $encryptString); $string = substr(hex2bin($string), 0, 16); $signature = md5($this->byteToString($keyOpad). ($string)); return $signature; } private function getBytes($string) { $bytes = array(); for ($i = 0; $i < strlen($string); $i++) { $bytes[] = ord($string[$i]); } return $bytes; } private function byteToString($args = array()){ $str = ''; for ($i = 0; $i < count($args); $i++) { $str .= chr($args[$i]); } return $str; }
添加回答
舉報(bào)
0/150
提交
取消