netty streamcorruptedexception在keyexchange之后

9o685dep  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(352)

我试图建立一个加密网络连接使用aes。rsa正在帮助我传输aes密钥和iv。
服务器和客户机具有相同的密钥和交换后的iv。我正在创建密码,用它来解密东西。当我在eclipse中用cp1252编码在我的pc上运行服务器时,它工作得很好。一旦我把编码改成utf-8(我的客户机是用这种编码编写的)或者在我的linux系统上运行服务器,它就不再工作了。
我看到我可以用密码取静脉注射 cipher.getIV(); 不幸的是,他们不一样,所以这可能是问题所在。
异常(客户端)
服务器输出
如您所见,aes密钥和iv是相同的。
我就是这样生成密码的

public static Cipher generateCipher(byte[] secret, int mode, byte[] iv) {
        KeySpec spec = new PBEKeySpec(new String(secret).toCharArray(), iv, 65536, 128);
        try {
            byte[] key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec).getEncoded();
            SecretKeySpec secretKey = new SecretKeySpec(key, "AES");

            Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
            IvParameterSpec parameterSpec = new IvParameterSpec(secretKey.getEncoded());

            cipher.init(mode, secretKey, parameterSpec);
            return cipher;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

这就是我打印字符串的方式

byte[] aesKey = CryptionUtils.decryptRSA(packet.getKey(), rsaKeys.getPrivate());
byte[] iv = CryptionUtils.decryptRSA(packet.getIv(), rsaKeys.getPrivate());

if (iv.length != 12 || aesKey.length != 16) {
        server.sendPacket(ip, new KickPacket(EnumKickPacket.INVALID_AES_INFO.ordinal()));
        server.disconnectClient(ip, EnumKickPacket.INVALID_AES_INFO.name());
}

Cipher decryptCipher = CryptionUtils.generateCipher(aesKey, Cipher.DECRYPT_MODE, iv);
Cipher encryptCipher = CryptionUtils.generateCipher(aesKey, Cipher.ENCRYPT_MODE, iv);

System.out.println("IV: " + Base64.getEncoder().encodeToString(iv));
System.out.println("AESKey: " + Base64.getEncoder().encodeToString(aesKey));
System.out.println("DecryptCipher: " + Base64.getEncoder().encodeToString(decryptCipher.getIV()));
System.out.println("EncryptCipher: " + Base64.getEncoder().encodeToString(encryptCipher.getIV()));
4sup72z8

4sup72z81#

new String(secret, Charset.forName("UTF-8") 解决了这个问题。

相关问题