热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

获取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签名证书的公钥和私钥的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
author-avatar
MichaelZhu
互联网初创企业,海外项目
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有