2016-08-25 45 views
0

把python轉換爲php出了問題。我有在python以下代碼:用sha轉換python代碼到php

user = "DdrkmK5uFKmaaeNqfqReMADSUJ4sVSLrV2A8Bvs8" 
passing = "K9hvwANSBW5tLYzuWptWMByTtzZZKHzm" 

sha = hashlib.sha256() 
sha.update(user) 
sha.update(passing) 
sha_A = [ord(x) for x in sha.digest()] 

sha_A是以下數組:

[231,13,239,136,20,198,76,121,67,163,251, 153,114,13,65,203,41,37,64,168,43,69,81,103,235,161,15,58,82,57,217,178]


我已將其轉換爲php:

$user = "DdrkmK5uFKmaaeNqfqReMADSUJ4sVSLrV2A8Bvs8"; 
$passing = "K9hvwANSBW5tLYzuWptWMByTtzZZKHzm" 

$sha = hash_init("sha256"); 
$sha = hash_update($sha, $user); 
$sha = hash_update($sha, $passing); 

$sha_A = []; 
$i = 0; 
$digest = openssl_digest($sha, "sha256"); 
$digest = str_split($digest); 
foreach ($digest as $x) { 
    $sha_A[$i] = ord($x); 
    $i = $i + 1; 
} 

但是返回的陣列$sha看起來像這樣:

[101,51,98,48,99,52,52,55,56,102,99,49,99,49,52,57 ,97,102,98,102,52,95,56,57,57,54,102,98,57,50,52]

也許你們中的一些人會發現我的錯誤?

回答

0

我在你的PHP代碼中看到了一些錯誤。

這是一個Python代碼片段:

>>> sha = hashlib.sha256() 
>>> sha.update(user) 
>>> sha.update(passing) 
>>> sha_A = [ord(x) for x in sha.digest()] 
[135, 146, 107, 215, 70, 126, 179, 21, 19, 177, 191, 236, 182, 136, 192, 53, 148, 42, 160, 24, 63, 224, 170, 211, 32, 131, 59, 146, 60, 162, 77, 2] 

而且PHP版本,修正:

$ctx = hash_init('sha256'); 
hash_update($ctx, $user); 
hash_update($ctx, $passing); 
$digest = hash_final($ctx, true); 

$sha_A = []; 
foreach (str_split($digest) as $x) { 
    $sha_A[] = ord($x); 
} 
[135, 146, 107, 215, 70, 126, 179, 21, 19, 177, 191, 236, 182, 136, 192, 53, 148, 42, 160, 24, 63, 224, 170, 211, 32, 131, 59, 146, 60, 162, 77, 2] 

在你的PHP版本,$sha = hash_update($sha, $user);是不好的,因爲hash_update返回一個布爾值。第一個參數被稱爲context,並且是hash_init的結果,第二個參數是要散列的數據。最後,用hash_final的最後一個參數(raw_output)到true來獲取二進制數據。

最後一個錯誤,在SHA結果中使用openssl_digest計算SHA摘要的摘要。很好笑,不是嗎? :)。

+0

謝謝。這是幫助我:)但以下部分是什麼:sha_A = [在sha.digest()中x的ord(x)]我轉換它是否正確? – razzru80

+0

我也更正了這部分;) –