欢迎访问宙启技术站
智能推送

Java函数实现加密和解密操作的方法介绍。

发布时间:2023-05-28 01:38:07

Java是一门强大的编程语言,可以实现各种各样的操作和功能。其中加密和解密操作在网络通信、文件存储等场景下非常常见。本文将介绍Java函数实现加密和解密操作的方法。

一、加密和解密的概念

加密(Encryption)是指将原本不可读的数据(明文)经过一定的算法转化为另一种不可读的数据(密文),以保证数据的隐私和安全性。

解密(Decryption)则是将密文转化回明文的过程。只有知道加密算法和密钥的人才能成功地对密文进行解密。

二、Java中常见的加密算法

1. 对称加密算法

对称加密算法(Symmetric Encryption)是最简单、最快速的加密算法,它使用相同的密钥对数据进行加密和解密。常见的对称加密算法有DES、3DES、AES等。

2. 非对称加密算法

非对称加密算法(Asymmetric Encryption)使用两个不同的密钥:公钥和私钥。公钥用来加密明文,私钥用来解密密文。常见的非对称加密算法有RSA、DSA等。

3. 散列算法

散列算法(Hash Algorithm)是将任意长度的输入(明文)通过散列函数计算成固定长度的输出(散列值)。常见的散列算法有MD5、SHA-1、SHA-256等。

三、Java函数实现加密和解密操作的方法

1. 对称加密算法的实现

(1)DES加解密

DES算法是一种基于对称密钥的加密算法,它是最早被广泛使用的密码体制之一。DES算法块长度为64位,密钥长度为56位。加密过程中,明文按64位分组,经过16轮迭代加密,得到密文。解密时,密文先进行16轮迭代反向运算,最终还原出明文。示例代码如下:

// DES加密

public static String encryptDES(String plainText, String secretKey) {

    try {

        DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes("UTF-8"));

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

        SecretKey key = keyFactory.generateSecret(desKeySpec);

        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] result = cipher.doFinal(plainText.getBytes("UTF-8"));

        return Base64.encodeBase64String(result);

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

// DES解密

public static String decryptDES(String cipherText, String secretKey) {

    try {

        DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes("UTF-8"));

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

        SecretKey key = keyFactory.generateSecret(desKeySpec);

        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] result = cipher.doFinal(Base64.decodeBase64(cipherText));

        return new String(result, "UTF-8");

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

(2)AES加解密

AES算法是一种高级加密标准(Advanced Encryption Standard),也是一种对称密钥加密算法。AES算法块长度为128位,密钥长度可以是128、192、256位。加密过程中,明文按128位分组,经过多次迭代加密,得到密文。解密时,密文进行多次迭代反向运算,最终还原出明文。示例代码如下:

// AES加密

public static String encryptAES(String plainText, String secretKey) {

    try {

        Key key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] result = cipher.doFinal(plainText.getBytes("UTF-8"));

        return Base64.encodeBase64String(result);

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

// AES解密

public static String decryptAES(String cipherText, String secretKey) {

    try {

        Key key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] result = cipher.doFinal(Base64.decodeBase64(cipherText));

        return new String(result, "UTF-8");

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

2. 非对称加密算法的实现

(1)RSA加解密

RSA算法是一种非对称密钥加密算法,它可以实现加密和数字签名等功能。RSA算法使用公钥加密,私钥解密。密钥长度一般为1024或2048位。示例代码如下:

// RSA加密

public static String encryptRSA(String plainText, String publicKey) {

    try {

        byte[] keyBytes = Base64.decodeBase64(publicKey);

        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PublicKey key = keyFactory.generatePublic(spec);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] result = cipher.doFinal(plainText.getBytes("UTF-8"));

        return Base64.encodeBase64String(result);

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

// RSA解密

public static String decryptRSA(String cipherText, String privateKey) {

    try {

        byte[] keyBytes = Base64.decodeBase64(privateKey);

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PrivateKey key = keyFactory.generatePrivate(spec);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] result = cipher.doFinal(Base64.decodeBase64(cipherText));

        return new String(result, "UTF-8");

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

3. 散列算法的实现

(1)MD5加密

MD5算法是一种不可逆的散列算法,它将任意长度的输入(明文)通过散列函数计算成固定长度的输出(散列值)。MD5算法的散列值长度为128位。示例代码如下:

// MD5加密

public static String encryptMD5(String plainText) {

    try {

        MessageDigest md = MessageDigest.getInstance("MD5");

        byte[] result = md.digest(plainText.getBytes("UTF-8"));

        return hexEncode(result);

    } catch (Exception e) {

        e.printStackTrace();

    }

    return null;

}

private static String hexEncode(byte[] bytes) {

    StringBuffer result = new StringBuffer();

    for (byte b : bytes) {

        result.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3));

    }

    return result.toString();

}

除了MD5算法,SHA-1、SHA-256等散列算法也可以使用相似的方法进行实现。

四、总结

Java函数实现加密和解密操作可以使用对称加密算法、非对称加密算法和散列算法等多种算法。这些算法各具优缺点,应根据具体的场景和需求选择合适的算法。在实现加密和解密功能时,需要注意密钥的安全性,避免密钥泄露导致数据泄露。