Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JCA和JCE加密和解密Java中的文本块_Java_Jakarta Ee_Encryption_Jce - Fatal编程技术网

用JCA和JCE加密和解密Java中的文本块

用JCA和JCE加密和解密Java中的文本块,java,jakarta-ee,encryption,jce,Java,Jakarta Ee,Encryption,Jce,我正在尝试编写一个简单的应用程序,以便使用Java中的JCA和JCE对文本块进行加密和解密 到目前为止,加密部分工作正常,但解密时会出现以下异常: 这是我初始化两个密码的部分,encCipher和decCipher PBEKeySpec pbeKeySpec; PBEParameterSpec paramSpec; SecretKeyFactory keyFac; byte[] salt = {(byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,

我正在尝试编写一个简单的应用程序,以便使用Java中的JCA和JCE对文本块进行加密和解密

到目前为止,加密部分工作正常,但解密时会出现以下异常:

这是我初始化两个密码的部分,encCipher和decCipher

PBEKeySpec pbeKeySpec;
PBEParameterSpec paramSpec;
SecretKeyFactory keyFac;
byte[] salt = {(byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
               (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99};
int count = 20;
paramSpec = new PBEParameterSpec(salt, count);

try {
    pbeKeySpec = new PBEKeySpec("my_password".toCharArray(), salt, count);
    SecretKey secretKey = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(pbeKeySpec);

    encCipher = Cipher.getInstance(secretKey.getAlgorithm());
    encCipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
    decCipher = Cipher.getInstance(secretKey.getAlgorithm());
    decCipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);

} catch (Exception ex) {
    ex.printStackTrace();
 }
我没有使用Java加密体系结构的经验,我想知道如何修复错误

此异常发生在LoadClient中带有decCipher.doFinal的行

private void saveClients() {
   String plainText = "";
   String encText = "";
   Set<String> clients = my_clients.keySet();
        try {
            PrintWriter out = new PrintWriter(new File(output_file));
            for (String client : clients) {
                long client_time = my_clients.get(client);
                plainText = client + " " + client_time;

                encText = new String(encCipher.doFinal(plainText.getBytes()));
                out.println(encText);
            }
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void loadClients() {
        BufferedReader in;
        String line;
        try {
            in = new BufferedReader(new FileReader(output_file));
            while ((line = in.readLine()) != null) {
                byte[] decBytes = decCipher.doFinal(line.getBytes());
                String decText = new String(decBytes);
                String[] client_data = decText.split("[ ]");
                my_clients.put(client_data[0], Long.parseLong(client_data[1]));
            }
            in.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
     }
private void saveClients(){
字符串纯文本=”;
字符串encText=“”;
Set clients=my_clients.keySet();
试一试{
PrintWriter out=新的PrintWriter(新文件(输出文件));
用于(字符串客户端:客户端){
long client\u time=my\u clients.get(client);
明文=客户端+“”+客户端时间;
encText=新字符串(encCipher.doFinal(plainText.getBytes());
out.println(encText);
}
out.close();
}捕获(例外情况除外){
例如printStackTrace();
}
}
私有void loadClients(){
缓冲读取器;
弦线;
试一试{
in=新的BufferedReader(新的文件读取器(输出文件));
而((line=in.readLine())!=null){
byte[]decBytes=decCipher.doFinal(line.getBytes());
String decText=新字符串(decBytes);
String[]client_data=decText.split(“[]”);
my_clients.put(client_data[0],Long.parseLong(client_data[1]);
}
in.close();
}捕获(例外情况除外){
例如printStackTrace();
}
}

问题来自将字节转换为字符串的事实。假设您的默认平台编码是ASCII。这意味着加密文本中包含的一半字节(字节128及以上)不代表有效字符。此外,您为每个加密文本写一行。因此,如果加密的字节数组碰巧包含换行符,实际上您将向写入程序写入两行,并尝试逐个解密每行,这将导致异常


要么使用字节存储和传输加密数据,要么使用无损耗算法(如Base64)将其转换为字符串(这将确保所有内容都转换为可打印字符)。Apache commons编解码器有一个Base64实现。

错误在用于加密和解密的代码中。给我们看看这个代码。我用以下代码尝试了您的代码,它的工作原理与预期一样:byte[]text=“Hello world”.getBytes(“UTF-8”);字节[]加密=encCipher.doFinal(文本);字节[]解密=decCipher.doFinal(加密);System.out.println(新字符串(解密为“UTF-8”);我添加了用于加密和解密的函数。是否可能是因为我使用BufferedReader读取文件,而使用PrintWriter写入文件而不是OutputStream?
private void saveClients() {
   String plainText = "";
   String encText = "";
   Set<String> clients = my_clients.keySet();
        try {
            PrintWriter out = new PrintWriter(new File(output_file));
            for (String client : clients) {
                long client_time = my_clients.get(client);
                plainText = client + " " + client_time;

                encText = new String(encCipher.doFinal(plainText.getBytes()));
                out.println(encText);
            }
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void loadClients() {
        BufferedReader in;
        String line;
        try {
            in = new BufferedReader(new FileReader(output_file));
            while ((line = in.readLine()) != null) {
                byte[] decBytes = decCipher.doFinal(line.getBytes());
                String decText = new String(decBytes);
                String[] client_data = decText.split("[ ]");
                my_clients.put(client_data[0], Long.parseLong(client_data[1]));
            }
            in.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
     }