Andorid利用Keystore进行 AES,RSA生成加解密,生成证书CSR文件

安卓密钥库系统

1. AES

  • 1.1 生成AES并保存至KeyStore
    private static final String ANDROID_KEY_STORE = "AndroidKeyStore";
    private static final String KEY_ALIAS         = "PqSawSecret";

    private static SecretKey createKeyStoreEntry() {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
            KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(
            KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                    .build();
            keyGenerator.init(keyGenParameterSpec);
            return keyGenerator.generateKey();
        } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
            throw new AssertionError(e);
        }
    }
  • 1.2 AES 加密
    private static final String CIPHER_TRANSFORMATION = "RSA/ECB/PKCS1Padding";
 /**
     * 加密
     *
     * @param data 要加密的数据
     * @param alias KeyStore中的别名
     * */
    public byte[] encrypt(byte[] data, String alias){
        try {
            //取出密钥
 			 KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry) keyStore.getEntry(KEY_ALIAS, null);
 			 SecretKey secretKey=entry.getSecretKey()
        	 Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
     		 cipher.init(Cipher.ENCRYPT_MODE, secretKey);
     		 byte[] iv   = cipher.getIV();
     		 byte[] data = cipher.doFinal(data);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  • 1.3 AES解密
      		//取出密钥
 			 KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry) keyStore.getEntry(KEY_ALIAS, null);
 			 SecretKey secretKey=entry.getSecretKey()
        	 Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
     		 cipher.init(Cipher.DECRYPT_MODE, secretKey, new GCMParameterSpec(128, iv));
			 cipher.doFinal(data)

RSA

  • 1.1 老版方法
 fun generateRSA() {
        val endDate = Calendar.getInstance()
        endDate.add(Calendar.YEAR, 10)
        val build = KeyPairGeneratorSpec.Builder(appContext)
            .setAlias("rsa")
            .setStartDate(Calendar.getInstance().time)
            .setSerialNumber(BigInteger.ONE)
            .setEndDate(endDate.time)
            .build()
        val instance =
            KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        instance.initialize(build)
        val generateKey = instance.generateKeyPair()
        val str = "need 加密 123.abc"
        val public = generateKey.public
        val privateKey = generateKey.private
        val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
        cipher.init(Cipher.ENCRYPT_MODE, public)
        //公钥 加密的字符字节数组
        val encodeByte = cipher.doFinal(str.toByteArray())
        //base64 加密字节数组 后的字符串
        val encodeStr = String(Base64.encode(encodeByte, Base64.NO_WRAP))
        Log.w("Debug", "RSATest-generateRSA:encodeStr $encodeStr ")
        cipher.init(Cipher.DECRYPT_MODE, privateKey)
        //将base64后的加密字符,转为加密后字节数组
        val decodeByte = Base64.decode(encodeStr, Base64.NO_WRAP)
        //私钥 解密加密字节数组
        val decodeStr = cipher.doFinal(decodeByte)
        Log.w("Debug", "RSATest-generateRSA:encodeStr ${String(decodeStr)} ")
    }
  • 1.2 新版方法
fun generateKey() {
        val spec = KeyGenParameterSpec.Builder(
            keyName,
            KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
        )
            .setDigests(KeyProperties.DIGEST_SHA256)
            .setKeySize(2048)
            .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
            .build()
        val pkg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, KEYSTORE)
        pkg.initialize(spec)
        val genKeyPair = pkg.generateKeyPair()
        Log.w(
            "Debug",
            "RSA-generateKey: public ${String(
                Base64.encode(
                    genKeyPair.public.encoded,
                    Base64.NO_WRAP
                )
            )}"
        )
        val cipher =
            Cipher.getInstance("RSA/ECB/PKCS1Padding")
        cipher.init(Cipher.ENCRYPT_MODE, genKeyPair.public)
        val encode = cipher.doFinal(str)
        cipher.init(Cipher.DECRYPT_MODE, genKeyPair.private)
        val doFinal = cipher.doFinal(encode)
        Log.w("Debug", "RSA-generateKey:${String(doFinal)} ")
    }

生成CSR

导包

implementation group: ‘org.bouncycastle’, name: ‘bcpkix-jdk15on’, version: ‘1.62’

@RunWith(AndroidJUnit4.class)
public class CSR {
    byte[] bytes = "need 加密 123.abc".getBytes();
    @Test
    public void generate() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, OperatorCreationException, IOException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        Log.w("Debug", "CSR-generate: pub key: "+toBase64(publicKey.getEncoded()));
        Log.w("Debug", "CSR-generate: pri key: "+toBase64(privateKey.getEncoded()));
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE,publicKey);
        byte[] encodeBytes = cipher.doFinal(this.bytes);
        cipher.init(Cipher.DECRYPT_MODE,privateKey);
        byte[] decodeBytes = cipher.doFinal(encodeBytes);
        Log.w("Debug", "CSR-generate: "+new String(decodeBytes));

        // 证书签名算法
        String sigAlg = "SHA256withRSA";
        // 各种基本信息
        String params = "CN=test,C=CN";
        PKCS10CertificationRequestBuilder builder = new JcaPKCS10CertificationRequestBuilder(
                new X500Name(params), publicKey
        );
        // 签名算法
        JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder(sigAlg);
        csBuilder.setProvider(new BouncyCastleProvider());
        ContentSigner signer = csBuilder.build(keyPair.getPrivate());
        PKCS10CertificationRequest p10 = builder.build(signer);
        PemObject pemObject = new PemObject("CERTIFICATE REQUEST", p10.getEncoded());
        StringWriter str = new StringWriter();
        JcaPEMWriter jcaPEMWriter = new JcaPEMWriter(str);
        jcaPEMWriter.writeObject(pemObject);
        jcaPEMWriter.close();
        str.close();
        Log.w("Debug", "CSR-generate:  "+str);
    }

    private String toBase64(byte[] bytes){
        return new String(Base64.encode(bytes,Base64.NO_WRAP));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想了解如何在 Android 平台上使用 Java 进行 RSA 加密。RSA 是一种非对称加密算法,它可以用于数据的加密和数字签名等场景。 首先,你需要生成一对 RSA 密钥,包括公钥和私钥。可以使用 Java 提供的 KeyPairGenerator 类来生成密钥对。示例代码如下: ```java KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // 密钥长度为 2048 位 KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); ``` 接下来,你可以使用公钥对数据进行加密,使用私钥对加密后的数据进行解密。示例代码如下: ```java // 加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedData = cipher.doFinal(plainText.getBytes("UTF-8")); // 解密 cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedData = cipher.doFinal(encryptedData); String decryptedText = new String(decryptedData, "UTF-8"); ``` 这里的 plainText 是要加密的明文数据,可以是任意字符串。加密后得到的 encryptedData 是一个字节数组,可以进行传输或保存。解密时需要使用同一对密钥进行解密,得到的 decryptedText 就是原始的明文数据。 需要注意的是,RSA 加密算法的运算速度较慢,适合加密较小的数据。如果需要加密大量数据,可以考虑使用对称加密算法,如 AES 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值