0

クライアントとサーバーの間で文字列を使用して通信する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 は 1 つだけです。デバッグ用に、同じ関数で暗号化と解読を試みましたが、問題は byte[] から String への変換に依存しています。

操作は自動生成され、すべてのコードは文字列であるため、引数の受け渡しを他の型に変更したくありません。別の「UTF-8」と「UTF-16Le」で試しましたが、どれも機能しません:S

何か案が?

4

1 に答える 1

0

非対称キーでデータを直接暗号化するのは得策ではなく、機能しません。RSA キーは、キーの長さよりも大きなデータを暗号化できません。したがって、それを行う正しい方法は、対称キーを生成し、対称キーでデータを暗号化し、次に非対称キーで対称キーを暗号化することです。したがって、暗号化されたデータと暗号化されたキーの両方を相手に送信する必要があります。

非対称キーを使用してデータを直接暗号化しようとすると、byte[] に正しいデータが含まれていないか、まったく含まれていない可能性があります。これは、データがキーの長さよりも大きい場合に発生します。キーの長さが短いデータの場合は正常に機能しますが、より大きなデータでは機能しません。

于 2012-05-15T10:16:36.563 に答える