android - 解密使用 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:解密时最后一个块不完整
不知道我是否需要服务器端的其他东西,正如我所说,我对加密知之甚少。
我完全迷失在这个问题上。你能帮助我吗?
谢谢你。
解决方案
您的代码存在多个问题,并且您缺少一些关键信息(您可能会从发送数据的系统中询问)
您缺少密码、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 加密的例子,你可能在我的博客上也有一个战利品。
推荐阅读
- python-3.x - 有没有办法在不知道具体行数的情况下向列添加数据验证?
- macos - 应用因指南 3.1.2 被拒绝 - 业务 - 付款 - 订阅
- ruby-on-rails - ActiveSupport::Duration 小时/分钟/秒总是秒?
- python-3.x - 在 MacOS X 上拍照的 Imagesnap 行为不一致,具体取决于调用环境
- hibernate - 在单表继承类型中查找特定类型的元素
- c# - 在 c# 中反序列化复杂的 JSON
- python-3.x - 在 python 中重新加载模块以进行调试
- python - 如何获取列表中的最大值然后在 PYTHON 中标记它?
- asynchronous - 确定执行者何时完成所有任务
- tensorflow - 我可以从 .pb 文件中获取 Keras 模型吗?