Rumah > pembangunan bahagian belakang > masalah PHP > Bagaimana untuk melaksanakan algoritma SM3 dalam PHP

Bagaimana untuk melaksanakan algoritma SM3 dalam PHP

PHPz
Lepaskan: 2023-04-26 13:41:56
asal
999 orang telah melayarinya

Algoritma SM3 ialah algoritma fungsi cincang kriptografi yang dilancarkan oleh Pusat Penyelidikan Kriptografi Komputer China pada tahun 2010. Ia dikenali sebagai algoritma yang sangat penting dalam rahsia negara. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan algoritma SM3 dalam PHP.

1. Pengenalan kepada algoritma

Algoritma SM3 ialah algoritma fungsi cincang kriptografi. Fungsi cincang kriptografi menerima data dalam sebarang saiz sebagai input dan menukarkannya kepada output panjang tetap, dan nilai output adalah berbeza untuk nilai input yang berbeza. Fungsi cincang kriptografi mempunyai ciri berikut:

1. Panjang tetap: Panjang output fungsi cincang kriptografi harus ditetapkan, biasanya 128, 160, 192, 224 atau 256 bit.

2. Ketakterbalikan: Memandangkan output cincang, inputnya tidak boleh ditentukan, yang dipanggil fungsi cincang sehala.

3 Rintangan kuat: Memandangkan nilai cincang, adalah mustahil untuk mencari sebarang input dengan nilai cincang yang sama, manakala menukar hanya satu atau bilangan bit yang terhad dalam input bermakna menghasilkan input yang berbeza daripada yang asal keluaran.

Algoritma SM3 menggunakan struktur Merkle-Damgard untuk memisahkan mesej kepada blok dan melaksanakan pemprosesan mampatan berulang.

Pemprosesan algoritma dibahagikan kepada 4 bahagian:

1. Pad mesej untuk memastikan panjangnya adalah gandaan 512 bit.

2. Mampatan: Proses menyekat menjadi ringkasan mesej 256-bit.

3 Lelaran: Setiap blok mesej diproses secara berulang sehingga semua blok dimampatkan.

4. Output: Hasilkan ringkasan 256-bit terakhir.

2. Pelaksanaan PHP

1. Pelapik

Laksanakan fungsi padding dalam PHP untuk memastikan panjang mesej ialah gandaan 512 bit.

lapik fungsi($msg) {

$length = strlen($msg) * 8;  // 消息长度,单位是比特
$k = 448 - (($length + 64) % 512);  // 填充长度
if ($k < 0) {
    $k += 512;
}
$msg .= hex2bin("80");  // 消息后面添加1
for ($i = 0; $i < $k / 8 - 1; $i++) {
    $msg .= hex2bin("00");  // 用0填充
}
$msg .= pack("N", $length);  // 添加消息长度
return $msg;
Salin selepas log masuk

}

2. Potongan diproses sebagai cernaan mesej 256-bit.

fungsi CF($X, $Y, $Z) {

}
return ($X & $Y) | (~$X & $Z);
Salin selepas log masuk
fungsi MG($X, $Y, $Z) {


}
return ($X & $Y) | ($X & $Z) | ($Y & $Z);
Salin selepas log masuk
fungsi P0($X) {


}
return $X ^ (($X << 9) | ($X >> 23)) ^ (($X << 17) | ($X >> 15));
Salin selepas log masuk
fungsi P1($X) {


}
return $X ^ (($X << 15) | ($X >> 17)) ^ (($X << 23) | ($X >> 9));
Salin selepas log masuk
fungsi FF ($X, $Y, $Z, $j) {


}
if ($j >= 0 && $j <= 15) {
    return P0($X ^ $Y ^ $Z);
} else {
    return P1($X ^ $Y ^ $Z);
}
Salin selepas log masuk
fungsi GG($X, $Y, $Z, $j) {


}
if ($j >= 0 && $j <= 15) {
    return P0($X ^ $Y ^ $Z);
} else {
    return P1($X ^ $Y ^ $Z);
}
Salin selepas log masuk
fungsi SM3_compress($msg, $IV) {


}
$W = array();
$V = $IV;
$A = $IV[0];
$B = $IV[1];
$C = $IV[2];
$D = $IV[3];
$E = $IV[4];
$F = $IV[5];
$G = $IV[6];
$H = $IV[7];
for ($i = 0; $i < 16; $i++) {
    $W[$i] = unpack("N", substr($msg, $i * 4, 4))[1];
}
for ($j = 16; $j < 68; $j++) {
    $W[$j] = GG($W[$j - 16] ^ $W[$j - 9] ^ ($W[$j - 3] << 15) ^ ($W[$j - 13] >> 17), 15) ^ ($W[$j - 6] << 7) ^ $W[$j - 16];
}
for ($j = 0; $j < 64; $j++) {
    $SS1 = ($A << 12) | ($A >> 20);
    $SS2 = ($SS1 << 7) | ($SS1 >> 25);
    $TT1 = FF($A, $B, $C, $j) + $D + $SS2 + $W[$j] + (0x79cc4519 >> $j);
    $SS1 = ($E << 12) | ($E >> 20);
    $SS2 = ($SS1 << 7) | ($SS1 >> 25);
    $TT2 = GG($E, $F, $G, $j) + $H + $SS2 + $W[$j] + (0x7a879d8a >> $j);
    $D = $C;
    $C = ($B << 9) | ($B >> 23);
    $B = $A;
    $A = $TT1;
    $H = $G;
    $G = ($F << 19) | ($F >> 13);
    $F = $E;
    $E = P0($TT2);
}
$V[0] = $V[0] ^ $A;
$V[1] = $V[1] ^ $B;
$V[2] = $V[2] ^ $C;
$V[3] = $V[3] ^ $D;
$V[4] = $V[4] ^ $E;
$V[5] = $V[5] ^ $F;
$V[6] = $V[6] ^ $G;
$V[7] = $V[7] ^ $H;
return $V;
Salin selepas log masuk

3 Lelaran

Laksanakan fungsi lelaran dalam PHP dan tambah setiap satu Blok mesej diproses secara berulang sehingga semua blok dimampatkan.

fungsi SM3($msg) {

}
$IV = array(
    0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600,
    0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e
);
$msg = padding($msg);
$n = strlen($msg) / 64;
for ($i = 0; $i < $n; $i++) {
    $block = substr($msg, $i * 64, 64);
    $IV = SM3_compress($block, $IV);
}
$digest = "";
foreach ($IV as $v) {
    $digest .= str_pad(dechex($v), 8, "0", STR_PAD_LEFT);
}
return $digest;
Salin selepas log masuk

4. Pengujian Algoritma

Untuk mengesahkan sama ada pelaksanaan kami adalah betul, kami boleh menggunakan ujian algoritma cincang kata laluan GM/T 0004-2012.

memerlukan_sekali "sm3.php";

$input = "abc";
$expected_output = "66C7F0FAD8E2DDDB2D0A6EEA2E2E2C341BECB6C341BECBC94 E 8B7F5D6A5B96D011A7B19A1456";

$output = SM3($input);
var_dump($output === $expected_output); // true

?>


Kami juga boleh menggunakan mesej lain untuk ujian untuk mengesahkan kami Adakah pelaksanaannya betul?

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma SM3 dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan