message

Android N

Didn't find class "org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl"

Android P

NoSuchAlgorithmException: class configured for SecureRandom (provider: Crypto) cannot be found

解决办法

// android n

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

// android version < n

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto");

public final class CryptoProvider extends Provider {

/**

* Creates a Provider and puts parameters

*/

public CryptoProvider() {

super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");

put("SecureRandom.SHA1PRNG",

"org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");

put("SecureRandom.SHA1PRNG ImplementedIn", "Software");

}}

但是这个在android P上会收到第二个异常信息,因为在android P上google已经移除了相关类

但是google也给出了适配方案,这里记录下:

这里给出适配之后Utils

public class AESUtils {

private final static String SHA1_PRNG = "SHA1PRNG";

private static final int KEY_SIZE = 32;

/**

* Aes加密/解密

*

* @param content 字符串

* @param password 密钥

* @param type 加密:{@link Cipher#ENCRYPT_MODE},解密:{@link Cipher#DECRYPT_MODE}

* @return 加密/解密结果字符串

*/

@SuppressLint({"DeletedProvider", "GetInstance"})

public static String des(String content, String password, @AESType int type) {

if (TextUtils.isEmpty(content) || TextUtils.isEmpty(password)) {

return null;

}

try {

SecretKeySpec secretKeySpec;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

secretKeySpec = deriveKeyInsecurely(password);

} else {

secretKeySpec = fixSmallVersion(password);

}

Cipher cipher = Cipher.getInstance("AES");

cipher.init(type, secretKeySpec);

if (type == Cipher.ENCRYPT_MODE) {

byte[] byteContent = content.getBytes("utf-8");

return parseByte2HexStr(cipher.doFinal(byteContent));

} else {

byte[] byteContent = parseHexStr2Byte(content);

return new String(cipher.doFinal(byteContent));

}

} catch (NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException |

UnsupportedEncodingException | InvalidKeyException | NoSuchPaddingException |

NoSuchProviderException e) {

e.printStackTrace();

}

return null;

}

@SuppressLint("DeletedProvider")

private static SecretKeySpec fixSmallVersion(String password) throws NoSuchAlgorithmException, NoSuchProviderException {

KeyGenerator generator = KeyGenerator.getInstance("AES");

SecureRandom secureRandom;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

secureRandom = SecureRandom.getInstance(SHA1_PRNG, new CryptoProvider());

} else {

secureRandom = SecureRandom.getInstance(SHA1_PRNG, "Crypto");

}

secureRandom.setSeed(password.getBytes());

generator.init(128, secureRandom);

byte[] enCodeFormat = generator.generateKey().getEncoded();

return new SecretKeySpec(enCodeFormat, "AES");

}

private static SecretKeySpec deriveKeyInsecurely(String password) {

byte[] passwordBytes = password.getBytes(StandardCharsets.US_ASCII);

return new SecretKeySpec(InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(passwordBytes, AESUtils.KEY_SIZE), "AES");

}

private static String parseByte2HexStr(byte buf[]) {

StringBuilder sb = new StringBuilder();

for (byte b : buf) {

String hex = Integer.toHexString(b & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

private static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1) return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

@IntDef({Cipher.ENCRYPT_MODE, Cipher.DECRYPT_MODE})

@interface AESType {

}

private static final class CryptoProvider extends Provider {

CryptoProvider() {

super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");

put("SecureRandom.SHA1PRNG", "org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");

put("SecureRandom.SHA1PRNG ImplementedIn", "Software");

}

}

}

InsecureSHA1PRNGKeyDerivator类太多了,这里就不贴了,可以去InsecureSHA1PRNGKeyDerivator

下载,如果官网链接不上可以去github下载

android n AES加密,AndroidP AES 加密适配相关推荐

  1. 【Android工具】DES终结者加密时报——AES加密演算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...

  2. aes sample java,python-AES加密java解密

    我有超过1000个图像和视频需要加密.没什么比这更简单的了,我想用AES,但我搞不懂如何在我的电脑上加密,然后在设备上解密.在 我会用python加密我电脑上的所有项目.然后以随需应变的方式用java ...

  3. SpringBoot+Vue中使用AES进行加解密(加密模式等对照关系)

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客 在上面搭建起来前后端架构之后,在前后端分别进行AES方式的 ...

  4. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  5. python aes加密 cbc_Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda...

    1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...

  6. WebSocket数据加密——AES与RSA混合加密

    前言 之前在写"一套简单的web即时通讯",写到第三版的时候没什么思路,正好微信公众号看到一篇讲API交互加密,于是就自己搞了一套AES与RSA混合加密,无意中产生应用在WebSo ...

  7. aes密文长度_RSA加密密文可变(一句话说明)

    先来看一个搜索结果: RSA算法本质上是基于数学[对极大整数做因数分解的难度]的原理,so 密文本质上是一堆有规则的数字经过编码和[填充]的结果. 原文和加密密钥相同,在java环境,默认Paddin ...

  8. aes 加密_结合RSA与AES实现前后端加密通信

    结合RSA与AES实现前后端加密通信 一.思路 使用RSA秘钥生成工具生成一对公钥(A)和私钥(B),前端保留A,后端保留B. 前端发送数据时,先生成一串随机16位字符串作为AES的秘钥(C),然后使 ...

  9. aes key长度_AES加密(1): 基本AES算法

    简介 AES原本指的是一套标准FIPS 197,而AES算法一般指分组大小为128bits的Rijndeal算法,由比利时学者Joan Daemen和Vincent Rijmen提出. AES与Rij ...

最新文章

  1. python大学课程-利用python完成大学刷课(从0到完成的思路)
  2. 不平等博弈问题学习记录(二)(对于超实数在博弈下左右相等的扩充)
  3. 洛谷——P1051 谁拿了最多奖学金
  4. 软考解析:2014年下半年下午试题
  5. 27.课时27.【Django模板】for标签使用详解(Av61533158,P27)
  6. list转数组array[]
  7. JSP Cookie 处理
  8. python百度云安装包_phython爬全百度评价_python安装包百度云
  9. CRC校验 与 模2运算
  10. Web开发常用代码:背投广告
  11. 深度学习 轻量级卷积神经网络设计综述
  12. ios备忘录下载安卓版_苹果备忘录app下载
  13. 数据地图在商业数据分析中的5种应用
  14. wsimport生成客户端java代码
  15. SMB Signing not required漏洞修复方法
  16. JAVA视频网盘分享
  17. RSA分段加密/解密 nodejs 和java联调
  18. UVa 12627 Erratic Expansion - 分治
  19. vscode:格式化json
  20. 电源控制软件(VB版本)展示与说明

热门文章

  1. c++:opencv读图后mat矩阵的基本操作
  2. Spring MVC 全注解配置 (十一)
  3. C#操作NPOI插件的HSSFWorkBook,常见的那些坑
  4. codevs 1147 排座椅
  5. 【hdoj_1398】SquareCoins(母函数)
  6. 百度地图 IOS版开发经验分享
  7. C#中格式化数据的输出
  8. python中dict和list排序
  9. [概统]本科二年级 概率论与数理统计 第四讲 连续型随机变量
  10. 初次尝试使用IDAPro修改程序控制流程