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

Java函数:如何实现字符串的加密和解密?

发布时间:2023-06-07 08:24:28

字符串加密和解密是一种数据安全措施,目的是将敏感信息转换成一种密文形式,以免被未经授权的人员或者非法机构窃取和查看。在Java中实现字符串的加密和解密,常用的方式有以下几种:

1. 对称加密算法

对称加密算法是最常用的加密算法之一。其特点是加密和解密使用相同的密钥。常见的对称加密算法有DES、3DES、AES等。

DES加密算法

DES是Data Encryption Standard(数据加密标准)的缩写,是一种对称加密算法,加密和解密使用相同的密钥。DES加密算法的代码如下:

public static String encryptDES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
    byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(bytes);
}

public static String decryptDES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
    byte[] bytes = Base64.getDecoder().decode(data);
    return new String(cipher.doFinal(bytes), "UTF-8");
}

private static Key generateKey(String keyStr) throws Exception {
    DESKeySpec keyspec = new DESKeySpec(keyStr.getBytes("UTF-8"));
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    return keyFactory.generateSecret(keyspec);
}

3DES加密算法

3DES是Triple Data Encryption Standard(三重数据加密标准)的缩写,是一种对称加密算法。3DES加密算法的代码如下:

public static String encrypt3DES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
    byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(bytes);
}

public static String decrypt3DES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
    byte[] bytes = Base64.getDecoder().decode(data);
    return new String(cipher.doFinal(bytes), "UTF-8");
}

private static Key generateKey(String keyStr) throws Exception {
    DESedeKeySpec keyspec = new DESedeKeySpec(keyStr.getBytes("UTF-8"));
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
    return keyFactory.generateSecret(keyspec);
}

AES加密算法

AES是Advanced Encryption Standard(高级加密标准)的缩写,是一种对称加密算法。AES加密算法的代码如下:

public static String encryptAES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));
    byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(bytes);
}

public static String decryptAES(String data, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, generateKey(key));
    byte[] bytes = Base64.getDecoder().decode(data);
    return new String(cipher.doFinal(bytes), "UTF-8");
}

private static Key generateKey(String keyStr) throws Exception {
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    byte[] keyBytes = md5.digest(keyStr.getBytes("UTF-8"));
    return new SecretKeySpec(keyBytes, "AES");
}

2. 非对称加密算法

非对称加密算法需要使用两个不同的密钥,一个用于加密,另一个用于解密。常见的非对称加密算法有RSA等。

RSA加密算法

RSA是一种非对称加密算法,使用两个密钥,一个公钥和一个私钥。公钥可以公开,私钥必须保密。RSA加密算法的代码如下:

public static String encryptRSA(String data, String publicKey) throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKey));
    byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(bytes);
}

public static String decryptRSA(String data, String privateKey) throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
    byte[] bytes = Base64.getDecoder().decode(data);
    return new String(cipher.doFinal(bytes), "UTF-8");
}

private static PublicKey getPublicKey(String publicKey) throws Exception {
    byte[] keyBytes = Base64.getDecoder().decode(publicKey);
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    return keyFactory.generatePublic(keySpec);
}

private static PrivateKey getPrivateKey(String privateKey) throws Exception {
    byte[] keyBytes = Base64.getDecoder().decode(privateKey);
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    return keyFactory.generatePrivate(keySpec);
}

3. 消息摘要算法

消息摘要算法是一种不可逆的加密算法,将原始信息通过算法转换为 的固定长度的字符串,用于校验数据完整性和防止篡改。常见的消息摘要算法包括MD5、SHA-1等。

MD5消息摘要算法

MD5是一种消息摘要算法,将原始信息通过算法转换为 的128位二进制数字。MD5算法的代码如下:

public static String md5(String data) throws Exception {
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    byte[] bytes = md5.digest(data.getBytes("UTF-8"));
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

SHA-1消息摘要算法

SHA-1是一种消息摘要算法,将原始信息通过算法转换为 的160位二进制数字。SHA-1算法的代码如下:

public static String sha1(String data) throws Exception {
    MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
    byte[] bytes = sha1.digest(data.getBytes("UTF-8"));
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
        sb.append(String.format("%02x", b));
    }
    return sb.toString();
}

总结

本文介绍了Java中常用的字符串加密和解密的算法,包括对称加密算法(DES、3DES、AES)、非对称加密算法(RSA)、消息摘要算法(MD5、SHA-1)等。在实际应用中,应根据具体情况选择合适的加密算法,对数据进行保护和防篡改,确保信息安全。