java.security.InvalidKeyException: Key length not 128/192/256 bits.
2015-12-22 13:49
405 查看
原理:在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID。而有些设备生成的数字为15位,是由于转化为16进制字符串的时候,去掉了前面的0。(如:部分魅族手机,获取的的设备号应该为“07129c5323b07a5f” ,可是使用代码获取的时候却省略了前面的0只得到了“7129c5323b07a5f”)。
原因分析:问题出现在获取android设备号时,android设备号不为16位字符串,只获取到了15位字符串,导致使用aes加密时出现InvalidKeyException异常。
解决方法:只要把获取到的16进制字符串的android_id转化为十进制,然后再把得到的数字转化为16进制,即可得到正确的android_id。
原因分析:问题出现在获取android设备号时,android设备号不为16位字符串,只获取到了15位字符串,导致使用aes加密时出现InvalidKeyException异常。
byte[] key1 = AndroidUtility.getAndroidId(mContext).getBytes(); byte[] aesbyte = aes.encode(lpv.getPassword().toString().getBytes(), key1);
解决方法:只要把获取到的16进制字符串的android_id转化为十进制,然后再把得到的数字转化为16进制,即可得到正确的android_id。
public static String getAndroidId(Context context) throws Exception { if (StringUtils.isEmpty(SECRET_ID)) { SECRET_ID = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); Log.e("========android_ID===========", SECRET_ID); if (SECRET_ID.length() < 16) { long i1 = Long.valueOf(SECRET_ID, 16); SECRET_ID = String.format("%016x", i1); } } if (SECRET_ID.length() > 16) { Log.e("========android_ID===Error========", SECRET_ID); throw new Exception("ErrorAndroidID"); } return SECRET_ID; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories