ホームページ > バックエンド開発 > PHPチュートリアル > PHP は、C# と一貫した DES 暗号化および復号化メソッドを実装します。

PHP は、C# と一貫した DES 暗号化および復号化メソッドを実装します。

墨辰丷
リリース: 2023-03-26 18:28:02
オリジナル
2207 人が閲覧しました

この記事では主に C# と整合性のある DES 暗号化と復号化を PHP で実装する方法を紹介します。興味のある方はぜひ参考にしてください。

注: キーの長さは 8 文字以内です。

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

69

70

71

72

73

74

75

76

77

78

79

80

//C# 版DES 加解密算法

using System;  

using System.Data;  

using System.Configuration;  

using System.Web;  

using System.Web.Security;  

using System.Web.UI;  

using System.Web.UI.WebControls;  

using System.Web.UI.WebControls.WebParts;  

using System.Web.UI.HtmlControls;  

using System.Data.SqlClient;  

using System.Security.Cryptography;  

using System.IO;  

using System.Text;  

public class Des{  

  //加解密密钥

  private static string skey = "12345678";

  //初始化向量

  private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 

   

        #region DESEnCode DES加密  

        public static string DESEnCode(string pToEncrypt, string sKey)  

        {  

          pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt);  

          DESCryptoServiceProvider des = new DESCryptoServiceProvider();  

          byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);  

          

          //建立加密对象的密钥和偏移量  

          //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  

          //使得输入密码必须输入英文文本  

          des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);  

          des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  

          MemoryStream ms = new MemoryStream();  

          CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);  

          

          cs.Write(inputByteArray, 0, inputByteArray.Length);  

          cs.FlushFinalBlock();  

          

          StringBuilder ret = new StringBuilder();  

          foreach (byte b in ms.ToArray())  

          {  

            ret.AppendFormat("{0:X2}", b);  

          }  

          ret.ToString();  

          return ret.ToString();  

        

        #endregion 

        /// <summary>

        /// 

        /// </summary>

        /// <param name="pToDecrypt"> 待解密的字符串</param>

        /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同</param>

        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>

        #region DESDeCode DES解密

        public static string DESDeCode(string pToDecrypt, string sKey)

        {

          //  HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);  

          //  HttpContext.Current.Response.End();  

          DESCryptoServiceProvider des = new DESCryptoServiceProvider();

         

          byte[] inputByteArray = new byte[pToDecrypt.Length / 2];

          for (int x = 0; x < pToDecrypt.Length / 2; x++)

          {

            int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));

            inputByteArray[x] = (byte)i;

          }

         

          des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);

          des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

          MemoryStream ms = new MemoryStream();

          CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);

          cs.Write(inputByteArray, 0, inputByteArray.Length);

          cs.FlushFinalBlock();

         

          StringBuilder ret = new StringBuilder();

         

          return HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));

        }

  #endregion 

}

ログイン後にコピー

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

<?php

class DES

{

  var $key;

  var $iv; //偏移量

    

  function DES( $key, $iv=0 ) {

  //key长度8例如:1234abcd

    $this->key = $key;

    if( $iv == 0 ) {

      $this->iv = $key; //默认以$key 作为 iv

    } else {

      $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );

    }

  }

    

  function encrypt($str) {

  //加密,返回大写十六进制字符串

    $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );

    $str = $this->pkcs5Pad ( $str, $size );

    return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );

  }

    

  function decrypt($str) {

  //解密

    $strBin = $this->hex2bin( strtolower( $str ) );

    $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );

    $str = $this->pkcs5Unpad( $str );

    return $str;

  }

    

  function hex2bin($hexData) {

    $binData = "";

    for($i = 0; $i < strlen ( $hexData ); $i += 2) {

      $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );

    }

    return $binData;

  }

  

  function pkcs5Pad($text, $blocksize) {

    $pad = $blocksize - (strlen ( $text ) % $blocksize);

    return $text . str_repeat ( chr ( $pad ), $pad );

  }

    

  function pkcs5Unpad($text) {

    $pad = ord ( $text {strlen ( $text ) - 1} );

    if ($pad > strlen ( $text ))

      return false;

    if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)

      return false;

    return substr ( $text, 0, - 1 * $pad );

  }

    

}

?>

ログイン後にコピー

関連する推奨事項:

PHP の RSA暗号化と復号化 および開発インターフェイスの使用状況分析

PHP RSA ciphertext暗号化と復号 秘密の詳しい説明ステップ

PHP は SSL暗号化、復号化、検証と署名を実装します

以上がPHP は、C# と一貫した DES 暗号化および復号化メソッドを実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート