我正在測驗一些生成密碼的代碼:
<?php
//8076?
$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
$a = time() . $key;
print "a = $a" . PHP_EOL;
$b = sprintf('%b', $a);
print "b = $b" . PHP_EOL;
$totp = hash('sha3-256', $b);
print "totp = $totp" . PHP_EOL;
$x = gmp_init(0);
$y = gmp_init(1);
for ($i = strlen($totp) - 1; $i >= 0; $i--, $y = gmp_mul($y, 16))
$x = gmp_add($x, gmp_mul($y, hexdec($totp[$i])));
print "x = $x" . PHP_EOL;
print sprintf('d', gmp_strval(gmp_mod($x, '100000000')));
print PHP_EOL;
結果是:
a = 16407820138076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0
b = 0
totp = f9e2eaaa42d9fe9e558a9b8ef1bf366f190aacaa83bad2641ee106e9041096e4
x = 113026826332749616999480801584179790214435636530758034338031008093509348529892
48529892
為什么 b = 000000 ...?
每次使用此密鑰生成密碼時,我都需要使用不同的密碼。我知道這很愚蠢,亂數會起作用并且“安全”。安全人員讓我這樣做。我是一名軟體工程師。
這個十六進制數有點奇怪。對于其他值,我得到了很好的結果。例如 $key = '3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694' 作業正常。
uj5u.com熱心網友回復:
您將字串格式化$a為沒有意義的二進制數,您想要轉換它。您需要使用pack,然后將該二進制值轉換為字串或整數,或者保持原樣,無論您需要什么。
uj5u.com熱心網友回復:
這現在有效。(十六進制字串不包含有效的十六進制值,所以我使用了每個字符)
<?php
//$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
//$key = '3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694';
$key = '145bfea3b819bee905b5d5295338964150c489789a9228f2e981b189de5cbbee';
$a = '';
for ($i = 0; $i < strlen($key); $i )
$a .= decbin(ord($key[$i]));
$a .= decbin(time());
print "a = $a" . PHP_EOL;
$totp = hash('sha3-256', $a);
print "totp = $totp" . PHP_EOL;
$x = gmp_init(0);
$y = gmp_init(1);
for ($i = strlen($totp) - 1; $i >= 0; $i--, $y = gmp_mul($y, 16))
$x = gmp_add($x, gmp_mul($y, hexdec($totp[$i])));
print "x = $x" . PHP_EOL;
print sprintf('d', gmp_strval(gmp_mod($x, '100000000')));
print PHP_EOL;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/407319.html
標籤:
上一篇:產品密鑰的橢圓曲線實作
