JAVA解密错误:需要输入为16的倍数

时间:2012-02-28 03:20:56

标签: java encryption key-generator

我正在尝试开发一个简单的加密/解密程序。我遇到的问题是当我尝试解密加密的消息时,我收到一条错误消息,指出当使用密码解密时,输入长度必须是16的倍数。我在某处读到加密消息可能需要在将其转换为字符串之前进行编码。我不知道怎么做?或者,如果有其他方式可以请某人帮助我吗?

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;


public class Cryption {
    public static void cryption(String[] args, String message) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
        byte[] encodedKey = "ADBSJHJS12547896".getBytes();
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        Key aesKey = keyGen.generateKey();

        System.out.println("CheckType: "+ Global.checkType);
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] input = Global.message.getBytes();

        // Check if clicked Encrypted
        if(Global.checkType==true) {
            // Encrypt
            byte[] messageEncrypted = cipher.doFinal(input);
            System.out.println("Encrypted Text: " + messageEncrypted);
            Global.encValue = messageEncrypted.toString();
        }

        // Check if clicked Decrypted
        if(Global.checkType==false) {
            //String mes = message;
            System.out.println(Global.message);
            System.out.println("Char lenght " + Global.message.length());
            byte[] mesByte = Global.message.getBytes();


            // Decrypt
            cipher.init(Cipher.DECRYPT_MODE, aesKey);
            byte[] messageDecrypted = cipher.doFinal(mesByte);
            System.out.println("Text Decrypted: " + new String(messageDecrypted));
        }
    }

}

2 个答案:

答案 0 :(得分:1)

Global.encValue = messageEncrypted.toString();

这是完全错误的,因为它只调用了byte []。toString(),它没有给你内容,只是一个带有类名和哈希码的东西。它在语义上也是错误的,因为String首先不是二进制数据的容器。不要将加密文本转换为字符串。使用API​​为您提供的byte []数组。

答案 1 :(得分:0)

查看http://docs.oracle.com/javase/tutorial/i18n/text/string.html

这可能意味着它不知道它是ASCII还是UTF8或其他字节编码......