0

必要に応じて詳細を提供できますが、私の質問は基本的に次のとおりです。

私が作成した(そして持っている)RSA pub / privキーコンボを使用してトラフィックを暗号化するopenfireサーバーを実行している場合、ネットワークからパケットをスニッフィングし、プライベートキーを使用してそれらを復号化する方法はありますか(できればJavaで) ?現在、次を使用して文字列を暗号化/復号化できます。

public class TLSDecryptTest {

Cipher Ecipher;
Cipher Dcipher;

public TLSDecryptTest(String pubpath, String privpath){
    byte[] publicKeyContentsAsByteArray;
    RSAPublicKey pubKey;
    try {
    this.Ecipher = Cipher.getInstance("RSA");
    String path1 = new String("C:\\Users\\peter.marino\\Desktop\\javapub.key");
    File pubFile = new File(path1);
    publicKeyContentsAsByteArray = new byte[(int)pubFile.length()];

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pubFile));
        publicKeyContentsAsByteArray = new byte[(int)pubFile.length()];
        bis.read(publicKeyContentsAsByteArray);
        bis.close();

        CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
        Certificate certificate = certificateFactory.generateCertificate(new ByteArrayInputStream(publicKeyContentsAsByteArray));
       pubKey = (RSAPublicKey) certificate.getPublicKey();
       this.Ecipher.init(Cipher.ENCRYPT_MODE, pubKey);
    } catch(Exception e) {
        System.out.println("Exception" + e);
    }

    try {
    this.Dcipher = Cipher.getInstance("RSA");
    String path2 = new String("C:\\Users\\peter.marino\\Desktop\\java.key");
    File privFile = new File(path2);
    byte[] privateKeyContentsAsByteArray = new byte[(int)privFile.length()];

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(privFile));
        privateKeyContentsAsByteArray = new byte[(int)privFile.length()];
        bis.read(privateKeyContentsAsByteArray);
        bis.close();

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        KeySpec ks = new PKCS8EncodedKeySpec(privateKeyContentsAsByteArray);
        RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(ks);
        System.out.println("PRIVATE KEY:::: " + new String(privKey.getEncoded()).equals(new String(privateKeyContentsAsByteArray)));
        this.Dcipher.init(Cipher.DECRYPT_MODE, privKey);
    } catch(Exception e) {
        System.out.println("Exception" + e);
    }

}

 public byte[] en(byte[] decryptedMessage) throws Exception {
     byte[] encryptedMessage = this.Ecipher.doFinal(decryptedMessage);
     //byte[] encryptedMessage = this.Ecipher.doFinal(decryptedMessage);
     return (encryptedMessage);

 }


 public byte[] de(byte[] encryptedMessage) throws Exception {
     byte[] decryptedMessage = this.Dcipher.doFinal(encryptedMessage);
     return (decryptedMessage);

 }

public static void main(String args[]) throws Exception{
    TLSDecryptTest t = new TLSDecryptTest(null,null);
    String s = ("Testing decryption.1Testing decryption.2Testing decryption.3Testing decryption.4");
    System.out.println("S: " + s);
    byte[] todo = s.getBytes();
    byte[] e = t.en(todo);
    String es = new String(e);
    System.out.println("E: " + es);
    byte[] d = t.de(e);
    String ds = new String(d);
    System.out.println("D: " + ds);
}

}

これは正常に動作します。ただし、ネットワークからいくつかのパケットをスニッフィングしてから復号化しようとすると、エラーが発生します。RSAキーの制限であるため、最初の256バイトのみを復号化しようとしましたが、それでもエラーが発生します。最も注目すべきは、doFinal()行のBadPaddingExceptionです。

何か案は?

前もって感謝します。

4

3 に答える 3

2

SSLで保護されたセッションについて話している場合、正当なサーバーの秘密鍵を持っていれば(そして、とにかく公開されている証明書を取得できれば)、中間者攻撃が発生する可能性があります。実用的な目的のために、Wiresharkを使用してトラフィックをスパイできるはずです。

ただし、トラフィックをそのまま復号化することはできません。公開鍵暗号を使用して暗号化されていないことも一因です。データは、セッションごとに生成された対称鍵を使用して暗号化されます。

于 2012-06-14T15:51:17.657 に答える
1

サーバーの秘密鍵を持っている場合、Wiresharkを使用して復号化できます。ドキュメントはこちらです。

まず、[編集]/[設定]/[プロトコル]/[SSL]に移動し、[RSAキー]の横にある[編集]ボタンをクリックします。

RSAキーを編集する

次に、[新規]をクリックします。キーをいつ使用すべきかを説明する情報をフォームに記入します。これは、サーバーのIPアドレスとポートである必要があります。

RSAキー情報

キーファイルにはパスフレーズが必要な場合と不要な場合があります。OKを3回押します。いつものようにキャプチャします。

于 2012-06-14T19:05:49.870 に答える
-3

いいえ。公開鍵暗号化では、反対の鍵でのみ復号化できます。例えば

encrypted with private key => decrypt with public key
encryptd with public key => decrypt with private key

次の場合に発生する混乱を考慮してください

encrypted with public key => decrypt with public key

可能でした-公開鍵は誰もが見ることができるように「オープン」に浮かんでいるので、誰もがすでにデータを復号化するための鍵を持っているので、基本的にデータをサランラップでギフトラップすることになります。これにより、SSLセキュリティモデル全体が完全に破壊されます。

于 2012-06-14T15:37:30.287 に答える