【问题标题】:AES decryption is always nullAES 解密始终为空
【发布时间】:2012-11-10 22:38:33
【问题描述】:

我尝试使用 salt 来解密 AES 加密消息,但它总是返回 null 值。谁能看看我哪里做错了?

public static String decryptMessage(String encryptedMessage, String salt) {

  String decryptedMessage = null;
  String valueToDecrypt = encryptedMessage;
  try {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);


    for (int i = 0; i < ITERATIONS; i++) {
      byte[] decodedValue = Base64.decodeBase64(valueToDecrypt);
      byte[] decVal = c.doFinal(decodedValue);
      decryptedMessage = new String(decVal).substring(salt.length());
      valueToDecrypt = decryptedMessage;
    }


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

  }
  return decryptedMessage;
}

**EDIT:**

这是我认为有效的相应加密方法。

private static final String ALGORITHM = "AES";
    private static final int ITERATIONS = 5;
    private static final byte[] keyValue = new byte[] { '1', '2', '3', '4',
            '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' };


    public static String encryptMessage(String message, String salt) {
        String encMessage = null;
        byte[] encVal = null;
        String messageWithSalt = null;
        try {
            Key key = generateKey();

            Cipher c = Cipher.getInstance(ALGORITHM);
            c.init(Cipher.ENCRYPT_MODE, key);

            for (int i = 0; i < ITERATIONS; i++) {
                messageWithSalt = salt + encMessage;
                encVal = c.doFinal(messageWithSalt.getBytes());
                byte[] encryptedValue = new Base64().encode(encVal);
                encMessage = new String(encryptedValue);
            }

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

        }
        return encMessage;
    }

PS:迭代不是 0;

【问题讨论】:

  • 您忘记发布相应的加密代码了。
  • @Leigh 好吧,有了catch 语句,您可以假设它也会在任何解密错误时返回 null :) 说真的,每一行都至少有一个错误,可能除了 @ 987654326@ 方法,我想当我们知道ALGORITHM 的值时我们就会知道。

标签: java cryptography aes salt


【解决方案1】:

我认为您的方法可能长期被破坏或命名错误。您每次解密时都会生成一个密钥,而您应该有一个与用于加密的密钥匹配的预先存在的密钥。

您还传递了一个“盐”值 - 注意:这是一个通常为散列保留的术语 - 然后您完全忽略它,除了使用大小作为结果的截断长度。

当然,我在上面看到的并不是以合理的方式解密任何东西。如果您可以准确描述您想要实现的目标,我们可能会更正代码或向您指出执行该任务的同行评审方法(可能已经在标准库中实现)。

【讨论】:

    【解决方案2】:

    好吧,我发现了错误。它在加密方法中。在加密过程开始之前,encMessagenullString encMessage = message 成功了。所以加密方式是:

     public static String encryptMessage(String message, String salt) {
                String encMessage = message;
                byte[] encVal = null;
                String messageWithSalt = null;
                try {
                    Key key = generateKey();
    
                    Cipher c = Cipher.getInstance(ALGORITHM);
                    c.init(Cipher.ENCRYPT_MODE, key);
    
                    for (int i = 0; i < ITERATIONS; i++) {
                        messageWithSalt = salt + encMessage;
                        encVal = c.doFinal(messageWithSalt.getBytes());
                        byte[] encryptedValue = new Base64().encode(encVal);
                        encMessage = new String(encryptedValue);
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
    
                }
                return encMessage;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多