我实现了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());
这给出了“数据必须从零开始”的填充问题
只生成一个KeyPair,对于调试,我试图对同一个函数进行加密和描述,问题依赖于从byte []到String的转换。
我真的不想将参数传递给其他类型,因为操作是自动生成的,所有代码都是字符串。我试过不同的“UTF-8”和“UTF-16Le”,但都没有用:S
有什么想法吗?
答案 0 :(得分:0)
使用非对称密钥直接加密数据不是一个好主意,它不起作用。 RSA密钥无法加密大于其密钥长度的数据。因此,正确的做法是生成对称密钥并使用对称密钥加密数据,并使用非对称密钥加密对称密钥。因此,您需要将加密数据和加密密钥都发送给另一方。
如果您尝试使用非对称密钥直接加密数据,则您的byte []可能不包含正确的数据,或者根本不包含任何内容。如果您的数据大于密钥长度,则会发生这种情况。对于较小的密钥长度的数据,它可以正常工作,但不能用于更大的数据。