Java UTF-8编码/解码仅显示第一个单词

时间:2016-02-16 21:25:01

标签: java encryption encoding utf-8 aes

我有一个快速的问题,希望可以快速解决。

我目前有一个客户端/服务器程序从客户端获取输入,使用UTF-8将其编码为字节数组,使用AES加密数组,将其发送到服务器,并反转解密过程。

唯一的问题是,如果消息中有空格,则只会在第一个空格之前显示该字作为解密消息。

E.G:

  

输入:你好我是汤姆

     

输出:你好

     

但如果我的输入只是一个单词,它就会完美解密

     

输入:HelloIamTom

     

输出:HelloIamTom

我无法在任何地方找到相关信息!

任何帮助将不胜感激,

客户代码

 System.out.println("Please type a message to be encrypted:");
       message = scanner.next();


     //create iv array
     byte[] iv = toByteArray("a11f001ed2dec0de6e6f6e73656e7365");

     Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
     SecretKey key = new SecretKeySpec(decryptedKey, "AES");
     IvParameterSpec ivParSpec = new IvParameterSpec(iv);
     aesCipher.init(Cipher.ENCRYPT_MODE, key, ivParSpec);
     byte[] encryptedMessage = aesCipher.doFinal(message.getBytes("UTF-8"));


     dos.writeInt(encryptedMessage.length);
     dos.write(encryptedMessage);

服务器代码

  int length = dis.readInt();//recieve length of byte array for incoming message
        byte[] encryptedMessage = new byte[length];//create a byte array to the length recieved
        dis.readFully(encryptedMessage);//fill the byte array with incoming data

        //decrypt using AES

        Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");//create a cipher with correct parameters
        IvParameterSpec ivParaSpec = new IvParameterSpec(iv);//create IvParameter spec using IV provided in assignment brief

        aesCipher.init(Cipher.DECRYPT_MODE,key,ivParaSpec);//initialise the Cipher in DECRYPT mode
        byte[] decryptedMessage = aesCipher.doFinal(encryptedMessage);//create decryptedMessage and put in byte array

        String decMess = new String(decryptedMessage,"UTF-8");

        System.out.println("User ID:");
        System.out.println(uid);

        System.out.println("Decrypted Message:");
        System.out.println(decMess);

2 个答案:

答案 0 :(得分:2)

请参阅Scanner

  

扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。

Scanner#next()

  

查找并返回此扫描仪的下一个完整令牌。在完成令牌之前和之后是与分隔符模式匹配的输入。即使先前调用 self.player = AVPlayer(URL: NSURL(fileURLWithPath: path!)) self.playerLayer = AVPlayerLayer(player: player); self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.playerLayer.frame = ctrVideo.bounds; self.ctrVideo.layer.addSublayer(playerLayer); player.play(); 返回hasNext(),此方法也可能在等待扫描输入时阻塞。

如果要扫描孔线,修改后的客户端代码为:

true

答案 1 :(得分:0)

你在做message = scanner.next();。而不应该这样做,你应该message = scanner.nextLine();做完整行作为输入。