解密使用AES 256编码的字符串

时间:2018-10-24 13:14:39

标签: android encryption aes

这里完全是安全菜鸟。

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

根据我在这里和其他地方所读的内容,我得到了:

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:密钥长度不是128/192/256位。

我也尝试过this库,但它返回IllegalBlockSizeException:解密中的最后一个块不完整

不知道我是否还需要服务器端的其他功能,因为我说过我几乎不了解加密。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

  

密码c = Cipher.getInstance(“ AES”);

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

如果使用的模式需要IV(初始化向量),则需要知道其值。通常,IV是密文前面的128位(16字节),但是您需要确定这一点。

  

细盐=“ PRUEBA”;
  SecretKeySpec键=新的SecretKeySpec(salt.getBytes(),“ AES”);

然后-您需要一个密钥(没有密钥,您将不会解密)。

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

  

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

您确定解密后的值是另一个String的base64编码吗?

仅仅为了获取Java加密的一些示例,您在我的blog上也会受到掠夺。