0
我想内置使用以该顺序这个元素的字节的数组:初始化向量异常
- 对称加密的AES密钥(与AES 128随机密钥,随机初始化向量用于AES加密128.在CBC模式和PKCS5填充。加密前的文本在UTF-8编纂)
- AES IV使用AES 128
- 加密消息(使用ECB模式和PKCS1填充,RSA算法以前生成的密钥和公共密钥消息接收者)
我正在做的是获取每个参数的长度,以创建新的字节[]。然后在for循环中,我尝试按顺序添加三个元素。
public void encrypt(String original)
{
SecureRandom sr = new SecureRandom();
byte [] key = new byte[16];
byte [] iv = new byte[16];
sr.nextBytes(key);
sr.nextBytes(iv);
Cipher cipher;
try
{
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec IV=new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), IV);
byte[] utf8 = original.getBytes("UTF-8");
byte []encryptedAES = cipher.doFinal(utf8);
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(128);//128 bits
KeyPair kp = kpg.genKeyPair();
Cipher publicKeyCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
publicKeyCipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
byte [] encryptedRSA = publicKeyCipher.doFinal(encryptedAES); //error here
int length1=encryptedAES.length;
int length2=IV.getIV().length;
int length3=encryptedRSA.length;
int length=length1+length2+length3;
byte [] result= new byte[length];
int l=0,m=0;
for (int i=0; i<length; i++)
{
if(i<length1)
{
result[i] = encryptedAES[i];
}
else if(i>=length1 && i<length2)
{
result[i] = IV.getIV()[l];
l++;
}
else if(i>=length2)
{
result[i] = encryptedRSA[m];
m++;
}
}
Log.i("Encrypted", "done");
this.encryptedMessage=Base64.encodeToString(result, false);
Log.i("Encrypted Message:", this.encryptedMessage);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
而且,我得到的例外是:
java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
谢谢@Quanturium,你说得对,我应该用字节而不是位来表达它。将检查它是否有效,并让你知道。谢谢! – civiac 2013-03-13 11:40:06
如果它解决了您的问题,您能否将此主题设置为固定? – Quanturium 2013-03-16 00:40:35
嗨@Quanturium,现在我得到一个新的例外。你可以好好看看吗?我编辑了我的问题 – civiac 2013-03-26 22:07:06