Кто-нибудь получил 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)