1. 程式人生 > >java.security.InvalidKeyException: Key length not 128/192/256 bits.

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

原理:在裝置首次啟動時,系統會隨機生成一個64位的數字,並把這個數字以16進位制字串的形式儲存下來,這個16進位制的字串就是ANDROID_ID。而有些裝置生成的數字為15位,是由於轉化為16進位制字串的時候,去掉了前面的0。(如:部分魅族手機,獲取的的裝置號應該為“07129c5323b07a5f” ,可是使用程式碼獲取的時候卻省略了前面的0只得到了“7129c5323b07a5f”)。

原因分析:問題出現在獲取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; }