`
xieye
  • 浏览: 830734 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

aes加密解密php和java互通代码

    博客分类:
  • PHP
阅读更多
代码主要来源如下,但是注意做了修改:
https://gist.github.com/thomasdarimont/fae409eaae2abcf83bd6633b961e7f00

这是aes加密解密互通的代码,php和java的,一种语言加密,另一种可以解密。

修改的地方:省略了向量的输入,太麻烦。读者可自行修改此代码,使得加密更加健壮。

php代码:
class AesCipher
{

    private const OPENSSL_CIPHER_NAME = "aes-128-cbc";
    private const CIPHER_KEY_LEN = 16; //128 bits

    private static function fixKey( $key )
    {

        if ( strlen( $key ) < AesCipher::CIPHER_KEY_LEN ) {
            //0 pad to len 16
            return str_pad( "$key", AesCipher::CIPHER_KEY_LEN, "0" );
        }

        if ( strlen( $key ) > AesCipher::CIPHER_KEY_LEN ) {
            //truncate to 16 bytes
            return substr( $key, 0, AesCipher::CIPHER_KEY_LEN );
        }
        return $key;
    }

    /**
     * Encrypt data using AES Cipher (CBC) with 128 bit key
     *
     * @param type $key - key to use should be 16 bytes long (128 bits)
     * @param type $data - data to encrypt
     * @return encrypted data in base64 encoding with iv attached at end after a :
     */
    public static function encrypt( $key, $data )
    {

        $iv = substr( $key, 0, 5 );
        $iv = str_pad( $iv, 16, '0' );


        $encodedEncryptedData = base64_encode( openssl_encrypt( $data, AesCipher::OPENSSL_CIPHER_NAME, AesCipher::fixKey( $key ), OPENSSL_RAW_DATA, $iv ) );
        $encodedIV = base64_encode( $iv );
        $encryptedPayload = $encodedEncryptedData . ":" . $encodedIV;
        return $encryptedPayload;
    }

    /**
     * Decrypt data using AES Cipher (CBC) with 128 bit key
     *
     * @param type $key - key to use should be 16 bytes long (128 bits)
     * @param type $data - data to be decrypted in base64 encoding with iv attached at the end after a :
     * @return decrypted data
     */
    public static function decrypt( $key, $data )
    {
        $parts = explode( ':', $data ); //Separate Encrypted data from iv.
        $encrypted = $parts[0];
        $iv = $parts[1];
        $decryptedData = openssl_decrypt( base64_decode( $encrypted ), AesCipher::OPENSSL_CIPHER_NAME, AesCipher::fixKey( $key ), OPENSSL_RAW_DATA, base64_decode( $iv ) );
        return $decryptedData;
    }
}



java代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesCrypto {

  private static String CIPHER_NAME = "AES/CBC/PKCS5PADDING";

  private static int CIPHER_KEY_LEN = 16; //128 bits

  /**
 *    * Encrypt data using AES Cipher (CBC) with 128 bit key
 *       *
 *          * @param key  - key to use should be 16 bytes long (128 bits)
 *             * @param iv   - initialization vector
 *                * @param data - data to encrypt
 *                   * @return encryptedData data in base64 encoding with iv attached at end after a :
 *                      */
  public static String encrypt(String key,  String data) {
    String iv = key.substring(0,5);
    iv += "00000000000";

    try {
      IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
      SecretKeySpec secretKey = new SecretKeySpec(fixKey(key).getBytes("UTF-8"), "AES");

      Cipher cipher = Cipher.getInstance(AesCrypto.CIPHER_NAME);
      cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

      byte[] encryptedData = cipher.doFinal((data.getBytes()));

      String encryptedDataInBase64 = Base64.getEncoder().encodeToString(encryptedData);
      String ivInBase64 = Base64.getEncoder().encodeToString(iv.getBytes("UTF-8"));

      return encryptedDataInBase64 + ":" + ivInBase64;

    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

  private static String fixKey(String key) {

    if (key.length() < AesCrypto.CIPHER_KEY_LEN) {
      int numPad = AesCrypto.CIPHER_KEY_LEN - key.length();

      for (int i = 0; i < numPad; i++) {
        key += "0"; //0 pad to len 16 bytes
      }

      return key;

    }

    if (key.length() > AesCrypto.CIPHER_KEY_LEN) {
      return key.substring(0, CIPHER_KEY_LEN); //truncate to 16 bytes
    }

    return key;
  }

  /**
 *    * Decrypt data using AES Cipher (CBC) with 128 bit key
 *       *
 *          * @param key  - key to use should be 16 bytes long (128 bits)
 *             * @param data - encrypted data with iv at the end separate by :
 *                * @return decrypted data string
 *                   */

  public static String decrypt(String key, String data) {

    try {
      String[] parts = data.split(":");

      IvParameterSpec iv = new IvParameterSpec(Base64.getDecoder().decode(parts[1]));
      SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

      Cipher cipher = Cipher.getInstance(AesCrypto.CIPHER_NAME);
      cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

      byte[] decodedEncryptedData = Base64.getDecoder().decode(parts[0]);

      byte[] original = cipher.doFinal(decodedEncryptedData);

      return new String(original);
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }

  public static void main(String[] args) {

    String key = "GNwmNkJ2UZDwhqJ2"; // 128 bit key

    String plain_text = "input张 三你好!!";
    String encrypted = encrypt(key,  plain_text);
    System.out.println(encrypted);

    String decrypt = decrypt(key, encrypted);
    System.out.println(decrypt);
  }
}




0
0
分享到:
评论

相关推荐

    java,php,GOLang,JavaScript,AES加密解密代码互通

    总的来说,跨语言的AES加密解密互通需要对各种语言的加密API有深入理解,并保持一致性以确保数据安全地在不同环境中传输。这个主题对于开发跨平台应用和微服务架构的开发者来说,是一个非常实用的知识点。

    java,php,python AES 加解密互通

    在IT行业中,跨平台的数据安全通信是至关重要的。在标题"java,php,python AES 加解密互通...以上就是关于“java,php,python AES 加解密互通”这个主题的详细解析,涵盖了AES加密的核心概念以及在不同语言中的实现方法。

    一个PHP与JAVA使用AES128位加密通信示例

    aesx/aes4.php为php aes128加密解密类 //加密方法 function desEncryptStr($xml,$keyString){} //解密方法 function DesDecryptStr($xml,$keyString){} aesx/HttpClient.class.php 通信类 send3.php调用文件

    AES 加密 解密 128位 java C# JAVASCRIPT PHP 实例

    要使PHP和Java之间的AES加密解密兼容,你需要确保在PHP中使用相同的填充方法(如ZeroPadding)和操作模式(如CBC),并且正确处理IV。在PHP中,可以使用`openssl_encrypt`函数并指定相应的选项来实现。 3. **...

    Java、C#与PHP的DES加密互通代码(测试通过)

    在提供的"Java、C#与PHP的DES加密互通代码(测试通过).txt"文件中,应该包含了示例代码和测试用例,演示了如何在这些环境中正确地进行DES加密并验证互通性。 总的来说,实现Java、C#和PHP之间的DES加密互通涉及...

    Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    是标准的AES算法,支持在线AES加解密网站互解。 本源码从CSDN一位前辈的源码基础上做了更改,增加支持加密返回BASE64,更加完善。在此感谢原作者: http://download.csdn.net/download/qiaohaidong/9477264 需要注意...

    基于openssl的AES256 的CBC模式的加解密处理类,可以和java/js互通,带加盐

    由于这个类设计为与Java和JavaScript互通,这意味着它可能采用了跨语言兼容的数据表示方式,比如JSON或Base64编码的字符串,以便在不同平台之间传递加密和解密的结果。 这个实现的一个关键优点是其兼容性。能够与...

    android iOS php des 互通加密解密算法

    本篇将详细讲解如何在`Android`、`iOS`和`PHP`中实现`DES`加密解密,并探讨其在中文和长字符串处理中的应用。 首先,让我们了解`DES`的基本原理。`DES`是一种分组密码,它将明文分成64位的数据块,然后使用56位的...

    易语言-AES加密源码 可与其他语言互通

    总的来说,这份"易语言-AES加密源码 可与其他语言互通"涵盖了加密领域的核心知识,包括AES算法、加密模式、密钥管理以及跨语言兼容性设计,对于提升开发者在信息安全和跨平台开发方面的技能大有裨益。通过深入研究和...

    php,java,ios 统一的des 加密

    文件`des.php`可能包含了PHP的实现代码,`des-ios.zip`可能包含了一个iOS项目,其中包含了Objective-C或Swift的加密解密逻辑,而`des-java.zip`则可能包含了一个Java项目的源码。 总的来说,这个解决方案旨在提供一...

    java和php通用的加密算法

    同时,我们也简要探讨了如何在PHP中实现同样的功能,以及如何确保Java和PHP之间加密解密的互操作性。虽然DES因其密钥长度较短而被认为不够安全,但在理解加密算法的基本概念和实践上,它仍然是一个极佳的学习案例。...

    Delphi(delphi7-XE)标准RSA加密,解密,签名.与C,Java,php等通用

    本篇文章将深入探讨Delphi (从delphi7到XE版本)中的RSA实现,以及如何与其他编程语言如C、Java、PHP进行跨平台的加解密和签名操作。 1. RSA原理: RSA基于数论中的大数因子分解难题,由Ron Rivest、Adi Shamir和...

    Node.js中AES加密和其它语言不一致问题解决办法

    Nodejs的AES加密和Java,C#加密出来的不一致。当然,这样就不能解密了。纠结了许久:后来还是实在不行了,看了下源代码,要不然还得继续纠结下去。网上说,通常的nodejs AES和其他语言实现不一样。好吧~~或许吧。...

    DES加密Java及PHP互通

    总结来说,本例子展示了如何在Java和PHP之间使用DES加密进行数据安全传输,确保接口交互的安全性。尽管DES现在已经不是最安全的加密算法,但了解其工作原理和实现方式对于理解加密技术的基础是很有帮助的。在实际...

    AES 加密 可与其他语言互通-易语言

    本教程将详细讲解如何在易语言中实现AES加密,并确保加密后的数据可以与其他语言如Java、Python、C++等进行互通。 易语言是一种以中文为程序设计语言的编程工具,它的语法简洁明了,适合初学者和专业开发者。在...

    PHP、Java des加密解密实例

    以下是一个Java DES加密解密的例子: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class DESUtil { private final static String ALGORITHM = "DES"; public static ...

    Android RSA加密

    为了提高安全性,通常会结合使用RSA和其他加密方式,例如对称加密(如AES),RSA用于加密对称密钥,而大量数据则使用对称加密处理,这样既能利用RSA的非对称性,又避免了其在处理大数据时的效率问题。 在开发过程中...

Global site tag (gtag.js) - Google Analytics