加密算法在生活中有很多的应用,以下时一些常用的使用场景。

  1. 网络安全:在互联网上,加密算法被广泛应用于保护网络通信的安全,比如HTTPS协议和SSL/TLS加密。
  2. 数据库安全:对于一些敏感数据,比如用户密码、信用卡号等,需要使用加密算法进行存储和传输,以防止被非法获取。
  3. 身份验证:在身份验证中,加密算法可以用于生成和验证数字签名,以确保身份验证的真实性和完整性。
  4. 数字版权保护:数字版权保护也是加密算法的一个重要应用领域,比如数字音乐、电影、软件等。

最近在做一个东西时需要简单的对经纬度信息进行加密,刚好了解了下AES加密算法。

介绍

AES(Advanced Encryption Standard)是一种常用的对称加密算法。它是由比利时密码学家Joan Daemen和Vincent Rijmen设计的,被选为美国联邦政府采用的新标准加密算法,可用于保护敏感数据的机密性,是当前被广泛应用的加密标准之一。

AES算法有三种不同的加密密钥长度:128位、192位和256位。也就是说,它能够以128位、192位和256位三种密钥长度来生成密钥。其加密步骤如下:

  1. 明文分组:将明文分成固定长度(16字节),不足16字节的使用填充算法处理。
  2. 密钥扩展:根据密钥长度不同,执行10/12/14次轮密钥扩展,生成轮密钥。
  3. 轮加密:每轮将明文进行逐字节替换、逐字节位移和逐列运算,由密钥扩展算法得到的轮密钥作为每轮运算的密钥。
  4. 输出密文:最后一个轮加密后的结果即为密文。

AES加密算法的优势在于加密效率高、安全性强、规范性明确,支持软件和硬件实现,应用广泛。

使用

如下是简单的加解密,举例是对经纬度信息进行加解密操作。

密钥

由于在AES加密解密操作中,需要提供密钥,这里假设密钥如下。

1
private static final String SECRET_KEY = "2023041812008888"; // 密钥,必须为16、24或32位

加密

1
2
3
4
5
6
7
8
public static String encrypt(double latitude, double longitude) throws Exception {
String input = String.format("%.6f,%.6f", latitude, longitude); // 将经纬度格式化为字符串
SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(input.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes); // 返回Base64编码后的结果
}

这里第一个参数代表经度,第二个参数代表纬度,通过首先将经纬度转化成字符串,然后使用Base64编码将加密后的字节数组转换为字符串。

解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static double[] decrypt(String ciphertext) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
String plaintext = new String(decryptedBytes, StandardCharsets.UTF_8);
String[] parts = plaintext.split(",");
if (parts.length != 2) {
throw new IllegalArgumentException("Invalid ciphertext");
}
double latitude = Double.parseDouble(parts[0]);
double longitude = Double.parseDouble(parts[1]);
return new double[]{latitude, longitude};
}

这里函数的参数是密文,只有正确的密文使用正确的密钥才能够解密出来。

操作

我们可以创建一个类CoordinateEncryption类来存储上述两个方法。通过如下内容参考使用上述算法。

1
2
3
4
5
6
7
double latitude = 31.231740;
double longitude = 121.472678;
System.out.println("加密前的坐标:[" + latitude + ", " + longitude + "]");
String ciphertext = CoordinateEncryption.encrypt(latitude, longitude);
System.out.println("加密后的坐标:" + ciphertext);
double[] decryptedCoordinate = CoordinateEncryption.decrypt(ciphertext);
System.out.println("解密后的坐标:[" + decryptedCoordinate[0] + ", " + decryptedCoordinate[1] + "]");

根据上述运行,我们可以发现运行结果如下。

运行结果