php md5加密之後對位元組進行異或操作的問題

來源:互聯網
上載者:User
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
對md5加密後返回的16位二進位位元組進行異或操作
$data = array();
$data[0]="0";
for($i = 0; $i < strlen($md5); $i++){
$data[$i % 4 +1] ^=$md5[$i];
}
然後獲得一個整數值
$val = 0;
$val = $bytes[$data+1] & 0xff;
$val <<= 8;
$val |= $bytes[$data+ 2] & 0xff;
$val <<= 8;
$val |= $bytes[$data+ 3] & 0xff;
$val <<= 8;
$val |= $bytes[$data+4] & 0xff;
echo $val;
為何返回的值不正確呢?是不是我哪裡有錯誤了?請各位指點下


回複討論(解決方案)

你應該說清楚你想做的事情是什麼啊,就是你正確的邏輯是什麼。而且你的代碼本身也是有syntax error的。我也沒看出來你想做什麼。

感謝回答,我的目的就是對md5加密之後的字串進行每8位做一次異或得到一個長整數

你說結果不正確,那麼正確的值是什麼呢?
你只給了程式碼片段,無法測試

感謝回答,我的目的就是對md5加密之後的字串進行每8位做一次異或得到一個長整數



1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5
2. 你這次的描述並沒有比你代碼中的注釋給出更多的資訊,請像一個程式員一樣來描述。比如你說 每8位做一次異或,異或是一個二元操作操作符,那它是和誰異或。
3. 如樓上所述,你認為實現有問題,那請給出一個輸入應該得到的正常的輸出
4. 看我第一次回複,請先打理好自己的代碼,把它寫成可啟動並執行版本,並且只保留與問題本身相關的部分,就算有邏輯錯誤也不能有語法錯誤。

你說結果不正確,那麼正確的值是什麼呢?
你只給了程式碼片段,無法測試


這往往解釋了為什麼國內程式員越來越多,而這些曾經老牌的中文技術社區均已沒落了。
想如果再遇到不好好提問題的,應該封號,然後找個類似“提問的智慧”的文檔,讓被封人的朗誦一遍錄音發過來手動解鎖。錄音中同時要朗讀發給這個人的一段驗證碼,避免作弊。
以後再不好好問問題,也不封此人的號了,就把他自己的朗誦連結回在問題後面。

PS: 我今天是有多閑.


感謝回答,我的目的就是對md5加密之後的字串進行每8位做一次異或得到一個長整數



1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5
2. 你這次的描述並沒有比你代碼中的注釋給出更多的資訊,請像一個程式員一樣來描述。比如你說 每8位做一次異或,異或是一個二元操作操作符,那它是和誰異或。
3. 如樓上所述,你認為實現有問題,那請給出一個輸入應該得到的正常的輸出
4. 看我第一次回複,請先打理好自己的代碼,把它寫成可啟動並執行版本,並且只保留與問題本身相關的部分,就算有邏輯錯誤也不能有語法錯誤。

好的謝謝如此耐心的回答啊,用java運行了一段代碼,然後用php運行了一段代碼,但是結果確不一樣,也許我描述太模糊了,先看代碼吧。
java代碼:

String data = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
String apSecert="0E2C83D839C026A5E0530100007FEB90";
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write(apSecert.getBytes());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data.getBytes());
stream.write(md5.digest());
md5.update(stream.toByteArray());
byte[] md = md5.digest();
byte[] ret = new byte[5]; // 首位元組保留0 防止轉換成負數, 只使用後4位
for (int i = 0; i < md.length; i++)
{
ret[i % 4 + 1] ^= md[i];
}
System.out.println("---------------"+new BigInteger(ret));-----得到一個整數
}
php代碼:
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data = array();
$data[0]="0";
for($i = 0; $i < strlen($md5); $i++){
$data[$i % 4 +1] ^=$md5[$i];
}
$val = 0;
$val = $data[1] & 0xff;
$val <<= 8;
$val |= $data[ 2] & 0xff;
$val <<= 8;
$val |= $data[3] & 0xff;
$val <<= 8;
$val |= $data[4] & 0xff;
echo $val;

最後結果不一樣:是不是精度的問題?還是My Code有問題?
java:=2676031167
php:=16327680

php代碼:我第一次發帖的代碼,的確有問題,我再重新寫一遍
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data = array();
$data[0]="0";
for($i = 0; $i < strlen($md5); $i++){
$data[$i % 4 +1] ^=$md5[$i];
}
$val = 0;
$val = $data[1] & 0xff;
$val <<= 8;
$val |= $data[ 2] & 0xff;
$val <<= 8;
$val |= $data[3] & 0xff;
$val <<= 8;
$val |= $data[4] & 0xff;
echo $val;

是知道啊?能指出我哪裡算錯了嗎?懸賞100人民幣

你說 php 運行結果是 16327680
但你貼出的代碼得到的是 327680

對的,是我寫錯了,是327680,我對PHP不熟悉,JAVA的值是正確的,我再考慮是不是PHP對位的運算和JAVA存在出入,因為JAVA是unicode編碼,造成和php位元運算出錯?

這樣寫

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167

這樣寫

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167


感謝版主,你是高手,結貼了,我如何把錢打給你?
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.