Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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加密问题_Java_Type Conversion_Encryption Asymmetric - Fatal编程技术网

数据类型转换的Java加密问题

数据类型转换的Java加密问题,java,type-conversion,encryption-asymmetric,Java,Type Conversion,Encryption Asymmetric,我已经实现了web服务,它使用字符串在客户端和服务器之间进行通信。我遇到的问题是将加密字节数组转换为字符串,因为我无法在服务器端将其转换回原始内容 KeyPairGenerator keyGen; keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair key = keyGen.generateKeyPair(); String publicKeyPath = new String("publ

我已经实现了web服务,它使用字符串在客户端和服务器之间进行通信。我遇到的问题是将加密字节数组转换为字符串,因为我无法在服务器端将其转换回原始内容

KeyPairGenerator keyGen;
keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();

String publicKeyPath = new String("publicKeys.txt");
publickey = key.getPublic()
byte[] pubEncoded = key.getPublic().getEncoded();
FileOutputStream fout = new FileOutputStream(publicKeyPath);
fout.write(pubEncoded);
fout.flush();
fout.close();

String privateKeyPath = new String("privateKeys.txt");
byte[] privEncoded = key.getPrivate().getEncoded();
fout = new FileOutputStream(privateKeyPath);
fout.write(privEncoded);
fout.flush();
fout.close();

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
在客户端的每个方法上:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publickey); 
byte[] cipherText = cipher.doFinal(str.getBytes());
port.callX(chiperText.toString());
在服务器端:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] newPlainText = cipher.doFinal(arg.getBytes());
这就产生了“数据必须以零开始”的填充问题

只生成了一个密钥对,为了调试,我尝试在同一个函数上加密和解密,问题取决于从byte[]到String的转换

我真的不想把参数传递给其他类型,因为操作是自动生成的,所有代码都是字符串。我试过使用不同的“UTF-8”和“UTF-16Le”,但没有一种是有效的:S


有什么想法吗?

用非对称密钥直接加密数据不是一个好主意,也不起作用。RSA密钥无法加密大于其密钥长度的数据。因此,正确的方法是生成对称密钥,用对称密钥加密数据,用非对称密钥加密对称密钥。因此,您需要将加密数据和加密密钥同时发送给另一方


如果尝试使用非对称密钥直接加密数据,则字节[]可能不包含正确的数据,或者可能根本不包含任何内容。如果数据大于密钥长度,则会发生这种情况。对于键长度较小的数据,它可以正常工作,但对于较大的数据则不行。

出于兴趣,为什么到处调用字符串(String)构造函数?没有特殊原因。。。您可以将其更改为String path=“XX”问题与文件路径无关。它可以很好地存储密钥-这只是奇怪的代码,仅此而已。它需要使用非对称密钥,这是一个要求。问题是,我成功地将它们从字节转换为字符串并恢复到正常值,但现在使用“ISO-8859-1”,问题是我无法通过Web服务传递它,因为它包含非法字符:(