1

うーん、これは実際には2部構成です...

まず私がする必要がある

  1. ファイルの内容を読む
  2. それらを暗号化してbyte[]
  3. ファイルなどに書き込みbyte[]ます...

次に、#2 または #3 の結果が別のプロジェクトに入ります。PEM/DER キーを保護しようとしています。

復号化のために、私はする必要があります

  1. 暗号化されたファイルの内容をbyte[]
  2. それらを復号化してbyte[]
  3. 復号化されたデータをファイルに書き込むか、ファイルの代わりに使用します

今、私はいくつかの基本的な暗号化コードを持っています

        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 192 and 256 bits may not be available

    SecretKey secretKey = keyGenerator.generateKey();

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


    // By initializing the cipher in CBC mode, an "initialization vector" has been randomly
    // generated. This initialization vector will be necessary to decrypt the encrypted data.
    // It is safe to store the initialization vector in plain text for later use. You can obtain
    // it's bytes by calling iv.getIV().
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
        //      IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one

        byte[] encryptedData = cipher.doFinal(data);

そして復号化も

    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    byte[] decryptedData = cipher.doFinal(encryptedData);
    System.out.println("decrypted: " + new String(decryptedData));

質問は次のとおりです。

何かを暗号化することはめったになく、実行時に復号化される暗号化されたキーを配布するユースケース シナリオを考えると、暗号文とは別に何を保存する必要がありますか?

IVを保存する必要があることはわかっていますが、復号化を行ったときはあまりうまくいきませんでした.secretKeyも保存する必要があると思います。

より良い解決策へのヒント、指針、または一般的なセキュリティのヒントを教えてもらえますか? キー、IV、および暗号化されたデータを保存する必要がある場合、どこに保存すればよいですか? キーをハードコーディングして、暗号化されたデータとともに IV を保存することはできますか? おそらく、IV とキーの両方をハードコーディングして、暗号化されたデータをファイルに保存するだけでしょうか?

これは理論上の安全性に関するものではありません。これは、鍵を盗もうとしている人に引き起こす可能性のある最大の迷惑と不便と考えてください。それらを完全に隠すことはできないことを、私たちは皆知っています。

この男が暗号化されたファイルを復号化し、Java で実行することから始めたことが必要です。

ただし、安全なデータを PemKeyReader に供給するより良い方法があれば、私はすべて耳にします。

4

2 に答える 2

1

キーを共有することと何かを暗号化することは、2 つのまったく別のことです。キーを共有する方法

そうは言っても、 128ビットのAES暗号化アルゴリズムは、よりもかなり強力な暗号化アルゴリズムです3DES。したがって、PKIインフラストラクチャを交換AES keysして、それらを使用して暗号化および復号化することができます。

なぜRSAですか?RSA最強と見なすには最低 512 ビットである必要があり、ビット数を増やすと、暗号化と復号化に必要な時間が長くなります。

SO AES は高速で安全です。

SecretKeySpecを使用して、byte[] からキーを作成します

public static void main(String[] args) throws Exception
{
    // Initialise secret key with predefined byte array [] like below. I
    // have used simple string to array method to generate 16 byte array.
    // AES Key must be minimum 16 bytes.
    // Now you can put this byte array some where is .SO file.
    // Generate new Key using this byte []
    // Then you can generate a key using device specific information at
    // first boot up.
    // Use second key to encrypt data and first key to encrypt the second
    // key
    // I Hope it clears all the doubts
    SecretKey key = new SecretKeySpec("ABCDEFGHIJKLMNOP".getBytes(), "AES");
    System.out.println(Arrays.toString(key.getEncoded()));
    // Initialise Cipher with AES Algorithm
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    // Set The Encrypt Mode
    cipher.init(Cipher.ENCRYPT_MODE, key);
    // Encrypt some bytes
    byte[] encrypted = cipher.doFinal("ABCDEFGH".getBytes());
    // Print it to vefiry
    System.out.println(Arrays.toString(encrypted));

    // Get The IV
    byte[] iv = cipher.getIV();
    System.out.println(iv.length);
    // Now why storing you can create structure like [16 IV][Encrypted Data]
    // And while decrypting you can read first [16] bytes IV and then
    // decrypt remaining bytes

    //byte[] iv = new byte[16];
    // System.arraycopy(encrypted, 0, iv, 0, 16)
    //Copy remaining bytes to decrypt


    // set cipher to decrypt mode

    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));

    // decrypt it
    byte[] decrypted = cipher.doFinal(encrypted);
    System.out.println(new String(decrypted));

}

次に、デバイス名、ユーザー名、ランダム シードなどのランダム データから byte[] を生成するアルゴリズムを作成します。

そのアルゴリズムを書き込み、ファイルをC作成し、使用して取得することにより、アルゴリズムのソースコードにさらに保護を追加できます。.SObyte []Native calls

これをすべて行う利点は何ですか?

  1. イベントがハッキングされた場合、そこからキーの作成を実行するためのリアルタイム環境が必要になります。
  2. 誰かがそれをクラックしたとしても、ダメージは限定されます。つまり、1つのデバイス
  3. ハッカーは各デバイスで同じことを繰り返さなければならず、これは非常に不可能です。
于 2012-08-21T11:03:00.053 に答える
1

質問の I/O の側面は、Oracle Java チュートリアルの「バイト ストリーム」および「バッファ ストリーム」セクションを読むことによって最もよく対処されます。バイトを に書き込み、メソッドをByteArrayOutputStream使用してバイトを として取得することで、バイトをメモリに蓄積できます。toByteArray()byte[]

于 2012-08-21T11:22:26.727 に答える