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

Bagaimana untuk melaksanakan algoritma SM3 dalam PHP

PHPz
PHPzasal
2023-04-26 10:30:43924semak imbas

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;

}

2. Potongan diproses sebagai cernaan mesej 256-bit.

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

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


}
return ($X & $Y) | ($X & $Z) | ($Y & $Z);
fungsi P0($X) {


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


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


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


}
if ($j >= 0 && $j <= 15) {
    return P0($X ^ $Y ^ $Z);
} else {
    return P1($X ^ $Y ^ $Z);
}
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;

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;

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:
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