Comportamento Crypto / AES padrão do Java

Alguém sabe para que serve o comportamento de criptografia Java padrão:

SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte, "AES"); Cipher localCipher = Cipher.getInstance("AES"); 

Especificamente eu estou olhando para entender como essas classs geram o IV, bem como qual é o modo de criptografia padrão quando apenas especificando “AES”. Obrigado.

Para o Oracle JDK 7 (testado), a cifra padrão para o AES é AES / ECB / PKCS5Padding. A documentação do Java Security não menciona isso (http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#algspec), tem que fazer alguns testes JUnit para descobrir .

Esses detalhes são específicos do provedor e depender do modo padrão e do preenchimento pode ser muito perigoso. Se você estiver interessado em saber quais são os valores que o provedor padrão atualmente empacotou com o Java, você terá que procurar o código-fonte para o algoritmo em questão. Por exemplo, os valores padrão que ele usa para o algoritmo RSA estão aqui . Além disso, o Guia de Referência da Arquitetura de Criptografia Java ™ (JCA) tem um pouco de informações que podem responder a algumas outras perguntas.

Os detalhes são específicos do provedor. O Guia de Referência da JCA diz que:

(Criando um object de criptografia) Se nenhum modo ou preenchimento for especificado, os valores padrão específicos do provedor para o esquema de modo e preenchimento serão usados. Por exemplo, o provedor SunJCE usa o ECB como o modo padrão e o PKCS5Padding como o esquema de preenchimento padrão para as codificações DES, DES-EDE e Blowfish. Isso significa que, no caso do provedor SunJCE: Cipher.getInstance (“DES”) e Cipher.getInstance (“DES / ECB / PKCS5Padding”) são instruções equivalentes.

Eu sempre usaria o formulário completo (algoritmo / modo / preenchimento), não apenas porque acho que omitir esses “detalhes” à implementação é uma prática ruim, mas também para obter um texto cifrado que seja independente do provedor escolhido (geralmente criptografa para armazenamento / transmissão, então não se pode ter certeza de que o mesmo provedor será usado posteriormente / no outro lado).

Depende dos provedores. Provedores diferentes podem ter parâmetros padrão diferentes. Este é o link para o Java 8.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SUNProvider

O método factory javax.crypto.Cipher.getInstance (transformação String) gera Ciphers usando transformações do formulário algorithm / mode / padding. Se o modo / preenchimento for omitido, os provedores SunJCE e SunPKCS11 usarão o ECB como o modo padrão e o PKCS5Padding como o preenchimento padrão para muitas cifras simétricas.

Recomenda-se usar transformações que especifiquem totalmente o algoritmo, o modo e o preenchimento em vez de confiar nos padrões.

Nota: O ECB funciona bem para blocos únicos de dados e pode ser paralelizado, mas geralmente não deve ser usado para vários blocos de dados.

Portanto, você não deve apenas usar o AES, mas especificar o modo e o preenchimento. Além disso, embora o método getInstance possa ter outro parâmetro para o provedor, isso não é recomendado porque

aplicativos estão vinculados a provedores específicos que podem não estar disponíveis em outras implementações Java