0

PBE を使用して他の暗号化キーを生成したいと考えています。

public SecretKey generateKey(String Ags) throws Exception {
    // make password
    PBEKeySpec keySpec = new PBEKeySpec(this.password.toCharArray(),this.salt,20,56);

    SecretKeyFactory keyFactory = SecretKeyFactory
            .getInstance("PBE");
    SecretKey key = keyFactory.generateSecret(keySpec);
    System.out.println();

    /*
    KeyGenerator kg = KeyGenerator.getInstance("AES");
    kg.init(k);
    //
    SecretKey FINAL_key = new SecretKeySpec(key.getEncoded(), "AES");
    */
    return null;
}

私の基本的な考え方はPBEKeySpecSecretKeyFactory最初に PBE キーを生成し、次に最初の数バイト、たとえば 10 バイトを取得して AES キーを生成することです。ただし、インターネットを検索した後でも、最終的なキーを として取得する方法がわかりませんbyte[]key.getEncoded()入力パスワードを教えてくれます。最終的なキーを として取得するにはどうすればよいbyte[]ですか?

4

1 に答える 1

0

ドキュメントを読んで理解している限り、AES秘密鍵を作成したい場合は、アルゴリズムに少なくとも128ビットの鍵を供給する必要があることを理解しています。

SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

キーを生成するために、なぜPBEキーから128ビットを取得することを主張するのですか?代わりに使用できます

byte[] key = (Password+Username).getBytes("UTF-8"); // depends on your implementation
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // AES uses 16 byte of key as a parameter (?)

PBE キーを使用して SHA にフィードし、その方法でバイトを取得することもできます。わかりました、あなたの問題に目を向けましょう。これが私のセキュリティ フォルダからの完全に機能するコードです。これでうまくいったことを覚えています。以下のコードでは、キーがpbeKeySpecを使用して生成されていることがわかりますが、コードを確認すると 、何が問題なのかわかりません。

public void testPBEWithSHA1AndAES() throws Exception {
        String password = "test";
        String message = "Hello World!";

        byte[] salt = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
                (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };
        byte[] iv = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
                (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99,
                (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
                (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };

        int count = 1024;
        // int keyLength = 256;
        int keyLength = 128;

        String cipherAlgorithm = "AES/CBC/PKCS5Padding";
        String secretKeyAlgorithm = "PBKDF2WithHmacSHA1";
        SecretKeyFactory keyFac = SecretKeyFactory
                .getInstance(secretKeyAlgorithm);
        PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt,
                count, keyLength);
        SecretKey tmp = keyFac.generateSecret(pbeKeySpec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
        Cipher ecipher = Cipher.getInstance(cipherAlgorithm);
        ecipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(iv));

        // decrypt
        keyFac = SecretKeyFactory.getInstance(secretKeyAlgorithm);
        pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, count,
                keyLength);
        tmp = keyFac.generateSecret(pbeKeySpec);
        secret = new SecretKeySpec(tmp.getEncoded(), "AES");
        // AlgorithmParameters params = ecipher.getParameters();
        // byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        Cipher dcipher = Cipher.getInstance(cipherAlgorithm);
        dcipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));

        byte[] encrypted = ecipher.doFinal(message.getBytes());
        byte[] decrypted = dcipher.doFinal(encrypted);
        assertEquals(message, new String(decrypted));

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        CipherOutputStream cipherOut = new CipherOutputStream(out, ecipher);
        cipherOut.write(message.getBytes());
        StreamUtils.closeQuietly(cipherOut);
        byte[] enc = out.toByteArray();

        ByteArrayInputStream in = new ByteArrayInputStream(enc);
        CipherInputStream cipherIn = new CipherInputStream(in, dcipher);
        ByteArrayOutputStream dec = new ByteArrayOutputStream();
        StreamUtils.copy(cipherIn, dec);
        assertEquals(message, new String(dec.toByteArray()));
    }
于 2012-12-07T20:48:45.143 に答える