【问题标题】:Java AES security implementationJava AES 安全实现
【发布时间】:2016-04-16 04:37:41
【问题描述】:

我想加密一个字符串以固定长度的整数,我如何在 Java 中做到这一点。 尝试实现 AES 算法,但 out 是特殊字符而不是数字。

          String text = "Test TEST";         
          String key = "deadbeefbeefdead"; // 128 bit key
         // Create key and cipher
         Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
         Cipher cipher = Cipher.getInstance("AES");
         // encrypt the text
         cipher.init(Cipher.ENCRYPT_MODE, aesKey);
         byte[] encrypted = cipher..doFinal(text.getBytes());
         System.err.println(new String(encrypted));
         // decrypt the text
         cipher.init(Cipher.DECRYPT_MODE, aesKey);
         String decrypted = new String(cipher.doFinal(encrypted));
         System.err.println(decrypted

);

【问题讨论】:

    标签: java security spring-security


    【解决方案1】:

    问题不清楚,但这里有一些信息:

    1. 加密生成一个 8 位字节序列,而不是字符,并非所有 8 位字节都是可打印字符,甚至在大多数编码中都是字符。通常,如果您需要可打印的字符串,则加密数据是 Base64 或十六进制编码的。每个加密字节都可以被认为是一个 uint8_t “整数”。

    2. AES 是一种分组密码,它采用 16 字节块并输出 16 字节块。如果输入不是块大小的倍数,则必须在加密之前将填充(额外字节)添加到输入中。 “Bhaumik Patel”是 13 个字节,因此必须在加密前添加 3 个字节,并在解密后删除。大多数块加密库都包含填充选项,通常是 PKCS#7 (PKCS#5),但偶尔会出现空填充。

    3. 还有一种模式,最常见的是 ECB(不安全)和 CBC。在 CBC 的情况下,还有一个块大小的 iv(初始化向量),通常是随机的字节序列。

    不幸的是,单独的加密通常只是安全解决方案的一部分

    编辑:问题文本输入已从“Bhaumik Patel”更改为““Test TEST”。

    【讨论】:

    • 嗨 Zaph,谢谢你的重播,根据我的要求,我需要一个数字,所以我使用 AES 加密并转换为十六进制,从十六进制到数字,但数字太大,比如 39 位, 直到 156 位。有什么办法可以减少它,这样它就可以减少我想要的数量。提前谢谢你的帮助!!!
    • 加密不会减少位数,因为你需要使用压缩算法,如zip。如果输入
    • 加密成<.>
    • 最大字符串限制为 20 个字符,160 位。将文本加密为
    • 那么您将无法将加密数据放入 64 位整数中。您需要能够将未加密的数据放入 8 个字节中。
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2011-08-08
    相关资源
    最近更新 更多