加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php、java、android、ios通用的3des方法(推荐)

发布时间:2020-05-23 10:27:39 所属栏目:PHP 来源:互联网
导读:下面小编就为大家带来一篇php、java、android、ios通用的3des方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

php服务器,java服务器,android,ios开发兼容的3des加密解密,

php

function encrypt($input){ $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC); $input = $this->pkcs5_pad($input,$size); $key = str_pad($this->key,24,'0'); $td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,''); if( $this->iv == '' ) { $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td),MCRYPT_RAND); } else { $iv = $this->iv; } @mcrypt_generic_init($td,$key,$iv); $data = mcrypt_generic($td,$input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } function decrypt($encrypted){ $encrypted = base64_decode($encrypted); $key = str_pad($this->key,MCRYPT_RAND); } else { $iv = $this->iv; } $ks = mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td,$iv); $decrypted = mdecrypt_generic($td,$encrypted); mcrypt_generic_deinit($td); mcrypt_module_close($td); $y=$this->pkcs5_unpad($decrypted); return $y; } function pkcs5_pad ($text,$blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad),$pad); } function pkcs5_unpad($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,-1 * $pad); } function PaddingPKCS7($data) { $block_size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC); $padding_char = $block_size - (strlen($data) % $block_size); $data .= str_repeat(chr($padding_char),$padding_char); return $data; }

}

$des = new DES3();
echo $ret = $des->encrypt("来自http://jb51.cc的博客") . "n";
echo $des->decrypt($ret) . "n";

java(android)

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**

  • 3DES加密工具类
    */
    public class DES3 {
    // 密钥
    private final static String secretKey = "my.oschina.net/penngo?#@" ;
    // 向量
    private final static String iv = "01234567" ;
    // 加解密统一使用的编码方式
    private final static String encoding = "utf-8" ;

    /**

    • 3DES加密

    • @param plainText 普通文本

    • @return

    • @throws Exception
      */
      public static String encode(String plainText) throws Exception {
      Key deskey = null ;
      DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
      SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" );
      deskey = keyfactory.generateSecret(spec);

      Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" );
      IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
      cipher.init(Cipher.ENCRYPT_MODE,deskey,ips);
      byte [] encryptData = cipher.doFinal(plainText.getBytes(encoding));
      return Base64.encode(encryptData);
      }

    /**

    • 3DES解密

    • @param encryptText 加密文本

    • @return

    • @throws Exception
      */
      public static String decode(String encryptText) throws Exception {
      Key deskey = null ;
      DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
      SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" );
      deskey = keyfactory.generateSecret(spec);
      Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" );
      IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
      cipher.init(Cipher.DECRYPT_MODE,ips);

      byte [] decryptData = cipher.doFinal(Base64.decode(encryptText));

      return new String(decryptData,encoding);
      }

    public static String padding(String str) {
    byte[] oldByteArray;
    try {
    oldByteArray = str.getBytes("UTF8");
    int numberToPad = 8 - oldByteArray.length % 8;
    byte[] newByteArray = new byte[oldByteArray.length + numberToPad];
    System.arraycopy(oldByteArray,newByteArray,oldByteArray.length);
    for (int i = oldByteArray.length; i < newByteArray.length; ++i) {
    newByteArray[i] = 0;
    }
    return new String(newByteArray,"UTF8");
    } catch (UnsupportedEncodingException e) {
    System.out.println("Crypter.padding UnsupportedEncodingException");
    }
    return null;
    }

    /**

    • Base64编码工具类

    • */
      public static class Base64 {
      private static final char [] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" .toCharArray();

      public static String encode( byte [] data) {
      int start = 0 ;
      int len = data.length;
      StringBuffer buf = new StringBuffer(data.length * 3 / 2 );

      int end = len - 3 ;
      int i = start;
      int n = 0 ;

      while (i <= end) {
      int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 0x0ff ) << 8 ) | ((( int ) data[i + 2 ]) & 0x0ff );

      buf.append(legalChars[(d >> 18 ) & 63 ]); 
      buf.append(legalChars[(d >> 12 ) & 63 ]); 
      buf.append(legalChars[(d >> 6 ) & 63 ]); 
      buf.append(legalChars[d & 63 ]); 
      
      i += 3 ; 
      
      if (n++ >= 14 ) { 
        n = 0 ; 
        buf.append( " " ); 
      } 

      }

      if (i == start + len - 2 ) {
      int d = (((( int ) data[i]) & 0x0ff ) << 16 ) | (((( int ) data[i + 1 ]) & 255 ) << 8 );

      buf.append(legalChars[(d >> 18 ) & 63 ]); 
      buf.append(legalChars[(d >> 12 ) & 63 ]); 
      buf.append(legalChars[(d >> 6 ) & 63 ]); 
      buf.append( "=" ); 

      } else if (i == start + len - 1 ) {
      int d = ((( int ) data[i]) & 0x0ff ) << 16 ;

      buf.append(legalChars[(d >> 18 ) & 63 ]); 
      buf.append(legalChars[(d >> 12 ) & 63 ]); 
      buf.append( "==" ); 

      }

      return buf.toString();
      }

      private static int decode( char c) {
      if (c >= 'A' && c <= 'Z' )
      return (( int ) c) - 65 ;
      else if (c >= 'a' && c <= 'z' )
      return (( int ) c) - 97 + 26 ;
      else if (c >= '0' && c <= '9' )
      return (( int ) c) - 48 + 26 + 26 ;
      else
      switch (c) {
      case '+' :
      return 62 ;
      case '/' :
      return 63 ;
      case '=' :
      return 0 ;
      default :
      throw new RuntimeException( "unexpected code: " + c);
      }
      }

      /**

      • Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned.
        */

      public static byte [] decode(String s) {

      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      try {
      decode(s,bos);
      } catch (IOException e) {
      throw new RuntimeException();
      }
      byte [] decodedBytes = bos.toByteArray();
      try {
      bos.close();
      bos = null ;
      } catch (IOException ex) {
      System.err.println( "Error while decoding BASE64: " + ex.toString());
      }
      return decodedBytes;
      }

      private static void decode(String s,OutputStream os) throws IOException {
      int i = 0 ;

      int len = s.length();

      while ( true ) {
      while (i < len && s.charAt(i) <= ' ' )
      i++;

      if (i == len) 
        break ; 
      
      int tri = (decode(s.charAt(i)) << 18 ) + (decode(s.charAt(i + 1 )) << 12 ) + (decode(s.charAt(i + 2 )) << 6 ) + (decode(s.charAt(i + 3 ))); 
      
      os.write((tri >> 16 ) & 255 ); 
      if (s.charAt(i + 2 ) == '=' ) 
        break ; 
      os.write((tri >> 8 ) & 255 ); 
      if (s.charAt(i + 3 ) == '=' ) 
        break ; 
      os.write(tri & 255 ); 
      
      i += 4 ; 

      }
      }
      }

    (编辑:安卓应用网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读