我的加密逻辑出了什么问题?

时间:2012-01-13 15:32:40

标签: java android encryption aes

我以为我的加密类已经排序但是出现了问题。

我的客户端/服务器模型很简单。客户端连接到服务器,发送消息队列中的所有消息,然后断开连接。

发送的第一条消息绝对正常,但之后发送的任何消息都显示第一个块(字符串的前16个字符)错误。奇怪的是,所有其他的块看起来都很好,这很奇怪,因为我是CBC。

加密设置:

encryptionAlgorithm = "AES";
encryptionBitCount = 256;
encryptionMessageLength = 176;
hashingAlgorithm = "PBEWithSHA256And256BitAES-CBC-BC";
hashingCount = //some number;
cipherTransformation = "AES/CBC/PKCS7Padding";
salt = //some bytes;

我的客户逻辑如下:

  • Init cipher via:cipher.init(Cipher.ENCRYPT_MODE, cipherInitKey);
  • 连接到服务器
每条消息的

是消息队列

  • 通过以下方式生成IV并将其写入套接字:stream.write(cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV());
  • 通过以下方式生成写入密文:stream.write(cipher.doFinal(message));

结束

  • 断开

我的服务器逻辑如下:

收到的每封邮件

  • 从套接字读取IV(16字节)。
  • 通过以下方式启动密码:cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
  • 从套接字读取消息(其大小固定)。 (176bytes)
  • 通过cipher.doFinal(message)
  • 解读消息

结束

奇怪的是,它在本地与java客户端和服务器完美配合。但是,当我将服务器放在我的VPS上并拥有一个andriod客户端时,它会中断。

更新:看起来实际上我可能会在邮件开头添加一个额外的块 - 进行更多测试。

1 个答案:

答案 0 :(得分:0)

你可能会在开始时获得IV。您应该将第一个字节用作IV,然后使用密钥和给定的IV进行解密。这是一种常用技术,将在您描述时准确显示问题。您甚至可以跳过第一个输出块,只使用以下块作为纯文本(尽管这称为黑客攻击)。有一件事是肯定的:如果你的第一个块是垃圾,那么prolbem就是IV。