AWS Encryption SDK с JCE Keystore и симметричными ключами - PullRequest
0 голосов
/ 29 ноября 2018

Кто-нибудь получил AWS Encryption SDK для работы с хранилищами ключей JCE и симметричными ключами (AES)?Я могу заставить шифрование работать, но при расшифровке оно всегда терпит неудачу при попытке расшифровать ключи данных.Отладка выглядит так, как будто псевдоним (имя главного ключа), сохраненный в результате зашифрованного текста, поврежден (дополнительные символы в конце).Код очень просто создать хранилище ключей, добавить один секретный ключ, encryptString, а затем сразу же decryptString.

Я хочу сделать это, потому что я хочу иметь возможность поддерживать AWS KMS при работе в AWS и хранилищах ключей при работе в помещении.

Есть мысли по этому поводу?

   public static void main(final String[] args) throws Exception {

    // get the JCEKS keystore (JCEKS is needed for symmetric encryption keys)
    // ks = KeyStore.getInstance("JCEKS");
    ks = KeyStore.getInstance("BKS", "BC");
    ks.load(null, KEYSTOREPASSWORD); // null is only for test, normally we would load existing key store

    final KeyStore.PasswordProtection protectionParam = new KeyStore.PasswordProtection(KEYSTOREPASSWORD);

    // add the master key
    // encapsulate this (done whenever we create/rotate a master key, normally not done here)
    KeyGenerator kg = KeyGenerator.getInstance("AES");
    kg.init(256);
    SecretKey sk = kg.generateKey();
    KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(sk);
    ks.setEntry(MASTERKEY, skEntry, protectionParam);

    // set up the context (pass in via encrypt/decrypt methods)
    final Map<String, String> context = Collections.singletonMap("AccountID", ACCOUNTID);
    // final Map<String, String> context = Collections.emptyMap();

    final AwsCrypto crypto = new AwsCrypto();

    final KeyStoreProvider prov = new KeyStoreProvider(ks, protectionParam, PROVIDERNAME, WRAPPERALGORITHM, MASTERKEY);
    System.out.println("master key: " + prov.getMasterKey(prov.getDefaultProviderId(), MASTERKEY).getKeyId());

    System.out.println("plaintext: " + PLAINTEXT);

    // encrypt the plaintext
    final CryptoResult<String, JceMasterKey> encryptResult = crypto.encryptString(prov, PLAINTEXT, context);
    System.out.println("master key from encryption result: " + encryptResult.getMasterKeyIds().get(0));

    // verify that the correct key was used
    if (!encryptResult.getMasterKeyIds().get(0).equals(MASTERKEY))
    {
        throw new IllegalStateException("Wrong key id on encrypt!");
    }
    final String ciphertext = encryptResult.getResult();
    System.out.println("ciphertext: " + ciphertext);

    // decrypt the ciphertext
    final CryptoResult<String, JceMasterKey> decryptResult = crypto.decryptString(prov, ciphertext);

    // verify that the decryption was okay
    if (!decryptResult.getMasterKeyIds().get(0).equals(MASTERKEY)) {
        throw new IllegalStateException("Wrong key id on decrypt!");
    }

    for (final Map.Entry<String, String> e : context.entrySet()) {
        if (!e.getValue().equals(decryptResult.getEncryptionContext().get(e.getKey()))) {
            throw new IllegalStateException("Wrong context!");
        }
    }

    System.out.println("plaintext: " + decryptResult.getResult());
}

И результаты:

1009 * главный ключ: MASTERKEY 1011 * открытый текст: PlainText 1013 * главный ключ из результата шифрования: MASTERKEY 1015 * шифротекст: AYADeLxyAkkD8uHCp6fA1hNPgtwAdQACAAlBY2NvdW50SUQACTQ1LTM0LTUzYgAVYXdzLWNyeXB0by1wdWJsaWMta2V5AERBdjZJcGovYzJEYnAxTmoxRWpxL054NkdwVmFiVXZDNlZsdlFTdUtick1BSElReXNoK3VsZFFXaWNQY2ZhNll5Q0E9PQABAAhLZXlTdG9yZQAdbWFzdGVya2V5AAAAgAAAAAyQtzn9Fsq / H2yUYScAMNiB4Snccv31U6SVTJKz6 +9JgK6VAqxI7SK3kVlR4lIbTAT0u631dbCeIDtRmF5avgIAAAAADAAAEAAAAAAAAAAAAAAAAAAFFx5VUdsPv / poNBRnNZ / б ///// wAAAAEAAAAAAAAAAAAAAAEAAAAJQqLA2EARt3Unqj5zqVIvBg + XPV + FnnpLvgBnMGUCMQCdFlUECMm / sXbGZy2FpzDHgIoxk8jDlZY05Gm48OQjJ / qWIdpCGLsEQMkYMnLMIYQCMGrs2c7MmIR0eRt / yUb6hrdoVRP5390RTJtIM31rmQbK8fEa0o7fj29Ns + oEGzDmHA ==

- эта строка из отладки кода в коде дешифрования DataKey... обратите внимание, что это главный ключ с дополнительным мусором в конце

псевдоним: masterkey� ��9�ʿl�a '

Исключение в потоке "main" com.amazonaws.encryptionsdk.exception.CannotUnwrapDataKeyException: невозможно расшифровать любые ключи данных

at com.amazonaws.encryptionsdk.MasterKeyProvider.buildCannotDecryptDksException(MasterKeyProvider.java:103)

at com.amazonaws.encryptionsdk.jce.KeyStoreProvider.decryptDataKey(KeyStoreProvider.java:201)

at com.amazonaws.encryptionsdk.DefaultCryptoMaterialsManager.decryptMaterials(DefaultCryptoMaterialsManager.java:108)

at com.amazonaws.encryptionsdk.internal.DecryptionHandler.readHeaderFields(DecryptionHandler.java:455)

at com.amazonaws.encryptionsdk.internal.DecryptionHandler.<init>(DecryptionHandler.java:96)

at com.amazonaws.encryptionsdk.internal.DecryptionHandler.create(DecryptionHandler.java:185)
at com.amazonaws.encryptionsdk.AwsCrypto.decryptData(AwsCrypto.java:380)
at com.amazonaws.encryptionsdk.AwsCrypto.decryptData(AwsCrypto.java:357)
at com.amazonaws.encryptionsdk.AwsCrypto.decryptString(AwsCrypto.java:430)
at com.amazonaws.encryptionsdk.AwsCrypto.decryptString(AwsCrypto.java:412)
at EncryptionService.main(EncryptionService.java:78)
...