因为我知道有人会叫我用别的东西,我不能。这是为了一个大学项目,我必须遵守这些协议。
我会尽量把所有相关的代码贴出来。
首先,在我的主页上,我这样做
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(512);
KeyPair pair = keyPairGen.generateKeyPair();
然后,我把这个对子传给一个线程
Thread sender = new Thread(new UDPSend(s, host, peers.get(peer), portData, sents, lock, condition, pair));
在发送方,会发生这样的情况
byte[] keyBuf = pair.getPublic().getEncoded();
DatagramPacket keyPacket = new DatagramPacket(keyBuf, keyBuf.length, InetAddress.getByName(peer), port);
ds.send(keyPacket);
在另一条线上,有一个接收机在运行,这样做的
byte[] keyBuf = new byte[1024];
DatagramPacket keyPacket = new DatagramPacket(keyBuf, keyBuf.length);
ds.receive(keyPacket);
byte[] keyBytes = keyPacket.getData();
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(keyBytes));
在这里我得到一个异常。Invalid Key Spec.
真正困扰我的部分是它只发生在有时。有时它能正常工作。我第一次启动程序时,它总是工作,但当我再次触发它做它时,它失败了。任何帮助都是感激的。
在我的系统中,我把接收端的线路改成了:
byte[] keyBytes = keyPacket.getData();
到
byte[] keyBytes = Arrays.copyOf(keyPacket.getData(), keyPacket.getLength());
"keyPacket.getData() "方法似乎服务于完整的缓冲区(1024字节长),而 "keyPacket.getLenth() "方法提供了 "真实 "的数据长度。