Завершение и развертывание ключа шифрования завершается неудачно (javax.crypto) - PullRequest
1 голос
/ 15 ноября 2011

У меня есть следующий тестовый код для шифрования и дешифрования строки.Это работает нормально, если я пропускаю код переноса и распаковки для своего ключа в test (), но когда я пытаюсь свернуть свой ключ, а затем развернуть его снова и использовать его для расшифровки, он терпит неудачу, и я не получаю "Протестируйте "обратно как полученную расшифрованную строку, но вместо этого" �J�� ".

Кто-нибудь видит ошибку, которую я делаю с упаковкой и развертыванием?Спасибо.

private static void test() throws Exception {

    // create wrap key
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AESWrap");
    keyGenerator.init(256);
    Key wrapKey = keyGenerator.generateKey();

    SecretKey key = generateKey(PASSPHRASE);
    Cipher cipher;

    // wrap key
    cipher = Cipher.getInstance("AESWrap");
    cipher.init(Cipher.WRAP_MODE, wrapKey);
    byte[] wrappedKeyBytes = cipher.wrap(key);

    // unwrap key again
    cipher.init(Cipher.UNWRAP_MODE, wrapKey);
    key = (SecretKey)cipher.unwrap( wrappedKeyBytes, "AES/CTR/NOPADDING", Cipher.SECRET_KEY);

    // encrypt
    cipher = Cipher.getInstance("AES/CTR/NOPADDING");
    cipher.init(Cipher.ENCRYPT_MODE, key, generateIV(cipher), random);
    byte[] b = cipher.doFinal("Test".toString().getBytes());

    // decrypt
    cipher = Cipher.getInstance("AES/CTR/NOPADDING");
    cipher.init(Cipher.DECRYPT_MODE, key, generateIV(cipher), random);
    b = cipher.doFinal(b);

    System.out.println(new String(b));  
    // should output "Test", but outputs �J�� if wrapping/unwrapping

}

И два вспомогательных метода, которые вызываются в приведенном выше коде:

private static IvParameterSpec generateIV(Cipher cipher) throws Exception {
    byte [] ivBytes = new byte[cipher.getBlockSize()];
    random.nextBytes(ivBytes);    // random = new SecureRandom();
    return new IvParameterSpec(ivBytes);
}

private static SecretKey generateKey(String passphrase) throws Exception {
    PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray(), salt.getBytes(), iterations, keyLength);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM); //"PBEWITHSHA256AND256BITAES-CBC-BC"
    return keyFactory.generateSecret(keySpec);
}

1 Ответ

4 голосов
/ 16 ноября 2011

Похоже, что вы даете другой IV для cipher.init (Cipher.ENCRYPT_MODE, ...) и cipher.init (Cipher.DECRYPT_MODE, ...), дважды вызывая generateIV ().

...