当前位置: 首页 > 编程笔记 >

获取Android签名证书的公钥和私钥的简单实例

艾俊悟
2023-03-14
本文向大家介绍获取Android签名证书的公钥和私钥的简单实例,包括了获取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;

  }

}

以上这篇获取Android签名证书的公钥和私钥的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Android 获取签名公钥和公钥私钥加解密的方法(推荐),包括了Android 获取签名公钥和公钥私钥加解密的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Android 获取签名公钥和公钥私钥加解密的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我正在寻找一个Java库或代码来即时生成证书,公共和私有密钥,而无需使用第三方程序(例如openssl)。 我认为是从Java代码中获取keytool + openssl的东西。 考虑使用ssl和客户端身份验证保护的基于Java servlet的Web应用程序。我希望Servlet容器仅在请求时使用Java代码生成客户端证书(例如pkcs12格式)。 问题答案: 您可以使用一对或密钥在

  • 问题内容: 我正在做。 我使用keytool创建了CSR,该工具已向密钥库添加了私钥, 收到基于CSR的证书,将证书转换为DER格式,并将证书作为trustcacerts导入密钥库 签名证书在证书路径中具有根/中间证书 在将根证书和中间证书转换为DER格式后,我还在受信任的根证书下安装了IE的根证书和中间证书。 使用https时,浏览器显示证书错误,并将该证书视为自签名证书。 题 这是否意味着由于

  • 另外,这里还有一个函数演示,它从mod和指数生成PEM(摘自http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js) 前面提到的jsonwebtoken库可以使用任何一种方法来验证JWT--但是为什么呢?如果这两种验证方法都可以验证一个JWT签名,为什么它们都存在呢?他们之间有什么权衡?一个比另一个更安全吗?我应该使用哪一

  • 我正在执行。 我使用keytool创建了CSR,keytool在密钥库中添加了私钥, 签名的证书在证书路径中具有根/中间证书 我还在将根证书转换为DER格式后,在可信根证书下的IE中安装了根证书和中间证书。 使用https时,浏览器会显示证书错误,并将该证书视为自签名证书。 如果过程中有什么不对的地方,请建议。添加用于此操作的keytool命令。 已创建密钥存储区 keytool-keystore

  • 我目前正在尝试在我的android应用程序中实现ECDH算法。但我面临一个问题,我想将私钥和公钥存储在Android密钥库中。然而,为了实现这一点,我需要为我的密钥对获取证书。这就是我被困的地方。 我无法获得Android密钥库允许使用的正确证书。 这是我如何生成密钥(精简版) 对于证书,我尝试了这个(使用SHA256WitECDSA) 这很容易理解,因为jcacontsignerbuilder算