从Base64编码字符串

问题描述:

的前10个字符生成密钥比方说,我有一个Base64编码字符串:从Base64编码字符串

data = AOUTl5C2QV2xFRPlzKR0Ag== 

我想生成该Base64编码字符串的前10个字符中的Java(Android版)密钥然后将其用于AES解密从服务器发送的消息。要做到这一点,我用下面的代码:

String firstTen = data.substring(0, 10); 
byte[] decodedBytes = Base64.decode(firstTen, Base64.DEFAULT); 
SecretKeySpec key = new SecretKeySpec(decodedBytes, "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.DECRYPT_MODE, key); 
byte[] original = cipher.doFinal(Message_to_Decrypt, Base64.DEFAULT)); 

但我可以一Java.security.Exception:

java.security.InvalidKeyException: Key length not 128/192/256 bits. 

有没有一种方法,我可以得到一个有效的密钥,我可以使用从Base64String的前10个字符进行AES解密?

+0

Base64是什么类?在java.util.Base64或org.apache.commons.codec.binary.Base64中没有Base64.DEFAULT。 – gfelisberto

+0

我在Android中执行此操作 – Gravity

+0

developer.android.com/reference/android/util/Base64.html – Gravity

用散列函数或更好的PBKDF2(基于密码的密钥推导函数2)扩展10个字符。

您确实需要提供预期长度的密钥,AES密钥长度可以是128,192或256个字节。虽然某些AED实现可能无效,但密钥不依赖于此,它不是标准的一部分。

+0

谢谢我会研究一下 – Gravity

+0

其实你可能会指出一个PBKDF2的例子吗? – Gravity

+1

Google“Java PBKDF2”。 PBKDF1 [文档](https://en.wikipedia.org/wiki/PBKDF2)。 – zaph

错误消息说:密钥长度不是128/192/256位。

您正在使用10个字符,每个字符都是8位。所以10 * 8 = 80。试用16个字符(128/8 = 16)。

+0

但我没有16个字符,是否有一个参数可以通过,以便它会自动扩展到16个字符,我被告知只需要使用前10个字符 – Gravity

+2

您试图解密某些已经加密,所以你不能为密钥制定规则。如果他们在填充密钥或其他内容,您可能需要检查谁在进行加密。 – gfelisberto