Rumah pembangunan bahagian belakang tutorial php php中常用的加密解密算法的讲解(代码)

php中常用的加密解密算法的讲解(代码)

Oct 08, 2018 pm 02:33 PM
Penyulitan dan penyahsulitan

本篇文章给大家带来的内容是关于php中常用的加密解密算法的讲解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

这里主要介绍三种常用的加密解密算法:
方法一:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

/**

 * @param $string    要加密/解密的字符串

 * @param string $operation   类型,ENCODE 加密;DECODE 解密

 * @param string $key    密匙

 * @param int $expiry    有效期

 * @return string

 */

function authcode($string, $operation = 'DECODE', $key = 'encrypt', $expiry = 0)

{

    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙

    $ckey_length = 4;

    // 密匙

    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);

    // 密匙a会参与加解密

    $keya = md5(substr($key, 0, 16));

    // 密匙b会用来做数据完整性验证

    $keyb = md5(substr($key, 16, 16));

    // 密匙c用于变化生成的密文

    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) :

        substr(md5(microtime()), -$ckey_length)) : '';

    // 参与运算的密匙

    $cryptkey = $keya . md5($keya . $keyc);

    $key_length = strlen($cryptkey);

    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),

    //解密时会通过这个密匙验证数据完整性

    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确

    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :

        sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;

    $string_length = strlen($string);

    $result = '';

    $box = range(0, 255);

    $rndkey = array();

    // 产生密匙簿

    for ($i = 0; $i <= 255; $i++) {

        $rndkey[$i] = ord($cryptkey[$i % $key_length]);

    }

    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度

    for ($j = $i = 0; $i < 256; $i++) {

        $j = ($j + $box[$i] + $rndkey[$i]) % 256;

        $tmp = $box[$i];

        $box[$i] = $box[$j];

        $box[$j] = $tmp;

    }

    // 核心加解密部分

    for ($a = $j = $i = 0; $i < $string_length; $i++) {

        $a = ($a + 1) % 256;

        $j = ($j + $box[$a]) % 256;

        $tmp = $box[$a];

        $box[$a] = $box[$j];

        $box[$j] = $tmp;

        // 从密匙簿得出密匙进行异或,再转成字符

        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

    }

    if ($operation == &#39;DECODE&#39;) {

        // 验证数据有效性,请看未加密明文的格式

        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&

            substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)

        ) {

            return substr($result, 26);

        } else {

            return &#39;&#39;;

        }

    } else {

        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因

        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码

        return $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));

    }

}

Salin selepas log masuk

使用:

1

2

3

4

5

6

7

$string = &#39;加密字符串&#39;;

// 加密

$encode = authcode($string, &#39;ENCODE&#39;);

echo $encode . &#39;</br>&#39;;       // a2f4bSYyUrTum1nAAA9X9BrC4Z3DZazcSa4eLcvDoCnmYc1LTdvtqS4aCds

// 解密

$decode = authcode($encode, &#39;DECODE&#39;);

echo $decode;     // 加密字符串

Salin selepas log masuk

方法二:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/**

 * @param $string    要加密/解密的字符串

 * @param $operation    类型,E 加密;D 解密

 * @param string $key   密钥

 * @return mixed|string

 */

function encrypt($string, $operation, $key = &#39;encrypt&#39;)

{

    $key = md5($key);

    $key_length = strlen($key);

    $string = $operation == &#39;D&#39; ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;

    $string_length = strlen($string);

    $rndkey = $box = array();

    $result = &#39;&#39;;

    for ($i = 0; $i <= 255; $i++) {

        $rndkey[$i] = ord($key[$i % $key_length]);

        $box[$i] = $i;

    }

    for ($j = $i = 0; $i < 256; $i++) {

        $j = ($j + $box[$i] + $rndkey[$i]) % 256;

        $tmp = $box[$i];

        $box[$i] = $box[$j];

        $box[$j] = $tmp;

    }

    for ($a = $j = $i = 0; $i < $string_length; $i++) {

        $a = ($a + 1) % 256;

        $j = ($j + $box[$a]) % 256;

        $tmp = $box[$a];

        $box[$a] = $box[$j];

        $box[$j] = $tmp;

        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

    }

    if ($operation == &#39;D&#39;) {

        if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {

            return substr($result, 8);

        } else {

            return &#39;&#39;;

        }

    } else {

        return str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));

    }

}

Salin selepas log masuk

使用:

1

2

3

4

5

6

7

$string = &#39;加密字符串&#39;;

// 加密

$encode = encrypt($string, &#39;E&#39;);

echo $encode . &#39;</br>&#39;;       // 0Jzym5UzkRKH726U7Pyt7ixzLz9YEEA

// 解密

$decode = encrypt($encode, &#39;D&#39;);

echo $decode;     // 加密字符串

Salin selepas log masuk

方法三:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/**

 * @param $data  要加密的字符串

 * @param $key   密钥

 * @return string

 */

function encrypt($data, $key = &#39;encrypt&#39;)

{

    $key = md5($key);

    $x = 0;

    $len = strlen($data);

    $l = strlen($key);

    $char = &#39;&#39;;

    for ($i = 0; $i < $len; $i++) {

        if ($x == $l) {

            $x = 0;

        }

        $char .= $key{$x};

        $x++;

    }

    $str = &#39;&#39;;

    for ($i = 0; $i < $len; $i++) {

        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);

    }

    return base64_encode($str);

}

 

 

/**

 * @param $data    要解密的字符串

 * @param $key     密钥

 * @return string

 */

function decrypt($data, $key = &#39;encrypt&#39;)

{

    $key = md5($key);

    $x = 0;

    $data = base64_decode($data);

    $len = strlen($data);

    $l = strlen($key);

    $char = &#39;&#39;;

    for ($i = 0; $i < $len; $i++) {

        if ($x == $l) {

            $x = 0;

        }

        $char .= substr($key, $x, 1);

        $x++;

    }

    $str = &#39;&#39;;

    for ($i = 0; $i < $len; $i++) {

        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {

            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));

        } else {

            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));

        }

    }

    return $str;

}

Salin selepas log masuk

使用:

1

2

3

4

5

6

7

$string = &#39;加密字符串&#39;;

// 加密

$encode = encrypt($string);

echo $encode . &#39;</br>&#39;;       // Gr0DHeHrRw7KGBLcSOzj

// 解密

$decode = decrypt($encode);

echo $decode;     // 加密字符串

Salin selepas log masuk

Atas ialah kandungan terperinci 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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyulitan dan penyahsulitan data menggunakan React Query dan pangkalan data Penyulitan dan penyahsulitan data menggunakan React Query dan pangkalan data Sep 26, 2023 pm 12:53 PM

Tajuk: Penyulitan dan Penyahsulitan Data Menggunakan ReactQuery dan Pangkalan Data Pengenalan: Artikel ini akan memperkenalkan cara menggunakan ReactQuery dan pangkalan data untuk penyulitan dan penyahsulitan data. Kami akan menggunakan ReactQuery sebagai pustaka pengurusan data dan menggabungkannya dengan pangkalan data untuk melaksanakan operasi penyulitan dan penyahsulitan data. Dengan menggabungkan kedua-dua teknologi ini, kami boleh menyimpan dan menghantar data sensitif dengan selamat, dan melaksanakan operasi penyulitan dan penyahsulitan apabila diperlukan untuk memastikan keselamatan data. Teks: 1. ReactQue

Kaedah pelaksanaan penyulitan dan penyahsulitan dibangunkan dalam PHP dalam applet WeChat Kaedah pelaksanaan penyulitan dan penyahsulitan dibangunkan dalam PHP dalam applet WeChat Jun 01, 2023 am 08:12 AM

Memandangkan program mini WeChat menjadi lebih popular dalam pasaran aplikasi mudah alih, pembangunan mereka juga telah mendapat lebih banyak perhatian. Dalam program kecil, PHP, sebagai bahasa back-end yang biasa digunakan, sering digunakan untuk mengendalikan penyulitan dan penyahsulitan data sensitif. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan penyulitan dan penyahsulitan dalam applet WeChat. 1. Apakah penyulitan dan penyahsulitan? Penyulitan ialah penukaran data sensitif kepada bentuk yang tidak boleh dibaca untuk memastikan data tersebut tidak dicuri atau diganggu semasa penghantaran. Penyahsulitan ialah pemulihan data yang disulitkan kepada data asal. Dalam program kecil, penyulitan dan penyahsulitan biasanya termasuk

Sulitkan dan nyahsulit data sensitif menggunakan perisian tengah rangka kerja Yii Sulitkan dan nyahsulit data sensitif menggunakan perisian tengah rangka kerja Yii Jul 28, 2023 pm 07:12 PM

Menyulitkan dan menyahsulit data sensitif menggunakan perisian tengah rangka kerja Yii Pengenalan: Dalam aplikasi Internet moden, privasi dan keselamatan data adalah isu yang sangat penting. Untuk memastikan bahawa data sensitif pengguna tidak boleh diakses oleh pelawat yang tidak dibenarkan, kami perlu menyulitkan data ini. Rangka kerja Yii memberikan kami cara yang mudah dan berkesan untuk melaksanakan fungsi menyulitkan dan menyahsulit data sensitif. Dalam artikel ini, kami akan membincangkan cara untuk mencapai ini menggunakan perisian tengah rangka kerja Yii. Pengenalan kepada rangka kerja Yii Rangka kerja Yii ialah rangka kerja PHP berprestasi tinggi.

Bagaimana untuk menambah fungsi penyulitan Win11 pada menu klik kanan Bagaimana untuk menambah penyulitan Win11 dan pintasan klik kanan penyahsulitan Bagaimana untuk menambah fungsi penyulitan Win11 pada menu klik kanan Bagaimana untuk menambah penyulitan Win11 dan pintasan klik kanan penyahsulitan Jan 07, 2024 am 08:45 AM

Artikel ini ialah tutorial tentang cara menyulitkan dan menyahsulit fail tanpa menggunakan alat penyulitan dan penyahsulitan pihak ketiga. Tutorial tentang menambah kaedah penyulitan dan penyahsulitan pada menu klik kanan Win11 Memandangkan pendaftaran perlu diubah suai, anda mesti membuat sandaran sebelum meneruskan operasi. 1. Mula-mula, tekan kombinasi kekunci [Win+R] pada papan kekunci untuk membuka Run, kemudian masukkan perintah [regedit] dan tekan [OK atau Enter] untuk membuka Registry Editor 2. Dalam tetingkap Kawalan Akaun Pengguna, anda perlu membenarkan Adakah apl ini membuat perubahan pada peranti anda? Klik [Ya]; 3. Tetingkap Registry Editor, kembangkan ke laluan berikut: HKEY_CURRENT_USER\Software\Microsoft\Windows\Curr

Contoh penyulitan dan penyahsulitan data semasa proses dok antara muka PHP Tencent Cloud Server API Contoh penyulitan dan penyahsulitan data semasa proses dok antara muka PHP Tencent Cloud Server API Jul 06, 2023 am 10:52 AM

Contoh Penyulitan dan Penyahsulitan Data PHP semasa Proses Antaramuka Antara Muka API Pelayan Awan Tencent: Semasa proses antara muka dengan antara muka API Pelayan Awan Tencent, keselamatan data adalah sangat penting. Untuk memastikan keselamatan data semasa penghantaran dan penyimpanan, kami perlu menyulitkan maklumat sensitif. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menyulitkan dan menyahsulit data untuk meningkatkan kerahsiaan dan integriti data. Penyulitan data: Apabila membuat permintaan API, kami perlu menyulitkan maklumat sensitif untuk memastikan keselamatan data. Biasa digunakan

Pembangunan peti mel PHP: melaksanakan fungsi penyulitan dan penyahsulitan e-mel Pembangunan peti mel PHP: melaksanakan fungsi penyulitan dan penyahsulitan e-mel Sep 12, 2023 am 10:40 AM

Pembangunan peti mel PHP: merealisasikan fungsi penyulitan dan penyahsulitan e-mel Dengan perkembangan penghantaran maklumat yang semakin meningkat, e-mel telah menjadi salah satu kaedah komunikasi yang penting untuk orang ramai. Bagaimanapun, isu keselamatan yang berlaku secara beransur-ansur telah menarik perhatian orang ramai. Untuk melindungi keselamatan e-mel, penyulitan dan penyahsulitan telah menjadi aspek penting dalam menghantar dan menerima e-mel. Artikel ini akan memperkenalkan cara menggunakan PHP untuk membangunkan fungsi penyulitan dan penyahsulitan e-mel untuk meningkatkan keselamatan e-mel. 1. Prinsip dan fungsi penyulitan Penyulitan e-mel adalah untuk menukar kandungan e-mel menggunakan algoritma tertentu supaya sebagai tambahan kepada penerima

Apakah alat penyulitan dan penyahsulitan yang biasa digunakan dalam perpustakaan fungsi Java? Apakah alat penyulitan dan penyahsulitan yang biasa digunakan dalam perpustakaan fungsi Java? May 05, 2024 am 08:54 AM

Pustaka fungsi Java menyediakan banyak alat penyulitan dan penyahsulitan, termasuk JCE, JCA, Apache CommonsCrypt, dll. JCE menyediakan algoritma dan fungsi penyulitan, JCA menyediakan antara muka untuk mengakses penyedia perkhidmatan penyulitan, dan Apache CommonsCrypt mengandungi lebih banyak algoritma dan alatan penyulitan. Kes praktikal menunjukkan cara menggunakan JCE untuk menyulitkan teks AES dan menjana teks sifir berkod Base64.

Bagaimana untuk menggunakan modul SectionReader Go untuk menyulitkan dan menyahsulit kandungan bahagian tertentu fail? Bagaimana untuk menggunakan modul SectionReader Go untuk menyulitkan dan menyahsulit kandungan bahagian tertentu fail? Jul 23, 2023 am 08:24 AM

Bagaimana untuk menggunakan modul SectionReader Go untuk menyulitkan dan menyahsulit kandungan bahagian tertentu fail? Pengenalan: Dalam pembangunan, penyulitan dan penyahsulitan kandungan fail adalah keperluan yang sangat biasa. Bahasa Go menyediakan banyak perpustakaan dan modul untuk memenuhi keperluan ini. Antaranya, SectionReader ialah modul yang sangat praktikal yang membolehkan kami menentukan julat kandungan dalam fail besar dan melaksanakan operasi membaca, penyulitan dan penyahsulitan. Artikel ini akan memperkenalkan cara menggunakan modul SectionReader Go untuk dilaksanakan

See all articles