加密算法在生活中有很多的应用,以下时一些常用的使用场景。
- 网络安全:在互联网上,加密算法被广泛应用于保护网络通信的安全,比如HTTPS协议和SSL/TLS加密。
- 数据库安全:对于一些敏感数据,比如用户密码、信用卡号等,需要使用加密算法进行存储和传输,以防止被非法获取。
- 身份验证:在身份验证中,加密算法可以用于生成和验证数字签名,以确保身份验证的真实性和完整性。
- 数字版权保护:数字版权保护也是加密算法的一个重要应用领域,比如数字音乐、电影、软件等。
最近在做一个东西时需要简单的对经纬度信息进行加密,刚好了解了下AES加密算法。
介绍
AES(Advanced Encryption Standard)是一种常用的对称加密算法。它是由比利时密码学家Joan Daemen和Vincent Rijmen设计的,被选为美国联邦政府采用的新标准加密算法,可用于保护敏感数据的机密性,是当前被广泛应用的加密标准之一。
AES算法有三种不同的加密密钥长度:128位、192位和256位。也就是说,它能够以128位、192位和256位三种密钥长度来生成密钥。其加密步骤如下:
- 明文分组:将明文分成固定长度(16字节),不足16字节的使用填充算法处理。
- 密钥扩展:根据密钥长度不同,执行10/12/14次轮密钥扩展,生成轮密钥。
- 轮加密:每轮将明文进行逐字节替换、逐字节位移和逐列运算,由密钥扩展算法得到的轮密钥作为每轮运算的密钥。
- 输出密文:最后一个轮加密后的结果即为密文。
AES加密算法的优势在于加密效率高、安全性强、规范性明确,支持软件和硬件实现,应用广泛。
使用
如下是简单的加解密,举例是对经纬度信息进行加解密操作。
密钥
由于在AES加密解密操作中,需要提供密钥,这里假设密钥如下。
1
| private static final String SECRET_KEY = "2023041812008888";
|
加密
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编码将加密后的字节数组转换为字符串。
解密
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] + "]");
|
根据上述运行,我们可以发现运行结果如下。