Java 什么';我的加密逻辑有什么问题?
我原以为我的加密类已分类,但出现了一个问题 我的客户机/服务器模型很简单。客户端连接到服务器,发送消息队列中的任何消息,然后断开连接 发送的第一条消息是绝对正确的,但此后发送的任何消息都表明第一个块(字符串的前16个字符)是错误的。奇怪的是,所有其他的街区看起来都很好,这很奇怪,因为我是CBC 加密设置:Java 什么';我的加密逻辑有什么问题?,java,android,encryption,aes,Java,Android,Encryption,Aes,我原以为我的加密类已分类,但出现了一个问题 我的客户机/服务器模型很简单。客户端连接到服务器,发送消息队列中的任何消息,然后断开连接 发送的第一条消息是绝对正确的,但此后发送的任何消息都表明第一个块(字符串的前16个字符)是错误的。奇怪的是,所有其他的街区看起来都很好,这很奇怪,因为我是CBC 加密设置: encryptionAlgorithm = "AES"; encryptionBitCount = 256; encryptionMessageLength = 176; hashingAlg
encryptionAlgorithm = "AES";
encryptionBitCount = 256;
encryptionMessageLength = 176;
hashingAlgorithm = "PBEWithSHA256And256BitAES-CBC-BC";
hashingCount = //some number;
cipherTransformation = "AES/CBC/PKCS7Padding";
salt = //some bytes;
我的客户端逻辑如下所示:
- 初始化密码通过:
cipher.Init(cipher.ENCRYPT_模式,cipherInitKey)代码>
- 连接到服务器
- 通过以下方式生成IV并将其写入套接字:
stream.write(cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV())代码>
- 通过:
stream.write(cipher.doFinal(message)),生成对套接字的写密文代码>
- 断开
- 从套接字读取IV(16字节)
- 通过以下方式初始化密码:
cipher.Init(cipher.DECRYPT_模式,密钥,新的IvParameterSpec(iv))代码>
- 从套接字读取消息(大小固定)。(176字节)
- 通过
cipher.doFinal(消息)
更新:事实上,我可能在消息开始时收到了一个额外的块-进行更多的测试。您可能在消息开始时收到了IV。您应该使用第一个字节作为IV,然后使用密钥和给定的IV进行解密。这是一种常见的技术,它将准确地显示您描述的问题。您甚至可以跳过第一个输出块,只需将以下块作为纯文本使用(尽管这称为hacking)。有一点是肯定的:如果您的第一个块是垃圾,那么prolbem就是IV。您是以字符串还是字节数组的形式发送消息?如果是字符串,可能是编码问题?我以字节数组的形式发送。两边都用UTF-8编码和解码。事实上,可能是我在开始时得到了一个额外的块。IV是问题所在。我犯了一个很愚蠢的错误,把信息的长度弄错了。所以从第二次读取开始,我读取的IV实际上是前一条消息的16个字节的结尾。