Java & PHP 3DES 互通加密、解密


3DES(或稱為Triple DES)是三重數據加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當於是對每個數據塊應用三次DES加密算法。

3DES又稱Triple DES,是DES加密算法的一種模式,它使用2條不同的56位的密鑰對數據進行三次加密。

數據加密標准(DES)是美國的一種由來已久的加密標准,它使用對稱密鑰加密法,並於1981年被ANSI組織規范為ANSI X.3.92。

DES使用56位密鑰和密碼塊的方法,而在密碼塊的方法中,文本被分成64位大小的文本塊然后再進行加密。比起最初的DES,3DES更為安全。

3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定為過渡的加密標准),加密算法,其具體實現如下:設Ek()和Dk()代表DES算法的加密和解密過程,K代表DES算法使用的密鑰,P代表明文,C代表密文,這樣:

  • 3DES加密過程為:C=Ek3(Dk2(Ek1(P)))

  • 3DES解密過程為:P=Dk1(EK2(Dk3(C)))

版本

語言 版本
PHP 7.3.11
Java 1.8.0_231

加密

PHP

CryptUtil.encrypt

public static function encrypt($data, $key)
{
  $strPadded = $data;
  if (strlen($strPadded) % 8) {
    $strPadded = str_pad($strPadded,strlen($strPadded) + 8 - strlen($strPadded) % 8, "\0");
  }
  $key = self::getKey($key);
  $encData = openssl_encrypt($strPadded, self::CIPHER_ALGO, $key, self::OPTIONS, self::IV);
  return base64_encode($encData);
}

Java

CryptUtil.encryptBy3DesAndBase64

public static String encryptBy3DesAndBase64(String content, String keyStr, String encoding) throws Exception {
  byte output[] = null;
  byte input[] = null;
  int residue = (content.getBytes(encoding).length) % 8;
  if (0 != residue) {
    int padLen = 8 - residue;
    StringBuffer strBuf = new StringBuffer(content);
    for (int i = 0; i < padLen; i++) {
      strBuf.append(' ');
    }
    input = (new String(strBuf)).getBytes(encoding);
  } else {
    input = content.getBytes(encoding);
  }
  output = encryptBy3Des(input, keyStr);
  return Base64.encode(output).replaceAll("[\\n\\r]", "");
}

解密

PHP

CryptUtil.decrypt

public static function decrypt($data, $key)
{
  $key     = self::getKey($key);
  $data    = base64_decode($data);
  $decData = openssl_decrypt($data, self::CIPHER_ALGO, $key, self::OPTIONS, self::IV);
  return trim($decData);
}

Java

CryptUtil.decryptBy3DesAndBase64

public static String decryptBy3DesAndBase64(String content, String keyStr, String encoding) throws Exception {
  byte output[] = null;
  byte input[] = null;
  input = Base64.decode(content);
  output = decryptBy3Des(input, keyStr);
  String retStr = new String(output, encoding);
  return (retStr.trim());
}

Demo

完整 Demo 源碼:BNDong/demo/PhpJava3DES


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM