首页 > 解决方案 > 解密使用 AES 256 编码的字符串

问题描述

这里完全是安全菜鸟。

我必须解密我收到的字符串,用 Base64 编码。我所拥有的只是我需要解密的字符串和一个字符串,向我发送要解码的字符串的服务将其称为种子。

根据我在这里和其他地方读到的内容,我有这个:

public String decrypt(String message) throws Exception
{
    String salt = "PRUEBA";
    Cipher c = Cipher.getInstance("AES");
    SecretKeySpec key = new SecretKeySpec(salt.getBytes(), "AES");
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = Base64.decode(message.getBytes(), Base64.DEFAULT);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    String decoded=new String(Base64.decode(decryptedValue,Base64.DEFAULT));
    return decoded;
}

这将返回 java.security.InvalidKeyException: Key length not 128/192/256 bits。

我也试过这个库,但它返回 IllegalBlockSizeException:解密时最后一个块不完整

不知道我是否需要服务器端的其他东西,正如我所说,我对加密知之甚少。

我完全迷失在这个问题上。你能帮助我吗?

谢谢你。

标签: androidencryptionaes

解决方案


您的代码存在多个问题,并且您缺少一些关键信息(您可能会从发送数据的系统中询问)

您缺少密码、IV(可选)和密钥

密码 c = Cipher.getInstance("AES");

AES使用没有 IV 参数的密码意味着您正在使用AES/ECB/PKCS5Padding密码。您确定要使用此密码吗?不应该AES/CBC/PKCS5Padding吗?询问系统进行加密应该是什么加密(包括模式和填充)。知道它的 AES 可能还不够。

如果使用的模式需要IV(初始化向量),你需要知道它的值。通常 IV 是 128 位(16 字节)附加到密文中,但您需要确定这一点。

字符串盐=“PRUEBA”;
SecretKeySpec key = new SecretKeySpec(salt.getBytes(), "AES");

而且 -你需要一个密钥(没有你不会解密的密钥)。

如前所述,密钥长度必须为 128、192 或 256 位(=16、24 或 32 字节)。如果要从另一个字符串生成,您需要知道如何。

字符串解密值 = 新字符串(decValue);
字符串解码=新字符串(Base64.decode(decryptedValue,Base64.DEFAULT));

你确定解密后的值是另一个字符串的base64编码吗?

只是为了获得一些 Java 加密的例子,你可能在我的博客上也有一个战利品。


推荐阅读