博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android N手机AES加密提示no such provider: Crypto
阅读量:2356 次
发布时间:2019-05-10

本文共 2141 字,大约阅读时间需要 7 分钟。

原先的AES加密代码:

1public static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
2        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 3        Cipher cipher = Cipher.getInstance("AES"); 4        cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 5        byte[] encrypted = cipher.doFinal(clear); 6        return encrypted; 7    } 8 9    public static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
10        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 11        Cipher cipher = Cipher.getInstance("AES"); 12        cipher.init(Cipher.DECRYPT_MODE, skeySpec); 13        byte[] decrypted = cipher.doFinal(encrypted); 14        return decrypted; 15    } 16 17    public static byte[] getRawKey(byte[] seed) throws Exception {
18        KeyGenerator kgen = KeyGenerator.getInstance("AES"); 19        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); 20        sr.setSeed(seed); 21        kgen.init(128, sr); 22        SecretKey skey = kgen.generateKey(); 23        byte[] raw = skey.getEncoded(); 24        return raw; 25    }

一切正常的在Android 4.3-6.1的手机上加解密,但是我用 LGE Nexus 5X (7.1.1 API 25)上发现在Android N上 google去掉了Crypto provider,意味着我们将不能继续像上面那样对数据加密填充。当然,在studio里的Logcat里会提示前往关于Android N对Crypto的解决方案:

解决方案:

将这句代码SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");

换成

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG",new CryptoProvider());

CryptoProvider 是继承Provider的自定义的一个类。

1import java.security.Provider;  2/**  3 * Implementation of Provider for SecureRandom. The implementation     supports the  4 * "SHA1PRNG" algorithm described in JavaTM Cryptography Architecture, API  5 * Specification & Reference  6*/  7public final class CryptoProvider extends Provider {
8    /** 9 * Creates a Provider and puts parameters 10 */ 11public CryptoProvider() {
12    super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)"); 13    put("SecureRandom.SHA1PRNG", 14            "org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl"); 15    put("SecureRandom.SHA1PRNG ImplementedIn", "Software"); 16}

                        喜欢 就关注吧,欢迎投稿!

640?wx_fmt=jpeg

转载地址:http://jfdtb.baihongyu.com/

你可能感兴趣的文章
算法-最长递增子序列
查看>>
最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
查看>>
回文字符序列
查看>>
inline函数必须在头文件中定义吗?
查看>>
内存泄漏检查工具valgrind使用方法
查看>>
Solution of Codility
查看>>
java解析XML的四种方式及比较
查看>>
单例模式(java)详细
查看>>
策略模式(java)
查看>>
java线程中信号量Semaphore类的应用
查看>>
如何设置CentOS为中文显示
查看>>
Nginx配置
查看>>
php-fpm配置
查看>>
Centos 系统时间与当前时间相差和时区解决办法
查看>>
Linux下如何进行FTP设置
查看>>
linux之LVM操作案例
查看>>
由于CentOS的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题。
查看>>
php中抽象类和接口的概念与区别
查看>>
php抽象类和接口
查看>>
如何在linux CentOS 上安装chrome 谷歌浏览器
查看>>