2012-07-01 55 views
5

我使用Android应用中以下和独立的Java应用程序:指定Cipher.getInstance()参数?

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] encrypted = cipher.doFinal(clear); 
    ... 

我得到的android不同的加密字符串VS我的独立的Java应用程序(使用相同的代码和密钥两者)。我得到相同的异常(javax.crypto.BadPaddingException:Blocktype不匹配:0)作为这样一个问题:

RSA Encryption: Difference between Java and Android

和建议的解决方案是指定一个像填充策略:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

但我使用的是“AES”,而不是“RSA”,我不确定如何指定与AES组合的填充。在那种情况下,我将如何构造传递给Cipher.getInstance()的字符串?我给了这个尝试:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding"); 

但得到一个异常关于是无效的。

感谢

+1

试试这个密码加密= Cipher.getInstance( “AES/CBC/ISO10126Padding”, “JsafeJCE”); –

+0

Blast没有工作:java.security.NoSuchProviderException:没有这样的提供者:JsafeJCE – user291701

+3

听起来好像你正在试图通过在墙上扔随机位的代码来编写加密代码,并希望有东西支持。通过使用低层的API,你可以理解对称密码和非对称密码之间的区别,分组密码模式之间的区别以及填充方案,IV等等。你似乎不了解任何这些。也许这是你应该开始的地方。 –

回答

4

简短的回答:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

Long Answer

+0

在我的情况下,当它应该是cipher.doFinal时,我正在调用cipher.update。 – user1811107

5

另一个 '简答题',但我相信AES-GCM是更安全的是CBC模式,并出现了几年然而,如果您想要在Android中使用,则需要包含spongycastle

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
0

这是我做的:

keyGenerator.init(new 
       KeyGenParameterSpec.Builder(KEY_NAME, 
       KeyProperties.PURPOSE_ENCRYPT | 
         KeyProperties.PURPOSE_DECRYPT) 
       .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
       .setUserAuthenticationRequired(true) 
       .setEncryptionPaddings(
         KeyProperties.ENCRYPTION_PADDING_PKCS7) 
       .build()); 

cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);