首页 > 后端开发 > php教程 > 兼容PHP和Java的des加密解密代码分享_PHP

兼容PHP和Java的des加密解密代码分享_PHP

WBOY
发布: 2016-06-01 11:51:26
原创
1098 人浏览过

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

69

70

71

72

73

74

75

<&#63;php

class DES

{

    var $key;

    var $iv; //偏移量

  

    function DES($key, $iv=0)

    {

        $this->key = $key;

        if($iv == 0)

        {

            $this->iv = $key;

        }

        else

        {

            $this->iv = $iv;

        }

    }

  

    //加密

    function encrypt($str)

    {      

        $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );

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

  

        $data=mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv);

        //$data=strtoupper(bin2hex($data)); //返回大写十六进制字符串

        return base64_encode($data);

    }

  

    //解密

    function decrypt($str)

    {

        $str = base64_decode ($str);

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

        $str = mcrypt_cbc(MCRYPT_DES, $this->key, $str, 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 );

    }

}

$str = 'abcd';

$key= 'asdfwef5';

$crypt = new DES($key);

$mstr = $crypt->encrypt($str);

$str = $crypt->decrypt($mstr);

  

echo $str.' <=> '.$mstr;

  

&#63;>

登录后复制

java代码:

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

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

package com.test;

  

import it.sauronsoftware.base64.Base64;

  

import java.security.Key;

import java.security.SecureRandom;

import java.security.spec.AlgorithmParameterSpec;

  

import javax.crypto.Cipher;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

  

public class Main

{

  public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";

  /**

   * DES算法,加密

   *

   * @param data 待加密字符串

   * @param key 加密私钥,长度不能够小于8位

   * @return 加密后的字节数组,一般结合Base64编码使用

   * @throws CryptException 异常

   */

  public static String encode(String key,String data) throws Exception

  {

    return encode(key, data.getBytes());

  }

  /**

   * DES算法,加密

   *

   * @param data 待加密字符串

   * @param key 加密私钥,长度不能够小于8位

   * @return 加密后的字节数组,一般结合Base64编码使用

   * @throws CryptException 异常

   */

  public static String encode(String key,byte[] data) throws Exception

  {

    try

    {

        DESKeySpec dks = new DESKeySpec(key.getBytes());

  

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

      //key的长度不能够小于8位字节

      Key secretKey = keyFactory.generateSecret(dks);

      Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

      IvParameterSpec iv = new IvParameterSpec(key.getBytes());

      AlgorithmParameterSpec paramSpec = iv;

      cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);

  

      byte[] bytes = cipher.doFinal(data);

  

  

//      return byte2hex(bytes);

      return new String(Base64.encode(bytes));

    } catch (Exception e)

    {

      throw new Exception(e);

    }

  }

  

  /**

   * DES算法,解密

   *

   * @param data 待解密字符串

   * @param key 解密私钥,长度不能够小于8位

   * @return 解密后的字节数组

   * @throws Exception 异常

   */

  public static byte[] decode(String key,byte[] data) throws Exception

  {

    try

    {

        SecureRandom sr = new SecureRandom();

        DESKeySpec dks = new DESKeySpec(key.getBytes());

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

      //key的长度不能够小于8位字节

      Key secretKey = keyFactory.generateSecret(dks);

      Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

      IvParameterSpec iv = new IvParameterSpec(key.getBytes());

      AlgorithmParameterSpec paramSpec = iv;

      cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);

      return cipher.doFinal(data);

    } catch (Exception e)

    {

      throw new Exception(e);

    }

  }

  

  /**

   * 获取编码后的值

   * @param key

   * @param data

   * @return

   * @throws Exception

   */

  public static String decodeValue(String key,String data)

  {

    byte[] datas;

    String value = null;

        try {

  

            datas = decode(key, Base64.decode(data.getBytes()));

  

            value = new String(datas);

        } catch (Exception e) {

            value = "";

        }

    return value;

  }

  

  public static void main(String[] args) throws Exception

  {

    System.out.println("明:abcd ;密:" + Main.encode("asdfwef5","abcd"));

  }

}

登录后复制

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板