Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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
Java 如何在没有文件I/O的情况下打印密封对象加密数据?_Java_Encryption_Public Key Encryption_Password Encryption - Fatal编程技术网

Java 如何在没有文件I/O的情况下打印密封对象加密数据?

Java 如何在没有文件I/O的情况下打印密封对象加密数据?,java,encryption,public-key-encryption,password-encryption,Java,Encryption,Public Key Encryption,Password Encryption,下面是我的代码。 当我尝试打印密封对象时,它只显示 javax.crypto。SealedObject@34dac684 一,。加密: 创建Outputstreams并使用Base64编码器获取字符串 二,。解密: 创建一个新的密码,输入流并使用Base64解码器返回原始字符串 完全有效的示例只需复制和粘贴: import javax.crypto.SecretKey; import javax.crypto.KeyGenerator; import javax.crypto.Cipher; i

下面是我的代码。 当我尝试打印密封对象时,它只显示

javax.crypto。SealedObject@34dac684

一,。加密:

创建Outputstreams并使用Base64编码器获取字符串

二,。解密:

创建一个新的密码,输入流并使用Base64解码器返回原始字符串

完全有效的示例只需复制和粘贴:

import javax.crypto.SecretKey;
import javax.crypto.KeyGenerator;
import javax.crypto.Cipher;
import javax.crypto.SealedObject;
import java.io.Serializable;

import java.io.ByteArrayOutputStream;
import javax.crypto.CipherOutputStream;
import java.io.ObjectOutputStream;

import java.io.ByteArrayInputStream;
import javax.crypto.CipherInputStream;
import java.io.ObjectInputStream;

import java.util.Base64;

public class MyClass {
    public static void main(String args[]) {
        OtherClass myObject = new OtherClass();
        myObject.print();
    }
}

// you can add other public classes to this editor in any order
class OtherClass
{
public void print() {


 try {
       String userCodes = "Test123";
        // generate a secret key using the DES algorithm
        SecretKey key = KeyGenerator.getInstance("DES").generateKey();
        Cipher ecipher = Cipher.getInstance("DES");
        // initialize the ciphers with the given key
        ecipher.init(Cipher.ENCRYPT_MODE, key);
        // create a sealed object
        SealedObject sealed = new SealedObject((Serializable) userCodes, ecipher);

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    CipherOutputStream cipherOutputStream = new CipherOutputStream(
            outputStream, ecipher);

    ObjectOutputStream oos = new ObjectOutputStream(cipherOutputStream);
    oos.writeObject( sealed );
    cipherOutputStream.close();

    byte[] values = outputStream.toByteArray();

    String base64encoded = Base64.getEncoder().encodeToString(values);
    System.out.println(base64encoded);

    // decrypt
    Cipher fcipher = Cipher.getInstance("DES");
    fcipher.init(Cipher.DECRYPT_MODE, key);

    ByteArrayInputStream istream = new ByteArrayInputStream(Base64.getDecoder().decode(base64encoded));
    CipherInputStream cipherInputStream = new CipherInputStream(istream, fcipher);
    ObjectInputStream inputStream = new ObjectInputStream(cipherInputStream);
    SealedObject sealdedObject = (SealedObject) inputStream.readObject();
    System.out.println(sealdedObject.getObject(key));

}
catch(Exception e){
    e.printStackTrace();
}
}
}
您的密封对象是可序列化的。因此,您可以将其写入ObjectOutputStream:

try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)) {
    out.writeObject(sealed);
    byte [] bytes =  bos.toByteArray();
    System.out.println(bytes);
} catch (IOException e) {
    e.printStackTrace();
}
要更方便用户打印,可以在base64中对其进行编码:

String base64encoded = Base64.getEncoder().encodeToString(bytes);
System.out.println(base64encoded);
System.out.println将始终打印toString方法的值。在你的情况下,打印Class@hex是对象类中的默认实现,它在java中的所有类中都会继承

您可以创建一个自定义方法来打印您的对象


通过从对象调用getter方法并打印它们来提供方法定义,从而遍历所需的结果。连接和返回也是一个选项。

如何打印对象?@Janez Kuhar System.out.printlnsealed;您希望在打印输出中得到什么?@Benoit我希望它出现在字符串中,例如sdfdsgwet4tgsdgssgsgdfhgfhfhfg==@Benoit我尝试过使用toString,但它仍然打印相同,我想打印加密数据谢谢@Benoit以字符串形式得到响应,如果我想从中解密该怎么办string@Samir然后您必须使用类似的ByArrayInputStream和ObjectInputStream。ObjectOutputStream将返回类实例的序列化表示,而不是类内容的序列化表示。那不太一样。如果重点是说,能够获取加密字符串的字节并对其进行解密,这将是不令人满意的。虽然这个问题不清楚,所以这也可能正是他想要的。谢谢你的解决方案…但是当我用其他方法只写解密代码时,我得到了这个错误java.io.StreamCorruptedException:invalid stream header:5C820B75
String base64encoded = Base64.getEncoder().encodeToString(bytes);
System.out.println(base64encoded);