【问题标题】:Java AES 128 ECB to AES 256 ECB conversionJava AES 128 ECB 到 AES 256 ECB 转换
【发布时间】:2021-04-05 13:09:59
【问题描述】:

我在 ECB 模式下将 AES 128 位加密升级到 AES 256 时遇到问题。但我无法找到任何解决方案。大多数解决方案都适用于 AES 256 CBC 模式。非常感谢任何帮助。

我得到的异常是由于填充错误

PS:我知道 AES 中 ECB 模式的漏洞,但这是我目前需要实现的。

import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.GeneralSecurityException;

public class Decrypt {
    public static String decryptPayload(String payload) throws Exception {
        byte[] keyBytes = {
                0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x43, 0x53, 0x75, 0x63, 0x72, 0x65, 0x44, 0x4b, 0x55, 0x79
        };
        try {
            payload = payload.replace(' ', '+');
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            final SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(cipher.doFinal(
                    Base64.decodeBase64(payload)));
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        return null;
    }
}

我尝试的AES 256 ECB的实现如下:

    public static String decrypt(String strToDecrypt, String secretKey) {
        try
        {
            IvParameterSpec ivspec = new IvParameterSpec(iv);

            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
            KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
            SecretKey tmp = factory.generateSecret(spec);
            SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");

            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
            return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
        }
        catch (Exception e) {
            System.out.println("Error while decrypting: " + e.toString());
        }
        return null;
    }

【问题讨论】:

  • 您遇到了什么问题?
  • @njzk2 用我为 AES 256 ECB 尝试的实现更新了帖子
  • 很好,但是实现的结果是什么?你有什么例外?
  • @njzk2 BadPaddingException 是我在使用 AES 256 ECB 解密时得到的
  • 它是如何编码的/你如何确定编码是正确的?

标签: java cryptography aes


【解决方案1】:

感谢@MichaelFehr,为我提供了整个解决方案

public void tester() {
        System.out.println("Program starts");
        String key = "5u7x!A%D*G-KaPdSgVkYp3s6v9y/B?E(";
        String payload = "Test string to test AES 256 ECB";
        String encrypted = "";
        String decrypted = "";
        // Encryption
        try{
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            final SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            final String encryptedString = Base64.encodeBase64String(cipher.doFinal(payload.getBytes()));
            System.out.println("The encrypted string is\n"+encryptedString);
            encrypted = encryptedString;
        }
        catch(Exception e){
            e.printStackTrace();
        }


        // Decryption
        try
        {
            decrypted = encrypted.replace(' ', '+');
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            final SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            final String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(encrypted)));
            System.out.println("The decrypted string is\n"+decryptedString);
            decrypted=decryptedString;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

【讨论】:

  • 您现在应该可以接受自己的答案了。它不会给你任何荣誉,但它表明你的问题已经解决给其他人(所以迈克尔、我和其他人可以把时间花在其他问题上)。
  • key.getBytes() 密钥应该由随机字节组成,而不是字符串。从这个意义上说,使用 PBKDF2 从密码中派生密钥 是正确的方法。基本上你削弱了加密协议以避免这里的实现错误(但如果你在 2021 年仍然使用 ECB 模式来加密文本,我猜你已经输掉了这场战斗;改用经过身份验证的 GCM 模式)。就密码学而言,“调整”直到它工作为止并不是一个好主意:目标是让它安全,而不是让它工作。
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 2017-12-26
  • 2018-10-04
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多