日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android n AES加密,AndroidP AES 加密适配

發布時間:2025/4/5 Android 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android n AES加密,AndroidP AES 加密适配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 加密适配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。