📜  什么是Java AES 加密和解密?

📅  最后修改于: 2022-05-13 01:55:40.826000             🧑  作者: Mango

什么是Java AES 加密和解密?

Java作为一种编程语言在技术领域引入了一种新方法。 Java在用于编码的技术中位居榜首。 Java应用程序设计公司可以做任何事情,从综合商业软件到移动电话和无线设备的应用程序。无所不在的此软件支持始终通过功能方法嵌入,并已合并到常见的 Internet 浏览器中。这意味着加密和解码都使用类似的密钥。 (AES)是一种普遍使用的密钥加密计算。

以多种方式保护数据传输。但大多数专家认为数据加密是最好的方法,目前, Java AES 是一种可用于加密的高级解决方案。新算法正在将 DES 的旧值替换为 AES。它在机密属性、数据身份验证和高度完整性方面拥有更好的遗产。

让我们开始破解解密以及使用单个密钥进行加密。与其他保护敏感信息的方法相比,这是一个巨大的优势。它是需要保护敏感信息的政府机构和金融机构的最佳解决方案。

对称加密标准的普及

随着网络安全问题的出现,使用 AES 作为高级方法成为最佳选择,因为它具有 3 块密码。他们可以使用加密密钥对 128 位块进行加扰。发送方和接收方都拥有相同的密钥,以保持信息的机密性。这使其成为一种灵活且安全的工具。它在固定的块模式或使用数据位的流模式下工作。目前,这些应用程序普遍用于电子邮件通信、TLS 以及即时消息传递。



为 AES 选择正确的填充方案

在分组密码模式下,将明文转换为分组大小进行加密。这里需要填充, Java提供了 3 种替代方法。对于编码,AES 算法本质上是重复的,支持 128、192 和 256 位。

它的功能类似于以下模式。

使用 Java-AES 创建加密和解密

  1. 电子码本
  2. 密码阻塞链
  3. 密码反馈
  4. 输出反馈
  5. 柜台
  6. 伽罗华/计数器模式

需要选择密钥才能使应用程序面向未来。

Java
// Java program to demonstrate the creation
// of Encryption and Decryption with Java AES
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
  
class AES {
    // Class private variables
    private static final String SECRET_KEY
        = "my_super_secret_key_ho_ho_ho";
    
    private static final String SALT = "ssshhhhhhhhhhh!!!!";
  
    // This method use to encrypt to string
    public static String encrypt(String strToEncrypt)
    {
        try {
  
            // Create default byte array
            byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0 };
            IvParameterSpec ivspec
                = new IvParameterSpec(iv);
  
            // Create SecretKeyFactory object
            SecretKeyFactory factory
                = SecretKeyFactory.getInstance(
                    "PBKDF2WithHmacSHA256");
            
            // Create KeySpec object and assign with
            // constructor
            KeySpec spec = new PBEKeySpec(
                SECRET_KEY.toCharArray(), SALT.getBytes(),
                65536, 256);
            SecretKey tmp = factory.generateSecret(spec);
            SecretKeySpec secretKey = new SecretKeySpec(
                tmp.getEncoded(), "AES");
  
            Cipher cipher = Cipher.getInstance(
                "AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey,
                        ivspec);
            // Return encrypted string
            return Base64.getEncoder().encodeToString(
                cipher.doFinal(strToEncrypt.getBytes(
                    StandardCharsets.UTF_8)));
        }
        catch (Exception e) {
            System.out.println("Error while encrypting: "
                               + e.toString());
        }
        return null;
    }
  
    // This method use to decrypt to string
    public static String decrypt(String strToDecrypt)
    {
        try {
  
            // Default byte array
            byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0 };
            // Create IvParameterSpec object and assign with
            // constructor
            IvParameterSpec ivspec
                = new IvParameterSpec(iv);
  
            // Create SecretKeyFactory Object
            SecretKeyFactory factory
                = SecretKeyFactory.getInstance(
                    "PBKDF2WithHmacSHA256");
  
            // Create KeySpec object and assign with
            // constructor
            KeySpec spec = new PBEKeySpec(
                SECRET_KEY.toCharArray(), SALT.getBytes(),
                65536, 256);
            SecretKey tmp = factory.generateSecret(spec);
            SecretKeySpec secretKey = new SecretKeySpec(
                tmp.getEncoded(), "AES");
  
            Cipher cipher = Cipher.getInstance(
                "AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, secretKey,
                        ivspec);
            // Return decrypted string
            return new String(cipher.doFinal(
                Base64.getDecoder().decode(strToDecrypt)));
        }
        catch (Exception e) {
            System.out.println("Error while decrypting: "
                               + e.toString());
        }
        return null;
    }
}
  
// driver code
public class Main {
    public static void main(String[] args)
    {
        // Create String variables
        String originalString = "GeeksforGeeks";
        
        // Call encryption method
        String encryptedString
            = AES.encrypt(originalString);
        
        // Call decryption method
        String decryptedString
            = AES.decrypt(encryptedString);
  
        // Print all strings
        System.out.println(originalString);
        System.out.println(encryptedString);
        System.out.println(decryptedString);
    }
}


输出
GeeksforGeeks
LuBu3DTLx7SLfjfhbjl7lw==
GeeksforGeeks

如果块没有适当的填充,则系统会显示密码错误。在允许Java AES 工作之前进行安全测试也很重要。 AES 使用输入数据、密钥和 IV.IV。密钥通过随机数生成或由密码驱动。对于安全最佳实践,该系统效果最佳。了解 AES 256 加密以对敏感数据使用数学代码非常重要。

AES的优势

  • 它允许数据保持安全,直到它被秘密密钥泄露。
  • 许多企业现在可以使用它来防止黑客扰乱信息。
  • 对于需要以牢不可破的格式广告同时安全传输数据的机构来说,这是最灵活和可行的选择。

最早的AES被美国国家安全局批准使用。事实证明,它的速度与发送方和接收方的相同密钥以及它的长度是最有用的。分组密码仍然是替代置换组合的明星执行者。它还具有需要多次修改的圆形密钥的额外安全性。每个阶段/级别的加密都执行一项重要函数。更长的键和更多的回合确保高性能。