我以为我的加密类已经排序但是出现了问题。
我的客户端/服务器模型很简单。客户端连接到服务器,发送消息队列中的所有消息,然后断开连接。
发送的第一条消息绝对正常,但之后发送的任何消息都显示第一个块(字符串的前16个字符)错误。奇怪的是,所有其他的块看起来都很好,这很奇怪,因为我是CBC。
加密设置:
encryptionAlgorithm = "AES";
encryptionBitCount = 256;
encryptionMessageLength = 176;
hashingAlgorithm = "PBEWithSHA256And256BitAES-CBC-BC";
hashingCount = //some number;
cipherTransformation = "AES/CBC/PKCS7Padding";
salt = //some bytes;
我的客户逻辑如下:
cipher.init(Cipher.ENCRYPT_MODE, cipherInitKey);
是消息队列
stream.write(cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV());
stream.write(cipher.doFinal(message));
结束
我的服务器逻辑如下:
收到的每封邮件
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
cipher.doFinal(message)
结束
奇怪的是,它在本地与java客户端和服务器完美配合。但是,当我将服务器放在我的VPS上并拥有一个andriod客户端时,它会中断。
更新:看起来实际上我可能会在邮件开头添加一个额外的块 - 进行更多测试。
答案 0 :(得分:0)
你可能会在开始时获得IV。您应该将第一个字节用作IV,然后使用密钥和给定的IV进行解密。这是一种常用技术,将在您描述时准确显示问题。您甚至可以跳过第一个输出块,只使用以下块作为纯文本(尽管这称为黑客攻击)。有一件事是肯定的:如果你的第一个块是垃圾,那么prolbem就是IV。