获取Android签名证书的公钥和私钥的简单实例
作者:jingxian 发布时间:2022-10-02 22:20:13
标签:公钥,私钥,签名,android
本文以Android签名JKS格式的证书为例:
package com.test;
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
public class SignTest {
public static void main(String[] args) {
try {
// 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
FileInputStream fis2 = new FileInputStream("G:\\shanhytest.keystore");
KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
char[] kspwd = "shanhytest".toCharArray(); // 证书库密码
char[] keypwd = "shanhytest".toCharArray(); // 证书密码
String alias = "shanhytest";// 别名
ks.load(fis2, kspwd); // 加载证书
PrivateKey privateKey = (PrivateKey) ks.getKey(alias, keypwd); // 获取证书私钥
PublicKey publicKey = ks.getCertificate(alias).getPublicKey();// 获取证书公钥
fis2.close();
System.out.println("privateKey = " + getKeyString(privateKey));
System.out.println("publicKey = " + getKeyString(publicKey));
// 测试加密解密字符串
String srcContent = "今天天气不错。";
// 将字符串使用公钥加密后,再用私钥解密后,验证是否能正常还原。
// 因为非对称加密算法适合对小数据量的数据进行加密和解密,而且性能比较差,所以在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
byte[] d1 = crypt(publicKey, srcContent.getBytes(), Cipher.ENCRYPT_MODE);
byte[] d2 = crypt(privateKey, d1, Cipher.DECRYPT_MODE);
System.out.println(new String(d2));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将KEY转换为字符串
*
* @param key
* @return
* @author SHANHY
*/
private static String getKeyString(Key key) {
byte[] keyBytes = key.getEncoded();
String s = new String(org.apache.commons.codec.binary.Base64.encodeBase64(keyBytes));
return s;
}
/**
* 加密/解密
*
* @param key
* 私钥打包成byte[]形式
* @param data
* 要解密的数据
* @param opmode
* 操作类型(Cipher.DECRYPT_MODE为解密,Cipher.ENCRYPT_MODE为加密)
* @return 解密数据
*/
public static byte[] crypt(Key key, byte[] data, int opmode) {
try {
long startTime = System.currentTimeMillis();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//jdk默认标准
// Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");// android默认标准
cipher.init(opmode, key);
byte[] result = cipher.doFinal(data);
System.out.println((Cipher.DECRYPT_MODE==opmode?"解密":"加密") + "耗时:" + (System.currentTimeMillis() - startTime));
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}


猜你喜欢
- 在前面讲到了《基于任务的异步编程模式(TAP)》,但是如果调用异步方法,没有等待,那么调用异步方法的线程中使用传统的try/catch块是不
- 引入所谓泛型,就是创建一个函数,对所有数据类型都生效。最常见的例子就是运算符,毕竟1+1=2,1.0+1.0=2.0,足以看出+是对多种数据
- 熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最
- 本文实例讲述了Android创建或升级数据库时执行的语句,如果是创建或升级数据库,请使用带List参数的构造方法,带SQL语句的构造方法将在
- 一、简述首先,Java 8引入了java.time.LocalDate来表示一个没有时间的日期。其次,使用Java 8版本,还需要更新jav
- 第一步:引入jar包 <dependency> <gro
- 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的
- 一、通过Java代码在setContentView之前执行:requestWindowFeature(Window.FEATURE_NO_T
- 很久以来都想研究一下利用java操作Excel的方法,今天没事,就稍微了解了一下,特总结一下。利用java操作Excel,有个开源的东东-j
- 本文实例讲述了C#线性渐变画刷LinearGradientBrush用法。分享给大家供大家参考。具体如下:using System;usin
- using System;using System.Collections.Generic;using System.Linq;using
- springboot和springmvc的区别spring boot 内嵌tomcat,Jetty和Undertow容器,可以直接运行起来,
- 前言在 App 开发过程中,ListView 是 比较很常见的控件,用来处理 列表类的数据展示。当然 Flutter 也是支持的,由于 Fl
- 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。通常对象之间的比较可以从两个方面去看:第一个方面:对象的地址是否
- 详细描述maven中央仓库发布jar包的中间过程, 以及遇到的一些问题汇总, 尽量用文字描述清楚, 耐心看下去, 就一定会发布成功----S
- LayoutInflater.inflate源码详解LayoutInflater的inflate方法相信大家都不陌生,在Fragment的o
- Process#waitFor()阻塞问题有时需要在程序中调用可执行程序或脚本命令:Process process = Runtime.ge
- 前言本文主要介绍了关于android实现一键锁屏和一键卸载的相关内容,分享出来供大家参考学习,这两个功能也是大家在开发中会遇到的两个需求,下
- 本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下1.controller /**  
- 本文实例讲述了java生成XML的方法。分享给大家供大家参考,具体如下:下拉框的生成,我是通过javascript读取xml文件生成的。Xm