android 开发解密是出现pad block corrupted 错误

情景:在虚拟机上运行正常的,但是到我的真机上就解密失败,出现pad block corrupted  ,据说是版本原因:我机器是小米3 最新版的android  4.2

出现问题的代码:

private static byte[] getRawKey(byte[] seed) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        //SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");   //之前代码
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");  //修改之后的代码
        sr.setSeed(seed);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

下面附上改加密解密类的全部代码:

package com.example.qurenwu.qurenwu_2.util;

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * AES加密器
 * @author Eric_Ni
 *
 */
public class AESEncryptor {
    /**
     * AES加密
     */
    public static String encrypt(String seed, String cleartext) throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] result = encrypt(rawKey, cleartext.getBytes());
        return toHex(result);
    }

    /**
     * AES解密
     */
    public static String decrypt(String seed, String encrypted) throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = toByte(encrypted);
        byte[] result = decrypt(rawKey, enc);
        return new String(result);
    }

    private static byte[] getRawKey(byte[] seed) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        //SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");
        sr.setSeed(seed);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

    /**
     * 加密
     * @param raw
     * @param clear
     * @return
     * @throws Exception
     */
    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);
        return encrypted;
    }

    /**
     * 解密
     * @param raw
     * @param encrypted
     * @return
     * @throws Exception
     */
    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }

    public static String toHex(String txt) {
        return toHex(txt.getBytes());
    }
    public static String fromHex(String hex) {
        return new String(toByte(hex));
    }

    public static byte[] toByte(String hexString) {
        int len = hexString.length()/2;
        byte[] result = new byte[len];
        for (int i = 0; i < len; i++)
            result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
        return result;
    }

    public static String toHex(byte[] buf) {
        if (buf == null)
            return "";
        StringBuffer result = new StringBuffer(2*buf.length);
        for (int i = 0; i < buf.length; i++) {
            appendHex(result, buf[i]);
        }
        return result.toString();
    }
    private final static String HEX = "0123456789ABCDEF";
    private static void appendHex(StringBuffer sb, byte b) {
        sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
    }
}

调用方法:

password = AESEncryptor.decrypt(AES_SEED, password);  // AES_SEED是种子码,我也不清楚具体什么作用,反正可以随自己定义
时间: 2024-11-02 12:56:56

android 开发解密是出现pad block corrupted 错误的相关文章

左右 android AES 所述机器的一部分 javax.crypto.BadPaddingException: pad block corrupted

好多人 android 使用上述 AES 显现 javax.crypto.BadPaddingException: pad block corrupted 下面的代码发布没问题,比较自己.不解释! public static class cryptogram{ public static String encrypt(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getBytes(

关于 android AES 部分机器 javax.crypto.BadPaddingException: pad block corrupted

很多人 android 上面使用 AES 出现 javax.crypto.BadPaddingException: pad block corrupted 下面贴出没有问题的代码,自己对照,不做解释! public static class cryptogram{ public static String encrypt(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getByte

android开发中常犯的几个错误整理

新手程序猿,在开发中难免会犯各种各样的错误,以下是整理的一些android开发中常见的错误,一起来看看吧. 1.避免将多个类放在一个文件夹里面,除非是一次性使用的内部类. 就是一个文件,最好给分它同名的主类. 2.一个方法的代码长度最好不要超过35行 就是我们这个方法,别把它写的太长, 像是翻了几行的方法,要么拆分成几个方法,把里面很多公用的方法拿出来放在另外一个函数里,要不重构. 3.原则上,尽量不要手工的修改机器产生的代码 比方说,android项目中的R.java类 还有自动生成的类,也不

android 上AES解密是报错javax.crypto.BadPaddingException: pad block corrupted

网上看到两种方法: 1.SecretKeySpec skeySpec = new SecretKeySpec(getRawKey(key), "AES"); private static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInsta

android加密解密完美教程

常用加密算法:DES.3DES.RC4.AES,RSA等; 加密模式:ECB.CBC.CFB.OFB等; 填充模式:NoPadding.PKCS1Padding.PKCS5Padding.PKCS7Padding 一.实例教程 Android 加密解密 http://www.eoeandroid.com/thread-66236-1-1.html http://www.apihome.cn/api/java/SecretKeySpec.html Android 加密解密字符串 http://ww

Android开发在路上:少去踩坑,多走捷径【转】

作者:gzjay,腾讯MIG无线产品部 高级工程师 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2.目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行upd

Android开发之发送邮件功能的实现(源代码分享)

Android开发中可能会碰到如何发送邮件的困扰,之前我也查了相关的文档,博友们也分享了不少的发送邮件的办法,总共有3种把,我仔细阅读了下,发现有的讲的太过复杂跟麻烦,不够清晰,我今天就来分享下我认为的最好用的办法来解决该问题,使用Andorid-MAIL Jar包.首先我们先要下载以下四个文件 然后呢在Android平台上发送邮件呢,肯定先要检查网络的状态,网络状态可用的情况下才能发送邮件成功啊(别往了获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. ) publ

Android开发之裁剪照片

请尊重他人的劳动成果,转载请注明出处:Android开发之裁剪照片 1.   从相册选择照片进行裁剪 从相册选择照片并裁剪: /** * 从相册选择照片进行裁剪 */ private void cropFromGallery() { // TODO Auto-generated method stub Intent intent=new Intent(); intent.setAction(Intent.ACTION_PICK);//Pick an item from the data inte

C#程序员学习Android开发系列之ListView

上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如何在ListView中按照我们想要的界面效果进行展示.限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite. ListView是一个常用的数据显示控件,假设我们要做一个简单的界面,如图所示. 这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通