【问题标题】:I'm having trouble decrypting a string in java [duplicate]我在解密 java 中的字符串时遇到问题 [重复]
【发布时间】:2019-05-03 06:25:42
【问题描述】:

我在解密字符串时遇到了一些问题。我收到的错误是:

"javax.crypto.IllegalBlockSizeException: 使用填充密码解密时输入长度必须是 16 的倍数"

这是我想要达到的目标。

-用户在创建帐户时设置密码。在这种情况下,泰勒。

-这个密码管理器类将把这个字符串翻译成乱码(这是它产生的:“I^ÇÔµoü|& ÄŠóÁ”)。

-然后我将这些乱码存储在一个文本文件中。

-从那里输入密码 Taylor 后,这个存储的乱码被解密,然后与输入的字符串进行比较。如果正确,用户可以访问该应用程序。

感谢您的帮助。

作为旁注,我不确定我是否已正确初始化密钥:/ 这也是我第一次玩加密。我不确定它是真的很酷还是真的很令人沮丧。

public static void Decrypt(String encryptedText) {
    try 
    {
        //we are using the same key to decrypt the string as we used to encrypt it.
        String key = "AbCd1234aBcD4321";

        // Here we are taking the 128 bit key we just created and expanding it
        Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, aesKey);

        //decrypt the text
        byte[] encrypted = cipher.doFinal(encryptedText.getBytes());   
        String decrypted = new String(cipher.doFinal(encrypted));
        System.out.println(decrypted);

    }
    catch(Exception e) 
    {
        e.printStackTrace();
    }

【问题讨论】:

  • 嗨,尝试解密时可能会创建一个新的密码流。这是example
  • 你为什么要double解密输入? --- 顺便说一句:加密数据是 二进制,而不是文本,除非以某种方式编码为文本(十六进制、Base64、...)。
  • @James Taylor 你能分享你的加密方法吗?我认为问题在于您尝试从 encryptedText 字符串参数中获取字节的方式。这实际上取决于如何从您从密码获得的字节数组生成输出字符串。

标签: java encryption


【解决方案1】:

你的问题是这一行:

byte[] encrypted = cipher.doFinal(encryptedText.getBytes()); 

您不能将任意二进制信息转换为字符串并期望它正确转换回来。这种方式根本行不通。

UTF-8 是结构化的二进制数据,其方式与 MP3 文件相同。不是每个字节序列都会产生一个有效的 MP3 文件,也不是每个字节序列都会产生一个有效的 UTF-8 字符串。

根据定义,加密数据是二进制数据。你应该这样存储它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多