1

Java AES 暗号化を使用して、受信者に送信されるデータを暗号化しています。各受信者には、受信者と私が知っている独自のキーがあります。

アイデアは、無料で入手できる AES 復号化ツールを使用してデータを復号化できるというものです。

これが私のコードです:

public class AESencrypt {

    private static final String ALGO = "AES/CBC/PKCS5Padding";
    private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public void String encryptToFile(String filename, String data) throws Exception {
        Key key = new SecretKeySpec(keyValue, "AES");
        Cipher c = Cipher.getInstance(ALGO);
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        c.init(Cipher.ENCRYPT_MODE, key, ivspec);
        byte[] encVal = c.doFinal(data.getBytes());
        FileOutputStream fileOutputStream = new FileOutputStream(filename);
        fileOutputStream.write(encVal);
        fileOutputStream.close();
    }

    public static void main(String[] args) throws Exception {
        encryptToFile("foo.aes", "hellothere");
    }
}

}

これを確認するために、オンライン AES 暗号化 / 復号化ツールを使用してサンプル データを復号化しました (正常に機能しました!)。

今、無料の AES 復号化ツールを使用して、受信者がオンライン ツールを使用せずに PC 上のデータを復号化できるようにしたいと考えています。ここからフラストレーションが始まります。

さまざまな AES 復号化ツールのインストールとテストを開始しました。キーを慎重に入力し、CBC アルゴリズムを選択し、ファイルを選択して「復号化」をクリックしましたが、どのツールもサンプル ファイルを復号化できませんでした。foo.aesそれらはすべてエラーで失敗し、あるケースでは、ゼロバイトの空のファイルが返されました。

少なくとも 4 つの異なる AES 暗号化/復号化ツールでこれを試しましたが、いずれもファイルを復号化できなかったため、コードに問題がある可能性があると思いました。

  • 暗号AES
  • AES暗号
  • 高度な AES エンクリプター
  • Cr!ptAES

誰かが私のコードを見ることができれば、大歓迎です。

あるいは、上記のコードで動作する AES デクリプター ツールがあるかもしれません。

4

4 に答える 4

2

あなたが直面している問題は、AES は標準ですが、それは単なる暗号プリミティブであり、完全なプロトコルが必要なことです。

思いついたプロトコルは、基本的に次のように機能します。

  • 何らかの方法で秘密鍵を事前に共有します。キーは ASCII 文字セットで 16 文字として定義されます。キー派生関数を適用しないでください (事前定義された詳細)。
  • PKCS #5 パディング (事前定義された詳細) を使用して、CBC モードで AES を使用して平文を暗号化します。定義済みの IV を使用します。

ご覧のとおり、通信を成功させるために双方が認識しておく必要がある定義済みの詳細がいくつかありますが、AES はその 1 つにすぎません。あなたが試したツールは、これらすべての詳細に一致していないようです。

もちろん、解決策は標準プロトコルを使用することです。

適切なプロトコルを選択するには、最初に暗号化が必要な理由を特定する必要があります。暗号化自体は望ましい目標ではないからです。何から守ろうとしているのですか?

本質的に、暗号化は、大量のデータの機密性を少量のデータ (キー) の機密性に置き換えます。ユーザーが誤ってキーを漏洩した場合はどうなりますか? キーをユーザーに安全に送信できる場合、そのチャネルを介して残りのデータも送信できないのはなぜですか? (この件に関する記事: http://blogs.msdn.com/b/ericlippert/archive/2011/09/27/keep-it-secret-keep-it-safe.aspx )

また、機密性は多くのセキュリティ プロパティの 1 つにすぎないことを認識することも重要です。CBC はかなり順応性が高く、静的な IV を使用しているため、プレーンテキストに関する情報が漏洩する可能性があるため、プロトコルは信頼性を提供できません (メッセージを作成し、変更されていないことを保証します)。

おわかりのように、安全なプロトコルを設計することは決して簡単ではありません。あなたは、自分の決定の細部にまで気を配らなければなりません。専門家でさえ、常に正しいとは限りません。

すべての面倒を避けるための最良の選択肢は、十分に確立された標準を使用することです。ネットワーク接続を介したデータ転送にはTLSを使用し、ディスク上のデータの暗号化にはPGPを使用します。両方のプロトコルは、ほぼすべてのユース ケースに合わせて構成できます。

于 2013-10-22T20:07:17.310 に答える
0

結局、私は良い解決策を見つけたと思います。

AES Cryptにはいくつかの Java ソース コードと、生成した AES ファイルをデコードする必要があるユーザーと共有できる対応する軽量ユーティリティ プログラムがあります。

誰かが別の言い方をしない限り、それは私にとって良いアプローチのように思えますか?

于 2013-11-04T13:21:09.370 に答える
0

対称暗号化 (同じ暗号化アルゴリズムを使用する場合でも) はさまざまな方法で使用でき、製品は別の無数の方法でラップされます。特定の仕様に従わない 2 人の開発者が同じ出力を生成する可能性はゼロに近いです。

あなたが言及したこれらのアプリケーションは、相互の出力を処理しないに違いありません。つまり、相互に互換性もありません。そうである場合、これは、それらが何らかの標準または他の文書に従っていることを意味し、同じ標準を実装する必要があります。

于 2013-10-22T13:42:30.230 に答える